チェス盤ゲーム問題(1)のプログラムを紹介します。
Tiny Basicで記述しています。
' << GM511.bas >> ' Tiny Basicで記述。 ' 図形配置ゲーム ' Dim A(20,20): ' m×n方眼紙を表す配列:0は未被覆、 ' 1はあなたが被覆済、-1はコンピュータが被覆済。 Dim B(20,20): ' 作業用配列。 ' ' 内蔵時計を使って乱数の初期値を設定。 Randomize ' ' 方眼紙のサイズを決める。 Do Print"方眼紙のサイズを決めてください" Input"行数mの値(3-20[9]):";M0$ If M0$ = "" Then M0=9 Else M0=Val(M0$) Input"列数nの値(3-20[9]):";N0$ If N0$ = "" Then N0=9 Else N0=Val(N0$) If (M0 >= 1) and (M0 <= 20) and (N0 >= 1) and (N0 <= 20) Then Exit Do End If Loop Print ' ' 初期設定(方眼紙全体を未被覆とする)。 For M=1 To M0 For N=1 To N0: A(M,N)=0: Next N Next M ' ' ゲームの記述。 Do Print"あなたの番" ' 配置可能な位置を探索。 IND=0: ' 配置可能位置がない場合IND=0、ある場合、その個数。 ' ' 方眼紙の周辺情報を作業配列に格納する。 For N=1 To N0 B(1,N)=A(1,N): B(M0,N)=A(M0,N) Next N For M=2 To M0-1 B(M,1)=A(M,1): B(M,N0)=A(M,N0) Next M ' ' 十字形が位置(M,N)に配置できるかどうか調べる。 For M=2 To M0-1 For N=2 To N0-1 B(M,N)=A(M,N) ' 位置(M,N)を中心に、上下左右の空き具合を調べる。 If A(M,N) <> 0 Then Goto *Lab1 If A(M-1,N) <> 0 Then Goto *Lab1 If A(M,N+1) <> 0 Then Goto *Lab1 If A(M+1,N) <> 0 Then Goto *Lab1 If A(M,N-1) <> 0 Then Goto *Lab1 ' 位置(M,N)に配置できるとき、B(M,N)=2とする。 B(M,N)=2 IND=IND+1 *Lab1 Next N Next M ' ' 勝負の判定。 If IND = 0 Then ' あなたの番で、配置可能な位置がない場合、コンピュータの勝ち。 Print"コンピュータの勝ち" Exit Do Else ' ゲーム続行。 ' 現在の配置と配置可能の位置を表示。 Print Space$(3); For N=1 To N0: Print Using"##";N;: Next N Print For M=1 To M0 Print Using"###";M; For N=1 To N0 If B(M,N)=0 Then C$="□" If B(M,N)=1 Then C$="■" If B(M,N)=-1 Then C$="★" If B(M,N)=2 Then C$="×" Print C$; Next N Print Next M Print ' ' 配置位置を指定。 *Lab2 Input"行の位置:";M1 Input"列の位置:";N1 If B(M1,N1) <> 2 Then Goto *Lab2 ' ' 方眼紙の状況を更新。 A(M1,N1)=1 A(M1-1,N1)=1 A(M1,N1+1)=1 A(M1+1,N1)=1 A(M1,N1-1)=1 ' ' 方眼紙の表示。 Print Space$(3); For N=1 To N0: Print Using"##";N;: Next N Print For M=1 To M0 Print Using"## ";M; For N=1 To N0 If A(M,N)=0 Then C$="□" If A(M,N)=1 Then C$="■" If A(M,N)=-1 Then C$="★" Print C$; Next N Print Next M Print End If ' Print"コンピュータの番"; ' 配置可能な位置を探索。 IND=0: ' 配置可能位置がない場合IND=0、ある場合、その個数。 ' ' 十字形が位置(M,N)に配置できるかどうか調べる。 For M=2 To M0-1 For N=2 To N0-1 B(M,N)=A(M,N) ' 位置(M,N)を中心に、上下左右の空き具合を調べる。 If A(M,N) <> 0 Then Goto *Lab3 If A(M-1,N) <> 0 Then Goto *Lab3 If A(M,N+1) <> 0 Then Goto *Lab3 If A(M+1,N) <> 0 Then Goto *Lab3 If A(M,N-1) <> 0 Then Goto *Lab3 ' 位置(M,N)に配置できるとき、B(M,N)=2とする。 B(M,N)=2 IND=IND+1 *Lab3 Next N Next M ' ' 勝負の判定。 If IND = 0 Then ' コンピュータの番で、配置可能な位置がない場合、あなたの勝ち。 Print Print"あなたの勝ち" Exit Do Else ' ゲーム続行。 ' 配置可能な位置の個数以下の値をランダムに決め、変数Iに格納。 ' 変数Jの値が変数Iの値と一致したとき、位置(M,N)に十字形を置く。 I=Int(IND*Rnd)+1 J=0 For M=1 To M0 For N=1 To N0 If B(M,N)=2 Then J=J+1 If J = I Then ' 方眼紙の状況を更新。 A(M,N)=-1 A(M-1,N)=-1 A(M,N+1)=-1 A(M+1,N)=-1 A(M,N-1)=-1 Goto *Lab4 End If End If Next N Next M *Lab4 Print"(";M;",";N;")に配置" ' ' 方眼紙の表示。 Print Space$(3); For N=1 To N0: Print Using"##";N;: Next N Print For M=1 To M0 Print Using"## ";M; For N=1 To N0 If A(M,N)=0 Then C$="□" If A(M,N)=1 Then C$="■" If A(M,N)=-1 Then C$="★" Print C$; Next N Print Next M Print End If Loop End