拾って落とすエンジニア活動ログ

各種技術や周辺知識のTIPS、振り返り

プチ海戦ゲーム 対戦☆Battleship 作ってみた

f:id:yb300k:20170121233036p:plain

プランニングポーカーBOTを人に紹介したところ、自分が見積するより前に人の回答見えないほうが面白いのでは・・・という声をいただきました。

なるほど、グループにBOTを追加するのではなく、会話はBOTと私だけ。他人はBOT経由でないと話さない(=情報つつぬけにならない)というBOTハブ型を考えたのですが、これって対戦ゲームに使えそう!と思い付き。

 

で、作ってみました。LINEの友だち追加からぜひ友だちになってください!

http://qr-official.line.me/L/2Ulj1Lk_1w.png

友だち追加   @pvo7474n

 

#ひとりでまずやってみるかと思った場合は、対BOT(ゲームキー1000)、あるいは、自分対自分で試してみることもできます・・

紹介動画はこちら!

youtu.be

 

ゲームの始め方

f:id:yb300k:20170128225840j:plain

    1. LINEで上記BOT 「対戦☆Battleship」 を友達に追加してください。
    2. (自分のゲームキーが表示されます。)
    3. 一緒にゲームしたい人にも、上記BOTの友達になってもらい、ゲームキーを教えてもらってください(口頭でもLINEでもメールでも)。
    4. ボードメニュー(リッチメニュー)から、対戦申込/やめる を選びます。
    5. ゲームキーを聞かれるので、一緒にゲームしたい人のゲームキーを入力。

 

ゲームキーに自分のキーを入力すると、自分対自分でゲームをすることもできます。でも、相手の持ち駒に命中することがないのでゲームは終わりません!

なぜか?それは以下のルールで。。

 

ゲームのルール

  • KingとQueenが自分の持ち駒です。
  • 持ち駒が相手の攻撃によって全滅したら負けです。
  • ゲームの最初は、持ち駒をマップ上の1~16 の場所に自由に配置できます。ただしKingとQueenを同じ場所には配置できません。
  • Kingは2回攻撃を受けるとアウトです。Queenは1回攻撃を受けるとアウトです。
  • 自分の持ち駒の場所は、自分にしかわかりません。対戦相手がどこに持ち駒を置いたかを想像しながら、攻撃を行います。
  • f:id:yb300k:20170128224824p:plain

  • 自分のターンでは、Kingの攻撃または移動、Queenの攻撃または移動の合計2回行動可能です。逆に言うと、行動しないで相手ターンに移ることはできません。
  • ルール説明動画はこれ。
  • www.youtube.com

 

攻撃について

  • 攻撃可能な場所は、自分の持ち駒の周囲8方向です。斜め方向にも攻撃できます。自分の居る場所には攻撃できません。また、自分の持ち駒が置いてある場所にも攻撃できません。以下はKingが攻撃可能な場所の例です。9(Q)の位置はQueenが居なければ攻撃可能です。

f:id:yb300k:20170109014534p:plain

  • 攻撃すると、対戦相手の持ち駒に当たらなかった場合でもどこに攻撃したか、相手に攻撃した場所が通知されます。4に攻撃を受けたら、相手の持ち駒は3,7,8のどこかに居るはずです!
  • 攻撃した場所が相手の持ち駒の隣(周囲8方向)だった場合「かすりました」と表示されます。相手の持ち駒の場所だった場合「命中しました」と表示されます。
  • 偶然自分の持ち駒と相手の持ち駒が同じ場所に居ることもありえます。その場合自分の居る場所には攻撃できないので、命中することはありえません。でも逆に必ず「かすりました」になります。

移動について

  • 移動可能な場所は、自分の持ち駒の縦横方向です。将棋の飛車のように、縦横方向であれば隣でない(例えば2つ離れた)場所にも移動可能です。以下はKingが移動可能な場所の例です。

f:id:yb300k:20170109014638j:plain

  • 移動すると「Kingが下方向に2歩動きました」のように、対戦相手に移動した方向と移動した距離が通知されます。相手の持ち駒の場所をこれで想像しましょう。

  • ただし、Queenおよび、一度攻撃を受けて弱気になったKingは上下左右のどこに移動したか、移動方向しか通知されません。

  • ゲームプレイ画面サンプルはこれね。5倍速ですがイメージつかむのにどーぞ。
  •  

  • www.youtube.com 

 

