コーヒー飲みの三日坊主

続かない一日一創。

Pyxelでランダムウォーク

f:id:tmdyshnr112:20190503020231g:plain

ランダムウォークの動きってずっと見てられる。
乱数設定である程度規則はあるかもしれないが、コンピュータが自由に動かしているのを垣間見ている感じがとても良い。

pyxelでなら割と簡単にランダムウォークのアニメーションが作れた。
初めは点を動かす状態からスタート。
それだけじゃ寂しいのでランダムウォークした軌跡を残すようにした。
簡単な方法がありそうだが、思いつかなかったので、毎回X座標とY座標をリストに保存しながら描画するようにした。
これだと続けていくと処理落ちしていきそうになるので、要素が30に達したら古い座標から削除するようにした。
すると、にょろにょろと縦横無尽に動き回るミドリムシに見えてきた。
頭の色を赤にすると、はらぺこあおむしみたい。

下がソースコード
もっと良い記述方法あれば誰か教えてほしい。。。

import pyxel
import random

class App:
    def __init__(self):
        pyxel.init(160, 120, fps=30, caption='Random Walk', scale=12)
        self.init()
        pyxel.run(self.update, self.draw)
    
    def init(self):
        # X座標とY座標の初期化
        self.x = pyxel.width / 2 - 1
        self.y = pyxel.height / 2 - 1
        # 体のX座標とY座標を入れるリストを初期化
        self.body_list = []

    def update(self):
        # 最新のX座標とY座標を一時的に入れておくリストを初期化
        # フレーム毎で初期化
        temp_list = []
        # X座標とY座標に乱数(-2, -1, 0, 1, 2)を足す
        self.x += random.randint(-2 ,2)
        self.y += random.randint(-2 ,2)
        # 画面内に制限
        if self.x < 0:
            self.x = 0
        if self.x > pyxel.width - 2:
            self.x = pyxel.width - 2
        if self.y < 0:
            self.y = 0
        if self.y > pyxel.width - 2:
            self.y = pyxel.width - 2
        # 一時的リストに追加
        temp_list.append(self.x)
        temp_list.append(self.y)
        # 一時的リストの要素を体の座標リストに追加
        self.body_list.append(temp_list)
        # 要素の数が30を超えたら、一番古い要素を削除
        if len(self.body_list) > 30:
            del self.body_list[0]


    def draw(self):
        pyxel.cls(0)
        # 体の座標リストからループ処理で描画
        for i in range(len(self.body_list)):
            pyxel.rect(self.body_list[i][0], self.body_list[i][1], self.body_list[i][0] + 1, self.body_list[i][1] + 1, 11)
        # 先頭を赤色にするために別で描画
        pyxel.rect(self.x, self.y, self.x + 1, self.y + 1, 8)
            
        # 先頭のX座標とY座標を表示
        pyxel.text(0, 0, "X:%f"%self.x, 7)
        pyxel.text(0, 6, "Y:%f"%self.y, 7)

App()