今回は棋譜ファイルの名前を変更できるようにした他、対局の結果の表示、自動的に石を取り除く処理を追加しました。プログラムIDはHHF931-2です。例によってシステムがコメントにした行は元に戻してお使いください。
【図23 Igo v0.6 棋譜ファイルを再生したところ】
対局の結果はウィンドウのタイトル部分に表示されますが、v0.6ではまだ地の計算ができていません。アゲハマの数のみ計算して表示しています。
今回追加した石を取り除く処理では、再帰呼び出しというサブルーチンの呼び出し方法を使いました。これは自分自身を呼び出す手法です。通常、再帰呼び出しを使う言語(cやJava)にはローカル変数と呼ばれるサブルーチンの中だけで使われる変数があり、呼び出されるたびに変数が作られるので、上書きされることがありません。しかし、Small Basicではすべての変数がグローバルな変数なので、壊されないように工夫する必要があります。
以下は再帰呼び出しでよく使われる階乗の計算例です。n! = (n – 1)! × n なので、それをそのままプログラミングしています。Small Basicだと変数の n が壊れてしまうので、自分自身を呼び出す前にスタックへのプッシュとポップを使って変数を保存しておきます。
【リスト10 再帰呼び出しの例 – 階乗の計算】
1 ‘ Factorial – recursive call sample
2
3 While “True”
4 TextWindow.Write(“? “)
5 n = TextWindow.Read()
6 If n < 1 Then
7 Goto exit
8 EndIf
9 Factorial()
10 TextWindow.WriteLine(n + "! = " + f)
11 EndWhile
12 exit:
13
14 Sub Factorial
15 If n <= 1 Then
16 f = n
17 Else
18 Stack.PushValue("s", n)
19 n = n – 1
20 Factorial() ' ここで再帰呼び出し
21 n = Stack.PopValue("s")
22 f = f * n
23 EndIf
24 EndSub
縦横につながった石(連と呼びます)に接する空点(呼吸点と呼びます)を数え、連の呼吸点が0なら、その連は取られます。連の呼吸点を数える CountLiberty() というサブルーチンが再帰呼び出しになっていて、石がつながっている間はその四方の石を再帰的に調べます。
階乗のように再帰的に定義できるものを計算するときは、この再帰呼び出し(recursive call)が便利です。
(つづく)