読者です 読者をやめる 読者になる 読者になる

圧倒亭グランパのブログ

圧倒的おじいちゃんを目指して

コンピュータ将棋を始めるにあたって便利な「OpenShogiLib」をサクッと動かしてみた

電王戦が盛り上がっている昨今、コンピュータ将棋を目にする機会も増えました。

そんな中、手にとってみた本がこちら。

http://www.amazon.co.jp/%E4%BA%BA%E9%96%93%E3%81%AB%E5%8B%9D%E3%81%A4%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E5%B0%86%E6%A3%8B%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9-%E7%80%A7%E6%BE%A4-%E6%AD%A6%E4%BF%A1/dp/4774153265

Amazon CAPTCHA

 

コンピュータ将棋の歴史から、アルゴリズム解説、今後のコンピュータ将棋と人間との付き合い方など、

非常に興味深い内容で面白かったです。

 

エンジニアとしてプログラムを書いている身、そして将棋も好きというのですから、

コンピュータ将棋をやらないわけにはいかないでしょう!

ということで手始めに作ったのがこちら。

slackで将棋を指したい - 圧倒亭グランパのブログ

 

すみませんでした。これは何もコンピュータ将棋をしていませんね。

作ってたのはコンピュータおばあちゃんでした。

 

話は変わり、自分が学生時代の時です。

五目並べが好きで、C言語を使って2人対戦ゲームを作りました。

GrWinというC言語のペイントライブラリを使って作りました。懐かしい!

GrWin/GrWinC

碁盤目を描くところから始まり、碁石を置く操作、置けない位置ではエラーを出す、そして勝敗判定。

ひと通りプログラムを作り、遊べる状態にはできました。

 

そこでふと、「CPU対戦作りたいな」と思いました。ぼっち思考。

作り始めると本当に面白くて、軽く2日間徹夜していた記憶があります。

でも、プログラミングの基本を全く知らなかったので、某有名画像「if文の波動拳」的なものがたくさんありました。

ifの山脈ですね。

それでも「一体どうやったら勝敗判定ができるのか」「最善手をどうやって導き出すか」を考えるのはすごく楽しく、

評価関数をの精度向上に没頭していたのを覚えています。

 

結果、CPU対戦もできるようになりました。自分の思考をそのままコピーしたような手を打ちます。

一瞬で打ってしまうので、ランダムに1〜5秒くらいsleepを入れて人間味を持たせたり。

友人と対戦させて初勝利した時は、本当に嬉しかったですね。あの興奮は本当に忘れられません。

 

前置きが長くなりましたが、こういう経験があるせいか、コンピュータ将棋に情熱をかける方々の気持ちはすごくわかる気がしています。

「我が子のように」ということもすごくわかります。

たまに変なところに打ってしまうのが可愛く思えてくるんですよね。

 

五目並べの自作CPUを作ってから10年。

機械学習の知識やプログラミングの知識は、あの頃から比べると向上しているはずなので、

空き時間を使ってコンピュータ将棋についていろいろ勉強してみるかー、と思ったのがきっかけです。

その第一歩として、東京大学大学院総合文化研究科(GPS将棋を制作)から配布されている高速将棋ライブラリ、「OpenShogiLib」を使ってみました。

  OpenShogiLib - PukiWiki

サクッと動くので、興味ある方は動かしてみてください。

 

動かしてみる

環境は Mac + docker です。

boot2docker

以下からpkgファイルをダウンロードし、インストールするだけです。

Releases · boot2docker/osx-installer · GitHub

その後、初期化作業。

$ boot2docker init

表示される環境変数を設定してください。

そして、boot2dockerを起動。

$ boot2docker up

この辺りは、boot2dockerで検索すれば、多数の記事がヒットします。

 

Dockerfile

ディレクトリを用意し、Dockerfileを作ります。

$ mkdir shogi
$ cd shogi
$ vim Dockerfile

Dockerfileは以下です

FROM ubuntu:latest
RUN apt-get update
RUN apt-get install -y gcc
RUN apt-get install -y libboost-dev build-essential libboost-date-time-dev
RUN apt-get install -y vim
RUN apt-get install -y libosl-dev libosl-doc
RUN useradd -m -s /bin/bash shogi
RUN echo 'shogi:password' | chpasswd
RUN echo 'shogi ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/shogi

ライブラリのインストールやユーザーの作成などをしています。

適宜変更してください。

 

docker build

Dockerfileをもとにイメージを作成します。

$ docker build -t shogi/shogi .

イメージが作成されたら起動。

$ docker run -d -t -i shogi/shogi su shogi

attachしてログイン。

$ docker attach [動作中のコンテナID]

 

将棋プログラムを動かす

参考にさせていただいたプログラムはこちらです。

Maraigue風。:将棋の盤面や指し手などを扱えるライブラリ「OpenShogiLib」を使ってみた

こちらのプログラムをお借りし、shogi.cpp というファイルを作ります。

そしてコンパイル、実行。

$ g++ shogi.cpp -losl -lboost_date_time
$ ./a.out
Move #1: OK
invalid player move : Move(+,PAWN,Square(76)->Square(75))
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI *  *  *  *  * -KA *
P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
P4 *  *  *  *  *  *  *  *  *
P5 *  *  *  *  *  *  *  *  *
P6 *  * +FU *  *  *  *  *  *
P7+FU+FU * +FU+FU+FU+FU+FU+FU
P8 * +KA *  *  *  *  * +HI *
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
-
Move #2: OK
Move #3: OK
Move #4: OK
 No such move1 : Move(+,PAWN,Square(28)->Square(78))
Move #5: OK
Move #6: OK
P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
P2 * -HI *  *  *  *  * -KA *
P3-FU * -FU-FU-FU-FU * -FU-FU
P4 *  *  *  *  *  * -FU *  *
P5 * -FU+FU *  *  *  *  *  *
P6 *  *  *  *  *  *  *  *  *
P7+FU+FU * +FU+FU+FU+FU+FU+FU
P8 * +KA+HI *  *  *  *  *  *
P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
+

出来ました!

 

今後

今後の構想はいくつかあります。

 ・df-pn探索を用いて、詰将棋プログラムを作る
 ・必至を解くプログラムを作る
 ・社内botを社内一の将棋おばあちゃんに育てる

面白くなってきました。

あの学生の頃の情熱が蘇ってきます。

とりあえず、OpenShogiLib を動かしたところまでできたので、もうちょっと遊んでみます。