その他の機能

  • 対戦中、止めたいときは「対戦申込/やめる」メニューを選ぶと終わらせることができます。
  • 対戦中に @こんにちわ のように@の後ろにメッセージを書くと相手にメッセージが届きます。スタンプには対応していません。顔文字は大丈夫です(たぶん)。
  • 攻撃先や移動先の入力には実は数字入力も使えます。マップをタップする方がわかりやすいですけどね。。※ボードメニューから マップ を選ぶと自軍マップが表示されます
  • LINEで直接友達になっていない人でも、ゲームキーさえどうにかして教えてもらって対戦してもらえれば、BOT経由で間接的に会話できますよっ。対戦開始方法はこちらの動画参照。

    youtu.be

  • ボードメニューから ゲームキー表示 を選ぶと、自分のゲームキーと過去に対戦した人のゲームキーが表示されます。なお、LINEで対戦☆Battleshipをブロックして、その後ブロック解除すると自分のゲームキーは変わってしまうので注意してください。
  • ゲームキー 1000 に対戦申込すると、BOTさんが相手してくれます(残念ながらそれほど賢くはないです…鳥だし。)

 

BOT開発サイドからひとことふたこと

  1. Herokuで動いています。Herokuなので、時々スリープになっていて応答が遅いこともあるかもしれませんがご容赦を。
  2. Python(2系)を使ったので、表示メッセージ合成時のUnicodeエンコーディングで大ハマリして、いろんな方のサイトにお世話になりました。ありがとうございました。

    PythonのUnicodeEncodeErrorを知る - HDEラボ

    Python2のstr/unicodeとencode/decode - Qiita

    PythonのUnicodeDecodeErrorと戦った話 - ぴよぴよ.py

  3. LINE BOT Awardsで、通常はdeveloperプランでしかできないPush送信を他のプランでも認めるとのこと。developerプランは友達50人の制限があり、Awardsには不利なのでこれは嬉しいお知らせ。ただ、エントリー後、Push可能になるまで最大5営業日かかるということで、①フリープランでBOT作成しエントリー②その後数日はPush APIが利用可能になるのをじっと待ち③利用可能になったら宣伝!という流れになります。エントリー時「開発完了」とすると審査が始まってしまうのでご注意を。ちなみにPush可能になってもメールなどが来るわけではないので、エントリーした後、ちょくちょくLINE Business Centerから確認しましょう。 メール来ます。自分の場合は、メールが来る2日前から、Push APIが使えるようになっているのはLINE Manager画面から確認できていました・・・
  4. リッチメニューはPostBackイベントではなく、TextEvent扱いにしかできません。なのでリッチメニューからユーザーがなにか選択すると、LINEのいつもの投稿のように表示されてしまいます。ちょっと見た目アレですけど仕方ない。
  5. BOTさんはスタンプ対応がちょっと弱いです。

    f:id:yb300k:20170109115109j:plain

    上記4種類のパッケージに含まれているスタンプは送信できるのですが、他のものは送信できません(エラーになる)。ここに詳細な対応スタンプ一覧がありますがこんだけかあ・・・。有料スタンプはBOTさんは買い物してないからダメって言われるのもわかりますが、無料のものだったら送れるようにしてほしいなぁ(プログラム上どう識別するかは微妙ですが・・・)。なお、対戦☆Battleship はスタンプ対応はしていません・・対応しようかと思ったけれど送れるスタンプが少ないのでやめました。
  6. 対戦相手を勝手にマッチングするとか、機械学習で賢くなるコンピューターと対戦できるなど、機能追加アイデアはいくつかあるけど、予定は未定・・・他の機能でも、希望あればお知らせください。考えます。

 

さいごに

対戦したい方募集中・・・って言おうかと思いましたが、自分にこの手のゲームのセンスがないことがわかったので止めておきますw

ご感想、希望する追加機能、うまく動かない、わからないなどありましたら、ぜひコメントをお願いします!