マガジン

オセロ一局は何手で終わるか:自分の対局記録から手数の分布を出す手順

遊びを見つける

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

遊んだ記録を示すカード列と、途中の位置を残した迷路盤を並べた写真風イメージ。
記事のテーマをもとに制作したAI生成イラスト。

オセロは盤が8×8の64マスで、最初に4枚の石が置かれています。そのため、すべてのマスが埋まるまで打てば石を置く回数は60回になり、これが手数の上限です。では、実際の一局はどのくらいの手数で終わるのでしょうか。60手まで続く局が大半なのか、その手前で終わる局が目立つのか。一般論としては語れても、自分の対局でどうなのかは、記録を取らないと分かりません。 この記事は、平均手数や最短・最長の数字を示すものではありません。自分の対局から手数を取り出し、平均・中央値・最小・最大・分布の形を出すまでの手順を設計書として示します。「潮目のオセロ」のひとり対局を例に進めますが、手順は他のオセロ環境でもそのまま使えます。 数える道具は、紙とペン、または表計算ソフトです。短いHTMLの集計コードも用意しているので、こちらを使うこともできます。

この記事の目次
  1. 「一手」の定義を先に決める
  2. 記録用紙を作る
  3. 何局分、どう集めるか
  4. 集計する:表計算でもコードでも
  5. 結果の読み方:平均だけで判断しない
  6. 起こりやすい誤り
  7. 次の行動

「一手」の定義を先に決める

集計で最初につまずくのは、何を一手と数えるかが曖昧なことです。次のように決めておきます。

  • 手数は、石を実際に盤へ置いた回数とします。
  • パス(置ける場所がなく手番を渡すこと)は手数に含めません。パスの回数は別の列に記録します。
  • 「一手戻す」で取り消した手は、なかったものとして扱います。

この定義には、記録が楽になる利点があります。初期の4枚から、石は一手ごとにちょうど1枚増え、パスでは増えません。したがって、終局時の盤上の石の合計から4を引けば、その局の手数になります。

手数 = 終局時の黒石の数 + 白石の数 − 4

一手ずつ数える必要はありません。終局画面を見て石数を書き留めるだけで足ります。一手戻すを使った局でも、手数の二重計上が起きません。

ただし、空きマスを勝者の石として加算して表示する流儀もあります。その場合は合計が64になり、この式が使えません。終局画面の石数が、盤上にある石そのものの数なのか、空きマスを加えた数なのかは、作品を開いて確かめてください。加算されているなら、盤面の空きマスを目で数えて、64から引いた値を石の合計として使います。

記録用紙を作る

1局ごとに1行、次の列を用意します。

  • 局番号、内容:1, 2, 3…、記入のしかた:通し番号
  • 相手の段階、内容:3段階のどれか、記入のしかた:局ごとに必ず書く
  • 自分の色、内容:黒(先手)/白、記入のしかた:先手か後手かで傾向が変わる可能性があります
  • 黒石数・白石数、内容:終局時の数、記入のしかた:画面に出た数をそのまま書く
  • パス回数、内容:対局中に起きたパスの数、記入のしかた:自動パスなので見落としやすい。通知の出方は作品を開いて確かめる
  • 終局の理由、内容:盤が埋まった/両者とも置けない/片方の石がなくなった、記入のしかた:盤面を見て判断する
  • ヒント・一手戻すの使用、内容:有/無、記入のしかた:使用の有無だけで構いません
  • 勝敗、内容:勝・負・分、記入のしかた:参考情報です

「手数」の列は、あとで黒石数+白石数−4を計算して埋めます。記録のときは石数だけを書いておくほうが、写し間違いを見つけやすくなります。

局の途中で画面を閉じたものや、投了したものは、終局の石数が取れません。この記事では集計から除外し、「中断」として別に数を控えておきます。この種の作品の記録は、画面を開いている間しか残らないことが多いので、終局のたびにその場で書き留めておくのが確実です。

何局分、どう集めるか

目安は、まず20局です。局数が少ないと、たまたま続いた展開が平均を動かします。最初は20局で形をつかみ、足りなければ増やします。

集め方には、次の3つの注意があります。

  1. 相手の段階(3段階)を混ぜず、段階ごとに最低10局ずつ集めます。混ぜて集計すると、どの相手の傾向なのか分からなくなります。
  2. 先手と後手をできるだけ半々にします。偏ると、色による差と相手による差が区別できません。
  3. 途中で戦い方を変えない時期のデータを使います。ヒントを多用する日と使わない日があるなら、その違いを記録の列で残しておきます。

オンライン対局の記録を加える場合は、ひとり対局とは別の表にします。人間が相手だと、置く速さや戦い方が変わります。ここは混ぜないほうが、結果を読み取りやすくなります。

