寝返り将棋のルールを、AI 同士の対局で決めた:効いた 1 つの変更と、壊れた 6 つの案
寝返り将棋 制作の記録 / 2026年9月
寝返り将棋は、6×6 の盤で、将棋の駒を使って、オセロのように挟んで裏返すゲームです。挟まれた駒は敵に寝返り、同時に成ります。成った駒の新しい動きで、さらに挟みが成り立てば、続けて裏返ります。これが連鎖です。
ルールを決める数字は、十個ほどあります。盤の広さ、持ち駒の数、どの方向で挟めるか、連鎖は何段まで、など。これを勘で決めず、AI 同士の対局を何十局も回して、数字で測って決めました。この記事は、その記録です。うまくいった変更は 1 つだけで、残りの案は、ほとんど壊れました。壊れ方も、残しておきます。
数字は、ゲームのリポジトリの README に残した測定の記録(2026 年 9 月 13 日時点)から書いています。AI 同士の対局で測ったもので、人間同士の対局での釣り合いは、まだ十分には確かめられていません。
何を、どう測ったか
AI は、先読みの探索(アルファベータ探索)で動く自作のものです。深さ 3 の AI 同士を戦わせて、次の数字を数えました。
- 打つ手のうち、反転が起きる割合。低いと、挟んでも何も起きない手ばかりになります。
- 平均の手数。短すぎると、ほぼ一方的に終わっています。
- 先手の勝率。50% に近いほど公平です。
- 3 連鎖以上が出た対局の割合。連鎖が、このゲームの目玉だからです。
- リードの入れ替わり回数。少なければ、先に有利になった側がそのまま勝っています。多すぎれば、毎手ひっくり返る運のゲームです。
案を並べて比べるときは、1 案あたり 40 局。最終の数字は、100 局で出しています。同じ測定は、README の手順(npm run report、npm run sweep)で、誰でも回し直せます。
最初のルールでは、ほとんど何も起きなかった
最初は、駒の「利き」(将棋で動ける方向)の向きだけで、挟めるかどうかを判定していました。AI 同士で回すと、反転が起きた打ち手は 2% だけ。平均 16 手で終わり、先手が 71% 勝ちました。裏返すゲームなのに、ほとんど裏返らなかったのです。
そこから 1 つずつ、ルールを変えて測り直しました。
| 段階 | 反転が起きた打ち手 | 平均手数 | 先手勝率 |
|---|---|---|---|
| 当初(利きの方向のみ・空の盤から) | 2% | 16 手 | 71% |
| 縦横斜めの全 8 方向にした | 8% | — | — |
| 初期配置を、陣形にした | — | 29 手 | — |
| 玉の隣を、守るようにした | 42% | 51 手 | 33% |
| 先手に、歩 1 枚のハンデ | 42% | 61 手 | 47% |
| 盤の端を、挟みの終わりにした | 81% | 53 手 | 59% |
先手勝率が、71% から 33% に、47% に、59% に動いているのは、ルールを変えるたびに、有利不利が入れ替わったからです。1 つの変更が、別の部分の釣り合いを崩すので、1 つ直すたびに測り直す必要がありました。
いちばん効いたのは、「盤の端も、挟みの終わり」
相手の駒が続いた先が盤の外なら、それも「挟んだ」と数えます。端に追い込まれた駒は、まとめて寝返ります。この変更で、反転が起きた打ち手は 42% から81% に増えました。
この案と、ほかの案を、同じ条件(各 40 局)で並べて比べたのが、次の表です。
| 案 | 1 手の反転枚数 | 3 連鎖以上が出た対局 | リード交代 |
|---|---|---|---|
| 変更前 | 0.76 | 15% | 7.0 回 |
| 盤の端を、挟みの終わりに | 2.51 | 85% | 7.4 回 |
| +打った駒も出世 | 3.06 | 80% | 9.9 回 |
| 打った駒も出世、だけ | 0.72 | 13% | 5.0 回 |
| 連鎖の上限を 3 に | 0.71 | 8% | 5.8 回 |
| 60 手で駒数決着 | 0.69 | 3% | 4.8 回 |
「打った駒も出世」を足すと、反転はさらに増えます。ただ、リード交代が 9.9 回まで上がって、毎手ひっくり返る展開になりました。それでは将棋側の戦略性が薄れるので、入れていません(設定の値を 1 つ変えれば、いつでも試せるようにしてあります)。
試して、やめた案
同じやり方で測って、いまの設定より悪かったものを、同じ失敗を繰り返さないために残してあります。
| 案 | 何が起きたか |
|---|---|
| 駒の本来の利き以外は、1 マスだけ挟める | 3 連鎖以上が出る対局が 95% から 13% に激減。挟める距離そのものが、連鎖のエンジンだった。 |
| 5×5 の盤 | 1 手の反転は 2.88 枚から 5.99 枚と派手になったが、先手勝率が 70% で崩れた。手数も 35 手と短い。 |
| 玉のまわりを守るルールを外す | 平均 17 手で終わり、先手勝率 95%。守りの駒が一斉に寝返って、玉が裸になる。 |
| 連鎖の上限を 8 に | 現状とほぼ同じ(1 手の反転 2.86 枚と 2.88 枚)。上限 5 は、ほとんど効いていなかった。 |
| 打った駒も、大量の寝返りで成る | 反転は増えるが、リード交代が 9.9 回に上がり、毎手ひっくり返る。 |
| 60 手で駒数決着 | 3 連鎖以上が出る対局が 3% に激減。 |
この表で、いちばん学びが大きかったのは、「連鎖の上限を 8 にしても変わらない」でした。上限を上げれば連鎖が増えそうに思えます。測ってみると、結果はほとんど変わらず、上限の 5 は、ほとんど効いていませんでした。実際には効いていない数字を、いじるところでした。
玉のまわりを守るルールは、外せない
このゲームでは、自分の玉に隣り合う駒は、寝返りません。玉のまわりが、安定した守りの場所になります。このルールを外した実験が、上の表の 3 行目です。平均 17 手、先手の 95% 勝ち。守りの駒が一手で全部寝返って、序盤で一方的に玉が取られました。
ルールの説明では、地味な一文です。しかし、これが無いと、ゲームが成り立ちません。
いまの数字(AI 同士 100 局、深さ 3)
| 指標 | 値 |
|---|---|
| 平均手数 | 52.7 手 |
| 盤の埋まり率 | 61% |
| 打つ手のうち、反転が起きる割合 | 81% |
| 1 手あたりの反転枚数 | 3.08 枚 |
| 3 連鎖以上が出た対局 | 87% |
| 4 連鎖以上が出た対局 | 38% |
| リード交代の平均回数 | 10.4 回 |
| 一度もリードが入れ替わらない対局 | 0% |
| 負けた側も、一度はリードしていた対局 | 98% |
| 勝負が決まった時点(手数のうち) | 81% の地点 |
| 先手の勝率 | 61% |
盤の色が何度も入れ替わって、最後までもつれます。それでいて、運だけのゲームにはなっていません。深さ 3 の AI は、深さ 2 の AI に、24 局中 20 局勝ちました(先手でも後手でも)。先を読めば勝てる、ということです。決着の 98% は玉を取ったもので、「挟むのは手段、将棋の勝ち方が目的」という関係も保たれています。
まだ解決していないこと:先手と後手の差
最終の測定で、先手の勝率は 61% でした(途中の測定では 59% でした。別の測定なので、数字が少し違います)。50% から 11 ポイントずれています。ハンデの付け方を 5 通り測りましたが、これより明確に良いものは、見つかっていません。
| ハンデ | 先手の勝率 |
|---|---|
| 無し | 33% |
| 先手の持ち駒に、歩 +1(現行) | 61% |
| 先手の盤上に、歩 +1 | 38% |
| 先手の盤上の歩 1 枚を、持ち駒に移す | 64% |
| 先手の持ち駒に歩 +1、かつ、後手の盤上に歩 +1 | 27% |
詰められない理由は、駒が 1 枚単位でしか置けないことに加えて、同じ「歩 1 枚」でも、置く場所で価値が全く違うことです。点対称な位置への同じ追加が、一方では +5 ポイント、もう一方では −34 ポイントになりました。細かい足し算では、50% に寄せられません。
実戦では、対戦相手を決めるときに、レーティングの低い側を先手にしています。弱い側が、有利な先手を持つので、差は部分的に埋め合わされます。それでも、解決とは言えません。人間同士の対局での確認も、これからです。
分かったこと
感覚で「面白そう」と思った変更は、測ると、半分は壊れていた。
- 数字を決めるなら、測る手を先に作る。AI 同士の対局を自動で回す道具があったから、6 つの案を同じ条件で比べられました。
- 効いていない数字がある。連鎖の上限は、5 でも 8 でも変わりませんでした。
- ゲームの目玉を壊す案は、測って初めて分かる。「1 マスだけ挟める」は、駒の個性が戻る良い案に見えて、連鎖を 95% から 13% に壊しました。
- 直せていないことは、直せていないと書く。先後の差は、61% のままです。
同じ「測る手を用意する」考え方で、すし積むの寸法を調整した記録は、穴子の記事に書いています。
この記事の数字は、寝返り将棋のリポジトリの README にある、2026 年 9 月 13 日時点の測定記録から書きました。遊べるのはこちら、紹介は作品のページです。
この話に出てくるもの
ほかの記録
- オンライン対戦は、端末の言うことを何も信用しない:手・持ち時間・勝敗を、サーバーが決める設計 — ログイン無しのオンライン対戦を作った。手の検証をルールエンジンに通す、持ち時間をサーバーだけが持つ、切断は 30 秒待つ、署名つきトークンで名乗りを防ぐ、レーティングは対局前の相手の数字で計算する。コードの実際の値つき。
- Qiita の「投稿頻度が高過ぎます」を測った:新しいアカウントは、投稿から約 30 分、次の記事を作れなかった — Qiita の投稿頻度の制限を、5 分おきの記録で測った。新しいアカウントでは、2 回とも、投稿から約 30 分。3 回目は記録が欠けた。
- Claude API から Gemini API(gemini-3.1-flash-lite)へ移行した:16 か所の呼び出しを 1 つの関数にまとめた — Anthropic の利用上限で予定外の課金が出たため Gemini へ移行。モデルの選び方(廃止予定日)、呼び出しの一本化、Web 検索の回数上限が無い問題への回路遮断器、止めるスイッチの記録。
コメント
感想や、記事の間違いの指摘は、ここへ。書くには、GitHub のアカウントが要ります。
押すと、giscus(giscus.app)と GitHub に接続します。押さなければ、接続しません。詳しくはあつかいに書いています。