コンピュータ将棋実装の話

「コンピュータ将棋 Advent Calendar 2016」の二番手の熊谷です。よろしくお願いします!
「コンピュータ将棋 Advent Calendar 2016へのリンクはこちら。
http://www.adventar.org/calendars/1457

何を書こうか未だに悩んでいるのですが、昨日カツ丼将棋さんからリクエストされたNoviceが動くまでの話とコンピュータ将棋の実装周りの話を少し書こうかなと思います。


・Noviceが動くまで

僕はコンピュータ将棋のためだけにプログラミングを始めたのですが、それが去年の3月のこと。

最初は1手先だけ読んで動かせるプログラムを作ろうと思ったのですが、それすらもままならず。

ネットで最初に読むべきソースコードはれさぴょんという話を見て、れさぴょんを読もうとするも全く理解できずに挫折。

まあ今考えればプログラミングを始めたばかりの素人がれさぴょんのソースコードを読めるはずもないわけですがw

結局、全て我流で2ヶ月作ったらなんとか動くものが出来ました。

このときの実装は本当にひどいもので、当時の僕は関数の再帰呼び出しができることを知らず読む深さ分だけ関数を増やすという実装でしたw

まあでも、初めて動いたときの喜びは未だに忘れられないものになっています。

この喜びがNoviceを作り続けることへのきっかけになったと思います。

・コンピュータ将棋実装周りの話

コンピュータ将棋の実装って大変じゃないかと色んなひとに聞かれるのですが、

動かすまでならそんなに難しくないというのが僕の考えです。

段階を踏んで少しずつ実装を行っていけばいいんじゃないかなと思います。

ここでは、その段階の話を書きます。

STEP1 将棋盤で初期局面を表示する
 
 ボードゲームは配列を使って表現するのに非常に分かりやすいものです。

 例えば将棋なら9✕9の計81マスの盤を Board[9][9] などで表現すればいいわけです。

 マスにある駒の表現は数字を使います。

 空きマスなら0、先手の歩なら1、後手の歩なら16みたいなかんじです。

 初期局面を表示するならBoard[0][0] = 17(後手の香) みたいに一つずつ配列に入れていき、

 for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 9; j++)
{
printf("[%d]",Board[i][j]);
}
printf("\n");
}

 のように表示すれば良いわけです。

 ただし、このままだと数字でしか表示されないです。

 これを文字で表示するところは考えてみてください。

STEP2 手の入力を可能にする。
 
 STEP1のままだと、初期局面を表示するだけになってしまいます。
 
 これを、駒をうごかせる将棋盤にしてみます。

 実装は簡単で、scanfでfromの段、筋、toの段、筋を入力してもらい

Board[to段][to筋] = Board[from段][from筋];
Board[from段][from筋] = 0;

として、局面を再度表示すれば将棋盤が出来ます。

 ただし、これだけでは成りの処理などが出来ないので別途その処理も追加する必要があります。

 ここではヒントだけ示しておきます。

 先手の歩の番号は1、先手のとの番号は9であることを考えてみてください。

STEP3 内部の思考エンジンをつくる

 いよいよ思考エンジンを作る所ですが、ここについての記事を以前書いたのでそれを共有し説明とさせて頂きます(ごめんなさい)

 novice.hatenadiary.jp


STEP4 様々なサイトを参考に作りこんでいく

 いくつかお世話になったサイトを紹介させて頂きます。

 うさぴょん作者の池さんのサイトです。
  非常にシンプルな実装になっている解説です。(一番のおすすめです)
  将棋プログラムの作り方

  れさぴょんの解説が載っています。
  コンピュータ将棋のアルゴリズム

 YSSの山下さんのサイトです。
  YSS 7.0‚Ì‹Zp‰ðà

 クマ将棋さんのサイトです。主にソースコードが参考になります。
  http://suzumer.web.fc2.com/simk.htm


STEP5 大会に出る

 世界コンピュータ将棋選手権
 コンピュータ将棋協会

 電王トーナメント
 denou.jp

 以前、強くならないと大会に出ても.....みたいなお話をされている方にお会いしましたが、

 コンピュータ将棋界にはネタ勢という概念があります。弱いからこそ面白い将棋を指すソフトたちです。

 実は現在最強の呼び声高いPonanzaも元々はBonanzaを文字ったネタ勢だったのです。

 なので、ソフトが少しでも動くなら積極的に大会に出るといいと思います。

 コンピュータ将棋界の人たちは非常に良い人、面白い人が多いです。絶対、良い経験になると思います。

STEP6 時には休む

 休憩しましょう。

いかがだったでしょうか?
この記事がコンピュータ将棋を始められる方々のきっかけになれば幸いです。
では、wcsc27でお会いいたしましょう。