Lento con forza

大学生気分のIT系エンジニアが色々書いてく何か。ブログ名決めました。

Slackで将棋を動かしてみる

土曜日の夜のことです。ふと友達とslackで話していて将棋がやりたいね。という話になりました。

当然将棋をやるためには、将棋盤と駒が必要で、それらを動かし、更にその状態を最低2者間で共有する必要があります。手軽に無料でこれらの事がどのような環境でもできるサービスは私達の知るところ存在しません。近いところで言えば、将棋倶楽部24や、将棋ウォーズでしょうか。それらでさえも、有料であったり、時間制限が強要され友達同士で自由に対局を行いにくいという問題を抱えています。幸いにも僕たちはエンジニアで、ないものは創りだす事ができます。当然今回も手軽にできてマルチプラットフォームの将棋を作ろうという事になりました。

Slackというプラットフォーム

皆さんはSlackというサービスをご存知でしょうか。社内チャットとして有用だと言うことで広まったこのサービスですが、現在においてはオープンソースコミュニティで使われているなど、多様な使われ方をしています。家族で使用している例や、友達同士で利用する例、更には恋人同士で利用する例すらもあります。僕も所属している会社のSlack-teamの他に、学生時代のスタートアップのSlackや、バンド仲間でのSlack等に所属しています。Slackの有用な点の一つとして、Slackはチャットプラットフォームだけではなくゲームプラットフォームとしても使うことができるという事があげられます。

今回将棋を実装するためのプラットフォームとしてSlackを選択したわけですが、理由としては以下の事柄があげられます。

  • 将棋はバンドSlackに入っているメンバーとやることが多い(個人的な理由)
  • Windows, Mac, iPhone, Android, ブラウザ等、多様なプラットフォームでの使用が可能
  • 特に実装をしなくても通知が可能
  • 特に実装をしなくてもチャットが可能
  • 特に実装をしなくても観戦が可能

個人的な理由は抜きにしても、Slackで実装するメリットはとても多いことがわかると思います。チャットや観戦機能は実装するのがとても面倒なので、その部分の実装を省けるのはいいですね。また、Slackのチームには将棋が強い人がいることが多く、その人からアドバイスがもらえるという嬉しい副作用もあります。

実装方法

盤面を表現する方法として、絵文字を採用しました。Slackには自由に絵文字を登録することができ、登録した絵文字はテキストで参照できます。テキストで参照できる絵文字はとても扱いやすいフォーマットです。具体的には以下のようなテキストがその下の画像のような形に変換されます。

:slackshogisss_kyou_enemy::slackshogisss_kei_enemy::slackshogisss_gin_enemy::slackshogisss_kin_enemy::slackshogisss_ou_enemy::slackshogisss_kin_enemy::slackshogisss_gin_enemy::slackshogisss_kei_enemy::slackshogisss_kyou_enemy:
:slackshogisss_mu::slackshogisss_hi_enemy::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_kaku_enemy::slackshogisss_mu:
:slackshogisss_fu_enemy::slackshogisss_fu_enemy::slackshogisss_fu_enemy::slackshogisss_fu_enemy::slackshogisss_fu_enemy::slackshogisss_fu_enemy::slackshogisss_fu_enemy::slackshogisss_fu_enemy::slackshogisss_fu_enemy:
:slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu:
:slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu:
:slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu:
:slackshogisss_fu::slackshogisss_fu::slackshogisss_fu::slackshogisss_fu::slackshogisss_fu::slackshogisss_fu::slackshogisss_fu::slackshogisss_fu::slackshogisss_fu:
:slackshogisss_mu::slackshogisss_kaku::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_mu::slackshogisss_hi::slackshogisss_mu:
:slackshogisss_kyou::slackshogisss_kei::slackshogisss_gin::slackshogisss_kin::slackshogisss_gyoku::slackshogisss_kin::slackshogisss_gin::slackshogisss_kei::slackshogisss_kyou:

f:id:kouki_dan:20160719001859p:plain

盤面を表現するためには30個近くの絵文字を登録する必要があります。これを手作業で行うのは辛かったので、絵文字を自動で登録するスクリプトを作成しました。仕組みとしては、Mechanizeを使ってslackにログインし、自動で絵文字をどんどん登録していくものになっています。IDとパスワードを必要としているのは、Slackには現在絵文字を登録するAPIが存在しなく、Web UIからでしか登録する事しかできないからです。Slack社には絵文字登録APIを早く公開していただきたいです:pray:

絵文字が登録できたら、あとは将棋を管理するbotを作って、うまく将棋のルール通りに動かすだけでSlack上で将棋の対局ができます。実際に作ったものが以下にあります。

github.com

仕組みとしては、Slackに用意されているBot Integrationを使用し、RTM APIから入力を受け付け、対応した局面の図を表示する、極めて一般的な将棋の作りになっています。
Slack Botの弱点として、入力が制限されてしまう事がしばしばあげられますが、将棋を作る上でもここは大きな課題でした。幸いにも、将棋には、棋譜の表記方法が一般的で、「76歩」や、「34歩」等といった、言葉で駒の動きを一意に特定できる方法が定まっています。今回はこれを利用し、駒を動かす事に成功しました。

「76歩」「58金右」「13歩成」「55金打」などのように駒の動きをbotに伝えることで、bot上に持っている盤面が動き、それをbotが絵文字データとして投稿することで対局者、観戦者へのフィードバックを行います。これを繰り返す事で対局が進んでいき、終局まで将棋を指すことができます。

いくつか対局中の図を添付します。 f:id:kouki_dan:20160719003518p:plain

f:id:kouki_dan:20160719003546p:plain

もちろん、駒が本来動かせないところには動けないし、手番の人しか動かせない機能もついています。

f:id:kouki_dan:20160719003756p:plain f:id:kouki_dan:20160719003935p:plain

もちろん手駒の機能も、それを打つ機能も、成る機能もあります。 f:id:kouki_dan:20160719004220p:plain f:id:kouki_dan:20160719004301p:plain

Botを作る事でSlack上で完璧に将棋の対局を行う事ができるようになったのがわかると思います。

まとめ

チャットを遡ったところ、一昨日、土曜日の夜24時17分からこのプロジェクトがスタートしていました。現在は月曜日の24時過ぎです。作りはじめた時はまともに動くものができると思ってなかったのですが、48時間経った今は予想以上にうまく動いている将棋Botができていて、自分でも驚いています。
また、多分どのslack-teamでもPython3系さえ入っていれば動くと思うので、試したい方はgithubから試していただければと思います。 まだBeta版なのでうまく動かない点や改良点等あると思いますが、IssueやPRなどに残していただけると助かります。

一緒に作ってくれたよっしーmillayアチャチャに感謝です。みんな一緒にSlackで将棋ライフを送ろうぜ!!