ひまわりでラングトンのアリ
Cでどう書くのってツイートを見かけたのでひまわりで書きました。
黒いマスにアリがいた場合、90°右に方向転換し、そのマスの色を反転させ、1マス前進する。
ラングトンのアリ - Wikipedia
白いマスにアリがいた場合、90°左に方向転換し、そのマスの色を反転させ、1マス前進する。
母艦の、クリックした時は、はじめ。 待機する。 *はじめ タイマー解除。 アリXは、マウスX。 アリYは、マウスY。 アリ向きは、上。 *うごく 母艦の、(アリX,アリY)を、座標色取得。 もし、それが、$000000ならば、右に方向転換して白くする。 違えば、左に方向転換して黒くする。 母艦の、(アリX,アリY)へ、点描画。 進む。 0.01秒後に、うごくへ飛ぶ、タイマー設定。 待機する。 *右に方向転換して白くする アリ向きで、条件分岐。 上の時、アリ向きは、右。 右の時、アリ向きは、下。 下の時、アリ向きは、左。 左の時、アリ向きは、上。 ペン色は、白色。 母艦の、(アリX,アリY)へ、点描画。 戻る。 *左に方向転換して黒くする アリ向きで、条件分岐。 上の時、アリ向きは、左。 右の時、アリ向きは、上。 下の時、アリ向きは、右。 左の時、アリ向きは、下。 ペン色は、黒色。 母艦の、(アリX,アリY)へ、点描画。 戻る。 *進む アリ向きで、条件分岐。 上の時、アリYは、アリY-1。 右の時、アリXは、アリX+1。 下の時、アリYは、アリY+1。 左の時、アリXは、アリX-1。 戻る。
・・・まどろっこしい。普段こんな物書きません。
母艦の、クリックした時=init 待機 *init タイマー解除 x=マウスX y=マウスY angle=0 *move 母艦の、(x,y)を、座標色取得 もし、それ=$000000ならば、( angle=(angle+1)%4 ペン色=白色 ) 違えば、( angle=(angle+3)%4 ペン色=黒色 ) 母艦の、(x,y)へ、点描画 もし、angle%2=0ならば、y=y+angle-1 違えば、x=x-angle+2 タイマー設定(0.01, move) 待機
考えてみればこの括弧も匿名関数の一種か。引数取れないけど。
よくある質問
- 母艦ってなに
- メインフォーム。
- それってなに
- それだよ、それ。Perlの$_が近いみたい。
- 座標色取得と点描画はなんでタイマー設定みたいに書けないの
- 座標を(x,y)で書くようにしたせいかパースにこけるのよ。
- \$\d+ってなに
- 整数リテラルの16進表記。
- 白色・黒色って定数でしょ?色調べる時に使えばいいのに
- 白色・黒色が#nnnnnnという文字列だと知るまではそう思ってました。
- ^[**].+ってなに
- ラベル。関数っぽい機能あるけどラベルなのでreturn必須。
- じゃあ待機ってなに
- ラベルということを思い出させてくれるあんちくしょう。
- 文字列リテラルはかぎ括弧で囲むと聞いたんだけど、上下左右なんなの
- 未定義の識別子は文字列リテラルになるとでも思ってください。
- 全部グローバル変数とか生きていけない
- 変数名の配列をローカル変数って命令に渡せば幸せになるんじゃないかな。