machiKaniaでマインスイーパー
再帰の展開をしてマインスイーパーを作りました。後の方に載せます。ソースコードはGithubにあげています。うまくカラー表示できてないけど。
以前C言語で作ったものの移植です。マインスイーパー自体は非常に簡潔なコードでかけますが、掘る作業で再帰を用いるのでこれではスタックが少ないマイコンだとオーバーフローするのでまた別にスタックを用意して呼び出します。
このため少々コードが煩雑になります。掘る作業について補足しましょう。
掘る座標(x、y)に対して
1、自身の座標を開きます。
2、再帰で自身の関数を呼び出して周辺8方向を開きます。
と実装するのですが、300以上再帰するのでダメです。過去に掘った情報は塗りつぶしアルゴリズムにおいて必須なのでこれをスタックに保管して処理をしましょう。なのでこうします。
1、開く最初の座標をプッシュします。
2、その周りの開けるところの座標をプッシュします
3、ポップして座標を開きます。
[c] LABEL DIG var x,y,i,a,b,z
x=ARGS(1) y=ARGS(2) i=0
t(i,0)=x t(i,1)=y
do x = t(i,0) y = t(i,1) if f(x,y) f(x,y)=f(x,y)+10 else i=i-1 if i endif
a = t(i,0) b = t(i,1)
if f(a,b)-10=(gosub(cflags,a,b)) then for x=a-1 to a+1 for y=b-1 to b+1 if gosub(isinfi,x,y) then if f(x,y) i = i+1 t(i,0) = x t(i,1) = y endif endif next next endif loop while i return [/c]
では。