hubotと戯れてみる #3 slackとhubotでオセロゲーム。とりあえず石を置いてみる

hubotと戯れてみる #3 slackとhubotでオセロゲーム。とりあえず石を置いてみる

ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

slack上でhubotを利用してオセロゲームを作っています。今回は石を置いてターンを変更するまでを実装します。前回はslack上からオセロゲームを始めるまでを実装しました。

#1 slackと連携するhubotを3分でインストールする。(動画付き)
#2 slackとhubotを利用してオセロゲームを作ってみる。
#3 slackとhubotでオセロゲーム。とりあえず石を置いてみる。 ← 今ここ
#4 slackとhubotでオセロゲーム。石をひっくり返す。
#5 slackとhubotでオセロゲーム。華麗なるエンディング? 

slackとhubotでオセロゲーム編

石を置けると、ぐっとオセロゲーム感が出てきます。

まずは、石を置くメッセージを認識するようにします。
[sh] robot.hear /navico set(s[ABCDEFGH]{1}[12345678]{1})/i, (msg) ->
[/sh] これで、navico set [A-H][1-8]というメッセージに反応するようになります。

処理の流れはこんな感じー

  1. ボードの状態とターンの状態を取得します。
  2. メッセージから指示された石を置く座標を抜き取ります。
  3. 盤上に石を置きます。
  4. ターンをチェンジします。
  5. 盤上の情報とターン情報を保存します。
  6. メッセージを返します。

では、実装します。

1.ボードの状態とターンの状態を取得します。簡単です。

[sh] bordArray = robot.brain.get(“ba”)
turn = robot.brain.get(“turn”)
[/sh] robot.brain.setで保存した情報をrobot.brain.getで取得できます。

2.メッセージから指示された盤上の位置を抜き取ります。

[sh] point = msg.match[1] x = parseInt(point[2],10) – 1
y = parseInt(point[1],16) – 10
[/sh]

point = msg.match[1]について
msg.match[0]は、全メッセージ
msg.match[1]は、正規表現で抽出されたメッセージが入ってきます。

x = parseInt(point[2],10) – 1について
point[2]で抽出したメッセージの2番目の文字を指定
文字列を数値に変換
数値から-1をしています。これは、盤上が1~8までなのに対して、 hubotが記憶している配列が0~7のため -1をしています。

y = point[1].charCodeAt(0) – 65
point[2]で抽出したメッセージの1番目の文字を指定
文字[A~H]を文字コードに変換。
変換すると65~72となるので、-65することにより配列にマッピングしています。
y = parseInt(point[1],16) – 10について
point[2]で抽出したメッセージの1番目の文字を指定
文字列を数値に変換。
文字列を16進数から10進数の数値に変換。
数値から-10をしています。これは、盤上がA~Hに対してhubotが記憶している配列が0~7のため、A~Hを16進数として扱い10進数に変換することにより10~17を得ます。そこから-10をすることにより配列にマッピングしています。

* 2015.6.4 誤りがありましたので修正致しました。

これで、指定されたx,yの値を得ることができました。簡単です。

3.盤上に石を置きます。

正確には、ボード情報を格納している配列を更新します。
[sh] bordArray = updateBord(bordArray,list,x,y,turn)
[/sh] updateBord関数も簡単です。
※引数のlistは、ひっくり返す石の座標が入る予定です。今回は利用しません。

[sh] updateBord = (ba,lists,x,y,turn) ->
stone = if turn == “black” then “●” else “○”
ba[x][y] = stone
return ba
[/sh]

4.ターンをチェンジします。

[sh] turn = changeTurn(turn)
[/sh] changeTurn関数は、1行で終わり。
[sh] changeTurn = (turn) ->
if turn == “black” then “white” else “black”
[/sh]

5.盤上の情報とターン情報を保存します。

robot.brain.setで、情報を保存するだけです。
[sh] robot.brain.set(“ba”,bordArray)
robot.brain.set(“turn”,turn)
[/sh]

6.メッセージを返します。

outputBord関数は、前回作成しました。
[sh] msg.send outputBord(bordArray)
msg.send “次は、” + outputTurn(turn) + “のターンです。”
[/sh] ↓前回と同じURLでいいです。
本日作成したファイルは、こちらに置いてあります。

次回は、石をはさんでひっくり返していきます。

後に

先日、社内でChatopsのプレゼンを行う機会があり、 one more thing のパートでこの連載のhubotを披露しました。なかなかいい笑いが取れて満足です。笑いって大事ですよね。

ソフトバンク・au・ドコモの方は、公式のオンラインショップを利用すれば頭金不要で通常のショップよりお得に購入できます。

【週刊bitWave】(メルマガ)始めました!

登録はこちらからメールアドレスを入力してお申込みください。

ご登録いただいたメールアドレスは 【週刊bitWave】の更新情報の配信にのみ使用します。

個人情報の取扱いに関しては、「プライバシーポリシー」をご確認ください。解除はいつでもこちらから行うことが可能です。

あなたにおすすめ