マガジン

四目並べの先手必勝はどんな手順か:証明された結果の読み方

遊びを見つける

執筆にClaudeを使用しています。

一人が小さなパズルを試し、制作者がノートを持って様子を観察するテストプレイ風景
記事のテーマをもとに制作したAI生成の写真風イメージ。

標準の四目並べ(縦6行×横7列の盤に交互に駒を落とし、縦・横・斜めに4つ並べると勝ち)は、先手が最善を尽くせば必ず勝てることが証明されています。では、その手順を書き出せるでしょうか。答えは「一本道の手順としては書けない」です。確かなのは、最初の一手を中央の列に置くこと、そのあとは後手の応手ごとに先手の対応が決まっていることです。応手の数だけ枝分かれするため、暗唱できる長さにはなりません。 そこでこの記事では、手順の暗記ではなく、先手が勝てると言える理由の手触りを盤面で確かめます。使うのは、マスごとに4連が何本通るかの計算と、行の奇数・偶数という見方の二つです。後半では、自分の対局を記録して偶奇の偏りを集計する手順を示します。数値の結果は示しません。数えるのは読者自身です。

この記事の目次
  1. 証明が言っていること、言っていないこと
  2. 中央列を数字で確かめる
  3. 奇数行と偶数行:盤面の感覚
  4. 自分の対局で偶奇を数える
  5. 次の行動
  6. 参考資料

証明が言っていること、言っていないこと

この結果は1980年代末に、二人の研究者がそれぞれ独立に示したことで知られています。内容は「縦6行×横7列の盤で、双方が最善を打ち続けたときの結果」です。盤の大きさが違えば結論も変わります。

以下、列を左からa〜g、行を下から1〜6と呼びます。最初の一手ごとの結果は、一般に次のように伝わっています。

  • d列(中央)、最善を尽くしたときの結果:先手の勝ち
  • c列・e列、最善を尽くしたときの結果:引き分け
  • a・b・f・g列、最善を尽くしたときの結果:後手の勝ち

一手目を端寄りにするだけで、勝ちが負けに変わります。これは、盤の中央を使う側が有利という感覚と合っています。

ただし、この表は人間同士の対局が先手有利だという意味ではありません。証明が保証するのは、全局面で最善手を選べる場合の結論です。人間の対局では、一手目を中央にしても負けることは普通にあります。ここを混同しないことが、結果を読む上での最初の注意点です。

中央列を数字で確かめる

中央が強い理由の一つは、4連がそのマスを通る本数にあります。盤全体の4連は、横が24本、縦が21本、斜めが24本の合計69本です。次のコードは、各マスを通る4連の本数を数えます。HTMLファイルとして保存してブラウザで開くと動きます。

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局ごとに先手・後手を決め、途中で入れ替えません。
  2. 各局で、盤上に初めて現れた脅威を1つずつ記録します。脅威が複数あれば、1つずつ別の行として書きます。
  3. 記録の書式は「先,3」「後,2」とします。左が脅威を作った側(先手なら「先」)、右が脅威のマスの行(下から数えた番号)です。
  4. 縦の脅威は記録から外します。縦は常に直上のマスが相手に取られる形で、偶奇の議論とは別の性質を持つためです。

集計には次のコードを使えます。テキスト欄に記録を貼り付けてボタンを押すと、側ごと・奇偶ごとの件数が出ます。

html
<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年)