クラスPosのテストプログラムとしては、JUnitを使ったPosTest.javaとCUIサンプルプログラムSample5.java、Sample6.javaを作りました。
現時点でいずれの結果もおかしいのですが、まず2路盤の局面を出力するSample6.javaの結果を見ながら、ソースを見直していきたいと思います。
結果の最初の部分:
3手:白1子を取るパターン
#0
F=
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
b=(1 1 1 1
)
w=(1 1 1 1
)
l=(1 1 1 1
)
h=(0 0 0 0
)
‘++
‘++
は、2路盤にまだ石のない状態のPosクラス内部の表示結果です。一番最後の部分はベクトルb, wから碁盤を再現したもので、”+”が空点、”@”が黒石、”O”が白石を表しています。Fは初期状態ではF0と同じになります。ここまでは問題ないようです。
結果の1手目の部分:
turn:B ←黒番
(1,2) ←右上に着手
#1 ← 1手目
F=
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
b=(1 1 1 1
)
w=(1 0 1 1
)
l=(1 0 1 1
)
h=(0 0 0 0
)
a=(1 0 1 1
)
d=(0 0 0 0
)
A=
0 0 0 0
1 1 0 1
0 0 0 0
0 0 0 0
D=
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
‘+@
‘++
では、1手着手したことにより表示される内容が増えます。着手によって追加される連接点を表す行列Aの着手した2行目に値が入っていますが、Fの2行目と同じため、連接点Fは変化がありません。ちなみにFが着手後にF’になるとすると、
F’ = F∨A∧D
になります。論理演算∨、∧の順序は式の左からとします。この3手の結果では2子以上の連が作られないため、Fは変化しないはずです。ここまでも問題なさそうです。
結果の2手目の部分:
turn:W ←白番
(1,1)
#2
F=
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
b=(0 1 1 1
)
w=(1 0 1 1
)
l=(0 0 1 1
)
h=(0 0 0 0
)
a=(0 0 1 1
)
d=(0 0 0 0
)
A=
1 1 1 0
0 0 0 0
0 0 0 0
0 0 0 0
D=
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
‘O@
‘++
ここも問題なさそうです。
結果の3手目の部分:
turn:B
(2,1)
#3
F=
1 1 1 0
1 1 0 1
1 0 1 1
0 1 1 1
b=(0 1 1 1 ←白石が取られていない
)
w=(1 0 0 1
)
l=(0 0 0 1
)
h=(1 1 0 0
)
a=(0 0 0 1
)
d=(1 1 0 0
)
A=
0 0 0 0
0 0 0 0
1 0 1 1
0 0 0 0
D=
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
‘O@ ←白石が取られていない
‘@+
3手目は白石が取られなければなりませんが、うまくいっていません。bを計算しているのは、クラスPosのcalcVectorsの中の、
d = he.mul((tFei.and(he)).mul(ei));
b = b.or(d);
のところです。これは、式を修正したところです。
(つづく)