- y = ofsy + (player * 6) + margin[id] * flip; //y で打ち込み可能な範囲を示す
+ y = ofsy + (player * 4) + margin[id] * flip; //y で打ち込み可能な範囲を示す
ではないでしょうか
(このゲームでは打ち歩詰めは禁じ手ではない、という前提があるのだろうという推測の下ですが)
個人的に、先手・後手が絡む処理を、1つの関数・処理で表現することにこだわって、複雑になりすぎてしまっているのではないかと思います。
上の部分も、私は実際には、周辺の変数をデバッグ出力しつつ、
if (player == 0) {
// 先手:盤面上端から下方向へ走査
y = 3 + margin[id];
flip = 1;
} else {
// 後手:盤面下端から上方向へ走査
y = 7 - margin[id]
flip = -1;
}
というコードでうまく動くことを確認してから、質問者さんの元のコードの形になるように導いたものです。(flipという変数で何をやってるのか、marginという配列の意味するところは、というところで1分くらい止まりました)
たとえば1つ1つの処理をもっと細かく関数に分けてもよいのではないでしょうか。
また式についても、短くするとスマートに見えるかもしれませんが、挙動がわかりにくくなるくらいなら、もっと愚直な形でもよいと思います。