hubotと戯れてみる #4 slackとhubotでオセロゲーム。石をひっくり返す。

hubotと戯れてみる #4 slackとhubotでオセロゲーム。石をひっくり返す。

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

slack上でhubotを利用して絶賛オセロゲームを作っています。今回は石をひっくり返す処理を作ります。ここが実装できればslackとhubotでオセロゲームの完成はすぐそこです。前回は石を置きターンを変更するまでを作りました。

slackとhubotでオセロゲーム編

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

処理の流れ

前回はただ石を置いただけですので、盤上のどこでも置くことができてしまいました。また、既に石が置いてある場所にも置くことができたのでここらへんにも対応していきます。

処理の流れはこんな感じ、前回の流れに少し手を加えていきます。

  1. ボードの状態とターンの状態を取得します。 ← 前回作りました。
  2. メッセージから指示された石を置く座標を抜き取ります。 ← 前回作りました。
  3. 石が置ける場所か判定する。 ← 新たに追加
  4. ひっくり返す石を判定する。 ← 新たに追加
  5. 盤上に石を置きます。 ← 前回作ったものを修正
  6. ターンをチェンジします。 ← 前回作りました。
  7. 盤上の情報とターン情報を保存します。 ← 前回作りました。
  8. メッセージを返します。 ← 前回作りました。

では、実装します。

3.石が置ける場所か判定する。 [ 追加 ]

[javascript] if !checkPosition(bordArray,x,y)
msg.send “置けません。”
return
[/javascript]

checkPosition関数は、簡単です。
配列の中身を見て□ならOKで、それ以外はNGを判断すれば良いです。

[javascript] checkPosition = (ba, x, y) ->
isEmpty = if ba[x][y] == “□” then true else false
[/javascript]

4.ひっくり返す石を判定する。 [ 追加 ]

新たな関数を8個作成します。

この関数は置いた石を基準にして8方向にひっくり返す石を判定するものです。戻り値listには、関数が呼ばれるたびにひっくり返す石の情報が追加されていきます。

1つの関数にしても良いですが今回は分割しています。そのため同じようなロジックを書くことになりましたが、何を行っているのかはわかりやすいかと思います。

最後にlistの中が空っぽの場合には、ひっくり返せる石がないという事なので、石を置けない旨をメッセージで返しています。
[javascript] list = [] list = checkUe(bordArray,list,x,y,turn)
list = checkShita(bordArray,list,x,y,turn)
list = checkMigi(bordArray,list,x,y,turn)
list = checkHidari(bordArray,list,x,y,turn)
list = checkMigiUe(bordArray,list,x,y,turn)
list = checkMigiShita(bordArray,list,x,y,turn)
list = checkHidariUe(bordArray,list,x,y,turn)
list = checkHidariShita(bordArray,list,x,y,turn)

if list.length == 0
msg.send “置けません。”
return
[/javascript]

関数は、冗長になるので省略します。

5.盤上に石を置きます。 [ 修正 ]

updateBord関数を修正します。修正とはいっても2行追加するだけです。listsにひっくり返す石の位置が入っているので、そこに自分の色の石を設定していくだけです。
[javascript] updateBord = (ba,lists,x,y,turn) ->
stone = if turn == “black” then “●” else “○”

ba[x][y] = stone

 #追加した箇所
for list in lists
ba[list[1]][list[0]] = stone

return ba
[/javascript]

本日作成したファイルは、こちらに置いてあります。

最後に

最近ansibleのような第三世代の構成管理ツールが気になっています。
本番サーバーに追加でなにか入れる必要がないという点がとても魅力!!実はPythonが必要という落とし穴はあるんですが・・・。

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

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

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

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

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

あなたにおすすめ