集計する:表計算でもコードでも

表計算ソフトなら、手数の列に対して次の関数を使います。

  • 平均:AVERAGE
  • 中央値:MEDIAN
  • 最小・最大:MIN、MAX
  • 四分位(下から25%・上から25%の位置):QUARTILE

コードで集計したい場合は、次のHTMLを保存してブラウザで開きます。外部ライブラリは使わず、1行に「黒石数,白石数」を貼り付けるだけで動きます。

html
<textarea id="in" rows="8" cols="24"
  placeholder="1行に1局: 黒石数,白石数"></textarea>
<button id="go">集計</button>
<pre id="out"></pre>
<script>
const median = (a) => {
  const m = a.length >> 1;
  return a.length % 2 ? a[m] : (a[m - 1] + a[m]) / 2;
};
document.getElementById("go").onclick = () => {
  const moves = document.getElementById("in").value
    .split("\n")
    .map((l) => l.split(",").map(Number))
    .filter((p) => p.length === 2 && p.every(Number.isFinite))
    .map(([b, w]) => b + w - 4)
    .sort((x, y) => x - y);
  if (!moves.length) {
    document.getElementById("out").textContent = "データがありません";
    return;
  }
  const sum = moves.reduce((s, x) => s + x, 0);
  const freq = new Map();
  moves.forEach((x) => freq.set(x, (freq.get(x) || 0) + 1));
  let text = "局数: " + moves.length +
    "\n最小: " + moves[0] +
    "\n最大: " + moves[moves.length - 1] +
    "\n平均: " + (sum / moves.length).toFixed(1) +
    "\n中央値: " + median(moves) + "\n\n手数ごとの局数\n";
  [...freq].forEach(([k, v]) => {
    text += k + "手: " + "■".repeat(v) + " (" + v + ")\n";
  });
  document.getElementById("out").textContent = text;
};
</script>

出力の最後にある「■」の並びが、手数の分布(ヒストグラム)です。数字の羅列より、形で見るほうが傾向をつかみやすくなります。

結果の読み方:平均だけで判断しない

数字が出たら、次の順に読みます。

1. 最大値を見る

最大が60なら、盤が埋まるまで打った局があったということです。60を超える値が出た場合は、定義か記録の誤りです。石数の読み取りや、空きマスの加算の有無を確認します。

2. 平均と中央値を並べる

平均と中央値が近ければ、分布は左右に偏っていません。平均が中央値より大きく下がっているなら、少数の短い局が平均を引き下げています。そのときは、短い局の終局の理由の列を見ます。片方の石がなくなって終わった局や、両者とも置けなくなって空きマスが残った局が混じっている可能性があります。

3. 60手に集まっているかを見る

多くの局が60付近に並ぶなら、あなたの対局の典型は「盤が埋まるまで続く」ことになります。60手未満の局がどれだけ混じるかで、パスや早期終局がどの程度起きているかが分かります。

4. 最短と最長を「一局」として読み直す

最小値の局は、数字だけで済ませず、その一局の終局の理由とパス回数を見ます。偶然の展開なのか、特定の相手の段階で繰り返し起きるのか、段階別に並べて確かめます。短い局が低い段階の相手に偏るのか、高い段階に偏るのかは、集めたデータで答えが出ます。

5. 段階別・色別に分けて比べる

全体の集計を出したあとで、段階ごと、先手と後手ごとに同じ集計をやり直します。差が出るかどうかが、この分析の一番の見どころです。ただし、各グループが10局に満たないうちは、差があるように見えても偶然の範囲かもしれません。局数を増やして、形が安定するかを確かめてください。

起こりやすい誤り

  • パスを手数に入れてしまう。 石数から求める方式なら、自然に防げます。
  • 終局画面の石数に空きマスが加算されている。 合計が64になる場合は、盤面の空きを数え直します。
  • 一手戻す・ヒントの使用を混ぜる。 使用の有無を列に残し、必要なら使った局と使わなかった局を分けて集計します。ヒントと一手戻すはひとり対局だけの機能です。オンライン対局の記録とは、表を分けておきます。
  • 中断した局を捨てたまま数えない。 中断の数も控えておくと、集計した局が偏っていないかの確認に使えます。
  • 一度の結果を一般的な答えにする。 この集計が示すのは、あなたの遊び方と対局相手の範囲での傾向です。オセロ全般の平均ではありません。

次の行動

まず「潮目のオセロ」のひとり対局を1局終えて、終局画面の黒石数と白石数を書き留め、手数を計算してみてください。そのあと、段階ごとに10局ずつを目安に記録を重ね、上のコードに貼って分布の形を見ます。短い局が混じっていたら、その終局の理由を見直すことが、次の対局で試す工夫のきっかけになります。