四目並べの先手必勝はどんな手順か:証明された結果の読み方
遊びを見つける執筆にClaudeを使用しています。

標準の四目並べ(縦6行×横7列の盤に交互に駒を落とし、縦・横・斜めに4つ並べると勝ち)は、先手が最善を尽くせば必ず勝てることが証明されています。では、その手順を書き出せるでしょうか。答えは「一本道の手順としては書けない」です。確かなのは、最初の一手を中央の列に置くこと、そのあとは後手の応手ごとに先手の対応が決まっていることです。応手の数だけ枝分かれするため、暗唱できる長さにはなりません。 そこでこの記事では、手順の暗記ではなく、先手が勝てると言える理由の手触りを盤面で確かめます。使うのは、マスごとに4連が何本通るかの計算と、行の奇数・偶数という見方の二つです。後半では、自分の対局を記録して偶奇の偏りを集計する手順を示します。数値の結果は示しません。数えるのは読者自身です。
証明が言っていること、言っていないこと
この結果は1980年代末に、二人の研究者がそれぞれ独立に示したことで知られています。内容は「縦6行×横7列の盤で、双方が最善を打ち続けたときの結果」です。盤の大きさが違えば結論も変わります。
以下、列を左からa〜g、行を下から1〜6と呼びます。最初の一手ごとの結果は、一般に次のように伝わっています。
- d列(中央)、最善を尽くしたときの結果:先手の勝ち
- c列・e列、最善を尽くしたときの結果:引き分け
- a・b・f・g列、最善を尽くしたときの結果:後手の勝ち
一手目を端寄りにするだけで、勝ちが負けに変わります。これは、盤の中央を使う側が有利という感覚と合っています。
ただし、この表は人間同士の対局が先手有利だという意味ではありません。証明が保証するのは、全局面で最善手を選べる場合の結論です。人間の対局では、一手目を中央にしても負けることは普通にあります。ここを混同しないことが、結果を読む上での最初の注意点です。
中央列を数字で確かめる
中央が強い理由の一つは、4連がそのマスを通る本数にあります。盤全体の4連は、横が24本、縦が21本、斜めが24本の合計69本です。次のコードは、各マスを通る4連の本数を数えます。HTMLファイルとして保存してブラウザで開くと動きます。
<pre id="out"></pre>
<script>
const W = 7, H = 6;
const count = Array.from({length: H}, () => Array(W).fill(0));
const dirs = [[1,0],[0,1],[1,1],[1,-1]];
let lines = 0;
for (let r = 0; r < H; r++) {
for (let c = 0; c < W; c++) {
for (const [dc, dr] of dirs) {
const ec = c + 3*dc, er = r + 3*dr;
if (ec < 0 || ec >= W || er < 0 || er >= H) continue;
lines++;
for (let k = 0; k < 4; k++) count[r + k*dr][c + k*dc]++;
}
}
}
let text = "4連の総数: " + lines + "\n";
for (let r = H - 1; r >= 0; r--) text += count[r].join(" ") + "\n";
document.getElementById("out").textContent = text;
</script>表示は上の行から順に並びます。最下段の行は、左端のマスが3本、中央のd1が7本になります。コードを動かす前に、手計算でd1を数えてみます。
- 横の4連は、a〜d、b〜e、c〜f、d〜gの4本です。
- 縦の4連は、d1〜d4の1本です。
- 右上がりの斜めは、d1〜g4の1本です。
- 左上がりの斜めは、d1・c2・b3・a4の1本です。
合計は4+1+1+1で7本です。コードの出力と一致するか確かめてください。続けてd3も数えると、横4本、縦3本、斜め3本と3本の合計で13本になります。
左右の端の列は、通る4連が少ないマスばかりです。中央列は、どの行でも多くの4連に絡みます。先手が最初に中央の最下段を取ることは、最も多くの4連に関われるマスから始めることです。出力の数字の並びを、左右対称かどうか、上下対称かどうかも含めて眺めてみてください。
奇数行と偶数行:盤面の感覚
もう一つの鍵は、盤が42マスで、1列が6マス、つまり偶数だという点です。
「脅威」という言葉を定めます。脅威とは、片方の色だけに関わる空きマスで、そこに自分の駒を置けば4連が完成するものです。駒は下から積まれるため、脅威のマスの直下が埋まるまで、誰も脅威のマスに置けません。
ここで、他の6列がすべて埋まり、1列だけが空の終盤を考えます。置かれた駒は36個、先手から数えて偶数手が終わっているので、手番は先手です。その列に先手が1行目、後手が2行目、先手が3行目と交互に置いていくと、先手は奇数行、後手は偶数行を取ります。一般には、他の列がすべて埋まった時点で残りが偶数マスなら、先手は残りの最下マス(奇数行)を取る側になります。
ここから次のことが導かれます。
- 先手が3行目などの奇数行に脅威を作ると、終盤で先手がそのマスに置けて、勝ちになります。
- 後手が2行目などの偶数行に脅威を作ると、終盤で先手はその直下のマスに置かざるを得ず、後手が脅威のマスに置いて勝ちになります。
- 先手は奇数行、後手は偶数行の脅威を狙うのが基本です。互いの脅威が別の列にある場合は、さらに複雑な判断になります。
後手が先手の打った列の真上に毎回置く方法は、後手が偶数行を取り続けるための考え方として知られています。先手がそれを破って奇数行に脅威を作るところに、先手必勝の骨格があります。
この説明は単純化したものです。実戦では、脅威が複数あることや、脅威の下のマスに置くと相手に有利な手を与えることなど、例外が数多くあります。盤面の見方として「行の偶奇」を持っておく、くらいの位置づけで読んでください。
自分の対局で偶奇を数える
理論と実戦のずれを、自分の対局の記録で確かめる手順を示します。紙の盤でも、ブラウザの四目並べでも構いません。
準備と記録
- 対局を数十局分用意します。1局ごとに先手・後手を決め、途中で入れ替えません。
- 各局で、盤上に初めて現れた脅威を1つずつ記録します。脅威が複数あれば、1つずつ別の行として書きます。
- 記録の書式は「先,3」「後,2」とします。左が脅威を作った側(先手なら「先」)、右が脅威のマスの行(下から数えた番号)です。
- 縦の脅威は記録から外します。縦は常に直上のマスが相手に取られる形で、偶奇の議論とは別の性質を持つためです。
集計には次のコードを使えます。テキスト欄に記録を貼り付けてボタンを押すと、側ごと・奇偶ごとの件数が出ます。
<textarea id="log" rows="6" cols="24"></textarea>
<button id="go">集計</button>
<pre id="out2"></pre>
<script>
document.getElementById("go").onclick = () => {
const t = {};
for (const line of log.value.trim().split("\n")) {
const [who, row] = line.split(",");
if (!row) continue;
const key = who + (Number(row) % 2 ? "・奇数行" : "・偶数行");
t[key] = (t[key] || 0) + 1;
}
out2.textContent = JSON.stringify(t, null, 1);
};
</script>結果の読み方
- 先手の脅威が奇数行に、後手の脅威が偶数行に偏れば、上の理屈と整合的です。
- 偏りが見えなければ、標本の少なさ、脅威の定義のぶれ、対局者が偶奇を意識していないこと、などをまず疑います。
- どちらの結果でも、先手必勝の証明を確かめたことにも、覆したことにもなりません。
起こりやすい誤り
- 行を上から数えてしまうと、奇偶が逆になります。必ず下から数えます。
- 勝敗の数だけで比べると、脅威の偶奇という本来の問いが見えなくなります。
- 先手後手を局ごとに入れ替えて記録すると、「先」「後」の意味がぶれます。入れ替える場合は、記録の側を座席ではなく手番で付け直します。
- 強さの違う相手との対局を混ぜると、偏りの原因が偶奇なのか実力差なのか分かれません。
次の行動
まず、マスごとの4連数の出力を手元で確かめ、d1とd3を手計算で照合してみてください。そのうえで、数十局分の脅威の記録を取り、奇数行・偶数行の集計を見比べます。アソバースには四目並べの公式作品はありませんが、HTMLで作った自作の四目並べは投稿できます。中央列を優先する簡単なCPUから作ってみるのも一案です。
参考資料
- Victor Allis『A Knowledge-based Approach of Connect-Four』(1988年)

