前回の2つのバグを改修しました。GraphGo011 として公開します。
(1) 打てないところに打ってもブザーが鳴らない。
これは、Pos.move()で打てないところに打とうとするとfalseを返しているのに、その上位のGBoard.move()が常にtrueを返していました。Eclipseのデバッグ機能でPos.move()にブレークポイントを設定して石の上をクリックして追いかけました。
(2) 3つ並んだ石を取れない。
この他にも3路盤でうまくいかない手順を見つけ、JUnitのテストケースに追加しました。Eclipseのデバッグ機能でエラーになるJUnitのテストケースにブレークポイントを設定し、その後、Pos.calcVectorsにブレークポイントを設定して、ベクトルaや行列Aなどの値がおかしくなる現場を捉えました。
結果として、以下の3つの式を新しくしました。以下の式は黒の着手の場合です。白の着手の場合はbとwを入れ替えます。
a = tF(F0ei∧(b–l))∨(F0ei)
d = (tF(h–b)・ei)(tF(F0ei∧(h–b))-b)
A = (ei∨(a–w))ta
aは着手により生じた連接点を表します。dは着手により取られる石を表します。Aはaから求められるFと論理和をとる行列を表します。
これらの修正によって、3つ並んだ石が取れない、余計な石が取られてしまうなどのバグが改修されました。結果は以下のとおりです。
【図73 GraphGo v0.11】
新たに6つのベクトルを導入しようとして、デバッグをする羽目になりましたが、ここを直しておかないと、6つのベクトルの導入に混乱を来たすので、よい機会だったと思います。
やはり、数式のデバッグは通常のプログラムのデバッグより大変です。ノートに手計算で期待される動きができているか確かめながらEclipseのデバッグ機能で実際の結果と照らし合わせて、式が違っているときは、どういう値がほしいのか、というところから式を組み立てなおします。そういった繰り返しで少しずつ数式にも慣れていくのだと思います。
(つづく)