LoginSignup
10
9

More than 5 years have passed since last update.

コンピュータ将棋製作記 その1

Last updated at Posted at 2015-01-20

この記事について

ふとした思いつきでコンピュータ将棋を作ることになったので、そのメモを書いていきます。

制作開始時の目標

制作開始決定は2015年1月16日、コードを書き始めたのは1月20日

  • 羽生さんに勝てるくらい強いソフトにする(ネタソフトにしない)
  • 2015年5月のコンピュータ将棋選手権に出す

友人と一緒に開発をする。途中で方針をがらっと変えることも十分あり得る。相談の結果、しばらくはバラバラに作ってお互いに様子を見てみることにする。

前提知識

何も知らないので調べながら。

https://chessprogramming.wikispaces.com :素晴らしいサイト。コンピュータチェスの話だけれど、将棋に応用が効く内容もたくさんある

心構え

Getting Start: https://chessprogramming.wikispaces.com/Getting+Started

When writing an engine, it is extremely important to write bug free code. The best strategy when starting a new engine is to create a debugging framework under it so that every single piece of code gets tested, no matter how simple it looks. Many experienced engine authors have ended up rewriting their engines because they have become unmanageable due to bugs.

バグのないコードを書くのがとてつもなく重要である、とのこと。どんなに簡単そうな部分に見えても、全てのコードのテストを書くのがベスト、と言っている。テストあまり好きではないが、検討したほうがいいだろう。

また、デバッグのしやすさには気をつけたほうが良さそうだ。今のところC言語で書くことを想定しているけれど、debug系の関数はたくさん作るようにしよう。

方針

とりあえずC言語で作り始める。作ってから思ったけど、最初は適当なLLを使ったほうが良かったかも。

盤の表現方法

Board Representation: https://chessprogramming.wikispaces.com/Board+Representation

チェスエンジンと同じように、ピース中心かマス中心かの選択をする必要がある。はやりのbitboardはピース中心。演算がとにかく速いが、効きの計算がちょっと大変そう。

とりあえず最初ということで、実装が楽そうなマス中心の選択をしてみる。速度が出なくなったら作りなおす(数回作りなおすつもり)。

採用した盤の表現は10*12形式にした(将棋の場合は11x13)。番兵を周囲に配置してオーバーフローの計算を省く。構造体はこんな感じ。

typedef struct _Board {
    int board[BOARD_WIDTH * BOARD_HEIGHT];
    int mochigoma[2][8]; // [sente/gote][type < OU]
    int turn;
    int moves;
    int check_repeatition;
} Board;

最初のコード

とりあえず以下のコードを作った
・盤面の初期化
・SFENの入出力
・人が見られる盤面表示機能

SFENは大変便利なのでサポートすべき。下のページで解説がある。
USIプロトコルとは: http://www.geocities.jp/shogidokoro/usi.html

初期状態はこれ
lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1

人が見られる盤面は、KI2と互換性を持たせた。

lr6l/4k1g2/2+B2S1pp/ppp2Sp2/9/P1PpNPP2/1PGG4P/7R1/L1K5L w S4Pbgs3np 1
この入力に対し、出力はこう


後手の持駒: 角 金 銀 桂三 歩
  9 8 7 6 5 4 3 2 1
+---------------------------+
|v香v飛 ・ ・ ・ ・ ・ ・v香|一
| ・ ・ ・ ・v玉 ・v金 ・ ・|二
| ・ ・ 馬 ・ ・ 銀 ・v歩v歩|三
|v歩v歩v歩 ・ ・ 銀v歩 ・ ・|四
| ・ ・ ・ ・ ・ ・ ・ ・ ・|五
| 歩 ・ 歩v歩 桂 歩 歩 ・ ・|六
| ・ 歩 金 金 ・ ・ ・ ・ 歩|七
| ・ ・ ・ ・ ・ ・ ・ 飛 ・|八
| 香 ・ 玉 ・ ・ ・ ・ ・ 香|九
+---------------------------+
先手の持駒: 銀 歩四
<pre>使っているのにズレるのは納得行かないな

これを用意していたおかげで、何かおかしい時に盤面を見ながらチェック出来るようになった。

TODO

  • 結局テストを書いていない

テストは、stdinでテスト指示を受け取りstdoutに出力し、その結果をPythonで見る方法でやろうと思っている。

  • 全ての可能な手を出力するコードを書く

最多合法手局面: http://ameblo.jp/professionalhearts/entry-10001031814.html

とりあえず、この局面から593通りの出力が得られるようにする。このSFENはこちら
"R8/2K1S1SSk/4B4/9/9/9/9/9/1L1L1L3 b RBGSNLP3g3n17p 1"

さっき書き終わったけど、上の局面だと王手無視とか打ち歩詰めとか二歩とかがチェック出来ないので、そういったテストも書かないと。

次回はテストを書いて、可能な手全出力の実装を完了するようにしよう。

短期目標

金曜夜(23日夜)までに、floodgateでランダムを走らせる。

floodgate: http://wdoor.c.u-tokyo.ac.jp/shogi/floodgate.html

10
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
9