コンピュータ将棋を始めるにあたって便利な「OpenShogiLib」をサクッと動かしてみた
電王戦が盛り上がっている昨今、コンピュータ将棋を目にする機会も増えました。
そんな中、手にとってみた本がこちら。
コンピュータ将棋の歴史から、アルゴリズム解説、今後のコンピュータ将棋と人間との付き合い方など、
非常に興味深い内容で面白かったです。
エンジニアとしてプログラムを書いている身、そして将棋も好きというのですから、
コンピュータ将棋をやらないわけにはいかないでしょう!
ということで手始めに作ったのがこちら。
すみませんでした。これは何もコンピュータ将棋をしていませんね。
作ってたのはコンピュータおばあちゃんでした。
話は変わり、自分が学生時代の時です。
五目並べが好きで、C言語を使って2人対戦ゲームを作りました。
GrWinというC言語のペイントライブラリを使って作りました。懐かしい!
碁盤目を描くところから始まり、碁石を置く操作、置けない位置ではエラーを出す、そして勝敗判定。
ひと通りプログラムを作り、遊べる状態にはできました。
そこでふと、「CPU対戦作りたいな」と思いました。ぼっち思考。
作り始めると本当に面白くて、軽く2日間徹夜していた記憶があります。
でも、プログラミングの基本を全く知らなかったので、某有名画像「if文の波動拳」的なものがたくさんありました。
ifの山脈ですね。
それでも「一体どうやったら勝敗判定ができるのか」「最善手をどうやって導き出すか」を考えるのはすごく楽しく、
評価関数をの精度向上に没頭していたのを覚えています。
結果、CPU対戦もできるようになりました。自分の思考をそのままコピーしたような手を打ちます。
一瞬で打ってしまうので、ランダムに1〜5秒くらいsleepを入れて人間味を持たせたり。
友人と対戦させて初勝利した時は、本当に嬉しかったですね。あの興奮は本当に忘れられません。
前置きが長くなりましたが、こういう経験があるせいか、コンピュータ将棋に情熱をかける方々の気持ちはすごくわかる気がしています。
「我が子のように」ということもすごくわかります。
たまに変なところに打ってしまうのが可愛く思えてくるんですよね。
五目並べの自作CPUを作ってから10年。
機械学習の知識やプログラミングの知識は、あの頃から比べると向上しているはずなので、
空き時間を使ってコンピュータ将棋についていろいろ勉強してみるかー、と思ったのがきっかけです。
その第一歩として、東京大学大学院総合文化研究科(GPS将棋を制作)から配布されている高速将棋ライブラリ、「OpenShogiLib」を使ってみました。
サクッと動くので、興味ある方は動かしてみてください。
動かしてみる
環境は 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 を動かしたところまでできたので、もうちょっと遊んでみます。