連珠(五目並べ)入門 for プログラマ

# 概要
　[2013年には将棋の](http://nikkan-spa.jp/429665)、[2016年には囲碁の](http://nitro15.ldblog.jp/archives/47069626.html)**トッププロがコンピュータの前に敗れ去りました。**もっとも、これらのゲームは[二人零和有限確定完全情報ゲーム](https://ja.wikipedia.org/wiki/%E4%BA%8C%E4%BA%BA%E9%9B%B6%E5%92%8C%E6%9C%89%E9%99%90%E7%A2%BA%E5%AE%9A%E5%AE%8C%E5%85%A8%E6%83%85%E5%A0%B1%E3%82%B2%E3%83%BC%E3%83%A0)である以上、理論上は必勝法が存在します。また、不確定要素がある[バックギャモン](http://blog.goo.ne.jp/mochy3_8/e/51a5cc147458958345ca54282b0197d9)や[麻雀](http://togetter.com/li/917085)などにおいても、コンピューターはトッププロに迫る実力を出しています。情報技術が日々進歩する現代において、人類vsコンピューターの知恵比べは後者がますます優位になっていくことでしょう。
　今回は、そうしたボードゲームの一つとして連珠(五目並べ)を取り上げます。**地味に実装が難しい**ことで有名なゲームですが、どのように実装すればよいかをルールと見比べつつ見ていきます。

# 基本ルール編
　日本連珠社の公式サイトには次のように記されています。

>・盤はタテ、ヨコ、15道の「連珠盤」と黒・白の石を使います。
>・黒が先で盤の中央から交互に打ち、黒でも白でもタテ、ヨコ、ナナメのどれかに、早く『五連』を並べた方が『勝ち』です。
>・黒は五連を並べる前の「三三」と「四四」と「長連」が『禁手』で「打っても、打たされても負け」になります。
>・白には禁手がありません。長連は勝ちとなります。
>・勝負のつかない時は「引き分け」になります。

　一般的な「五目並べ」の場合、上から二つ目までしか気にしないのではないでしょうか。しかし、これらのルールには重大な意味があるのです。なぜなら、**禁手を設けない場合、黒が簡単に勝ってしまう**からです。囲碁ではコミを用いて先後の均衡を図っていますが、連珠では禁手によって均衡を図っていると言えるでしょう(**厳密にはまだ足りないが後述**)。
　しかしそれにより、ルールを理解するためにはどうしても「三」「四」「長連」の定義についても説明しなければなりません。詳しくは[公式サイトの説明](http://www.renjusha.net/rule1.html)を読めばいいとして、各パターンをプログラムでどう実装すべきかをまとめてみました。
(便宜上、黒石はB、白石はW、空白はO、「WかOか盤外」はXと表記する)

|種類|説明|パターン|
|:---|:---|:-------|
|五連(黒石)|5個の石の連|XBBBBBX　※1|
|五連・長連(白石)|白石が5つ以上並んだもの|WWWWW ※2|
|長連(黒石)|6個以上並ぶ石の連|BBBBBB|
|達四(黒石)|4個の石の連で、同種の石を1個加えると五連になる点が2カ所あるもの|XOBBBBOX　※1|
|達四(白石)|4個の石の連で、同種の石を1個加えると五連になる点が2カ所あるもの|OWWWWO|
|四(黒石)|同種の石を1個加えると五連になるもの|X[B4O1]X　※1 ※3|
|四(白石)|同種の石を1個加えると五連か長連になるもの|[W4O1]　※3|
|三(黒石)|同種の石を1個加えると達四になるもの|XO[B3O1]OX　※3 ※4|
|三(白石)|同種の石を1個加えると達四になるもの|O[W3O1]O　※3|
|両頭の四々|一直線上に現れる四々の一つ|XBOYYYOBX　※5|
|長蛇の四々|一直線上に現れる四々の一つ|XBBOYYOBBX　※5|
|双竜(争竜)の四々|一直線上に現れる四々の一つ|XBBBOYOBBBX　※5|
|三々々や四三々など|三々や四々に、五連以外の何が複合しても禁手には変わりない|―|
|引き分け判定|盤面の残り全てを白か黒で埋めて、どちらの場合でも五連以上が完成しない場合に終局とする|―|

- ※1……**Xは盤外も含む**。したがって、2辺が五つ並んだ黒石の両端に掛かっても五連である
- ※2……白の場合、長連も五連と同じく勝ちなので、**あえて区別していない**
- ※3……[B？O1]とは、「黒石を？個、空白を1個含んだ全ての組み合わせ」を指す。[W？O1]も同様
- ※4……ここで**「1個加える」操作が禁手によって行えない場合、三ではない**ものとする。つまり、**トビ三なら1箇所、そうでないなら2箇所**について禁点かを判定し、それらが**全て禁点ならば三と認めない**。
- ※5……このYは、「1つを残して他が全て黒石の状態であり、着手により全て黒石となる」部分を指す

　なお、「五連を並べる前」とあることから分かるように、**黒において禁手と五連が同時に出来るとそのまま勝ちです**。したがって、ある手が合法手かを判定する際は、**五連判定→長連判定→直線上の四々判定→三と四を数えて三々or四々判定**とすれば効率が良いでしょう。
　また、※4において、**「三々のうち、片方が禁手のせいで三と見なせない場合は三々ではない(否三々)」**といった不思議な現象が成立します(五連は無条件勝ちで、長連の可能性は上記パターンで弾けるので**否四々は存在しない**)。否三々は判定が面倒なせいか、**実装されていない連珠ソフトもそこそこ存在します**。
　更に、長連筋などで「最後まで打つと黒が確実に敗北する」場合用に、石を打たずあえてパスをすることも認められています……が、**否三々よりレアなので実装していない連珠ソフトがほとんどです**。
　以下に、主なコーナーケースをまとめてみました。

![2016-04-01_021819.png](https://qiita-image-store.s3.amazonaws.com/0/29802/8fbea9ac-aee0-a148-cead-118a636c9e92.png)


```corner_case.txt
[辺のせいで三にならない]
┌┬┬┬┬
├┼┼●┼
├┼●┼┼
├●┼╋┼
├┼┼┼┼
これは三ではない

[四三々、四々三は禁手]
┼┼┼┼┼┼┼
┼┼┼●●Ａ┼
┼┼┼┼●●┼
┼┼┼●┼●┼
┼┼●┼┼Ｂ┼
┼○┼┼┼┼┼
┼┼┼┼┼┼┼
Ａ点は四三々の禁手であり、Ｂ点に黒石を打ち込むとＡ点が四々三になる。
なお、Ｂ点に白石が置かれると縦の三が無くなるので、Ａ点がただの四三になる。

[否三々]
┼┼┼┼┼┼┼
┼●┼┼┼┼┼
┼○●●○○┼
┼┼●Ａ●┼┼
┼○○●┼┼┼
┼┼●Ｂ●┼┼
┼○┼┼┼○┼
┼┼┼┼┼┼┼
A点もB点も三々禁に見えるが、B点にとっての縦の三は、
A点の禁手のせいで成立していない。したがってB点は否三々。
```

# 開幕規定編
## 随意打ち編
　基本ルールで見たように、黒には三種類の禁手が存在しています。ただ、**これだけで打つとまだまだ先手必勝であることが**[黒岩涙香](https://ja.wikipedia.org/wiki/%E9%BB%92%E5%B2%A9%E6%B6%99%E9%A6%99)によって**示されています**。つまり、**「随意打ち(初手が盤の中央＝天元、次がその横隣り(直接打ち)か斜め隣り(間接打ち)、その次が初手から一間以内の位置)」**だけでは先後が均衡にならないのです。ちなみに、これ以降説明する開幕規定ルールは、**実装が面倒なせいか大抵の連珠ソフトがスルーしています**。どうせ「決め事」なので重要度が低く、一通り開幕の所作を行った後は上記のルールだけ考えればいいからですね。

## 指定打ち編
　そこで、**「指定打ち(最初の三手は白が指定する)」**といったルールが誕生しました。三手目までのパターンは次の24通り(彗星と遊星は黒が不利すぎるので除外)の基本珠型から選べますが、これによって「一部の定石(例：花月・浦月)に必勝法が見つかってもヘーキヘーキ」と言えるようになったのです。

![2016-04-01_025004.png](https://qiita-image-store.s3.amazonaws.com/0/29802/34f4d907-9f78-86ea-dfb0-5f65081e4ee4.png)


```opening.txt
[間接打ち]
┼┼┼┼１　間接1号～12号：
┼┼┼○２　　長星・峡月・恒星・水月・
┼┼●６３　　流星・雲月・浦月・嵐月・
┼11９７４　　銀月・明星・斜月・名月
Ｘ1210８５　(Ｘは彗星と呼ぶ)

[直接打ち]
┼┼１２３　直接1号～12号：
┼┼○４５　　寒星・渓月・疎星・花月・
┼┼●６７　　残月・雨月・金星・松月・
┼┼８９10　　丘月・新月・瑞星・山月
┼┼1112Ｙ　(Ｙは遊星と呼ぶ)
```

　**[ところがどっこい、そうじゃありません……！次からが現実です、これが現実……！](http://dic.nicovideo.jp/a/%E3%81%A8%E3%81%93%E3%82%8D%E3%81%8C%E3%81%A9%E3%81%A3%E3%81%93%E3%81%84........%E5%A4%A2%E3%81%98%E3%82%83%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93........!)**

## 五珠二箇所指定打ち
　指定打ちで平和になったのも束の間、研究が進むと**間接・直接1～12号のほとんどで黒が勝ってしまう**ことが判明します。もちろん「あえて黒が勝つ方向の定石にして黒のミスを待つ」戦術もアリなのですが、流石に公平ではありませんので更にルールが追加されました。
　それがこの**「五珠二箇所指定打ち(3手目まで指定打ちし、4手目も普通に打ち、5手目は黒が2箇所指定し、どちらかを白が選択する)」**です。これにより、とりあえず均衡は保たれるようになりました。

## 三珠交替打ち
　しかし五珠二箇所指定打ちだと、定石のせいで**打たれるパターンが比較的偏ってしまう**といった難点がありました。そこで、**「三珠交替打ち(仮黒が三手目までの形を示し、仮白が先後のどちらを持つかを決める)」**が[現在の日本における公式ルールになっている](http://www.kyogo.org/contents/kouza/river01/river01_01.html)そうです。

## 題数打ち・四珠交替打ち・五珠交替打ち
　[詳細はこちらにあります](http://rulebook.kyogo.org/kaikyoku.html)が、主に国際大会で提案されているものです。つまり、何度も先後を入れ替える判断を行わせることで、**なるべく先後均衡、かつ幅広い開幕を迎えられるようにする**ためのものです。

# 定石編
　連珠における定石は、オセロや将棋や囲碁の定石(定跡)とは多少事情が異なります。なにせ**随意打ちだと黒が勝ってしまう**ので、「数手進めた局面からの定石」の集合体として定義されるからです。とは言っても、**「データベースを参照しつつ、可能な中で最善と思われる手を打つ」**といった基本的な部分は変わりありません。
　ただ、なにげにマイナーなゲームだけあって、定石データをかき集めるのは苦労します。データベースを搭載したソフトの一つとして[伊達五目](http://www.vector.co.jp/soft/win95/game/se067096.html)がありますが、それを超える勢いで広範囲に渡り集める必要があるでしょう。確か海外のソフトでそうしたデータベースがあったはずですが、リンクを失念しました……。

# 参考文献
・「日本連珠社」(http://www.renjusha.net/)
・「連珠プログラムを作ってみるブログ」(http://ameblo.jp/quincomet/)
・「五目競争公式ガイド」(http://hp.vector.co.jp/authors/VA009422/5guide0.txt)
・「ルール（対局規定）の変遷史」(http://www.renjusha.net/database/oldrule.htm)