NeofugoClient
株式会社ネオジニアのサービス「ネオ富豪」にRubyプログラムから参加するのを簡略化するgemです。
インストール
下記コマンドでgemをインストールします。
$ gem install neofugo_client
サンプル
sampleディレクトリに、ただ単純に手札を出すだけのサンプルクライアントを置いています。
前提
ネオ富豪はサーバとWebSocketを使用して通信します。
通信内容の仕様は公式サイトのプログラム仕様を確認してください。
ごく簡単に説明すると
- サーバと接続する
- サーバから各種情報を受信する
- 受信した内容から自分の出す札を決定する
- 決定した札をサーバに送信する
を繰り返します。この内、
以外の部分をこのライブラリがサポートし、何を出すかの部分だけを実装すると
ネオ富豪のクライアントとして動作するようになります。
ネオ富豪サーバからのメッセージ概要
サーバからは以下のようなメッセージが送信されます。
{
"YourNum":0,
"Kind":"ProcessTurn",
"Teban":0,
"IsKakumei":false,
"PlayerInfo":[
{"Name":"ExampleProgram","HavingCardCount":11,"Ranking":0,"OrderOfFinish":0},
{"Name":"COM1","HavingCardCount":11,"Ranking":0,"OrderOfFinish":0},
{"Name":"COM2","HavingCardCount":10,"Ranking":0,"OrderOfFinish":0},
{"Name":"COM3","HavingCardCount":9,"Ranking":0,"OrderOfFinish":0},
{"Name":"COM4","HavingCardCount":9,"Ranking":0,"OrderOfFinish":0}],
"Deck":"D3 H3 D4 S7 H9 D0 SJ CQ SQ DA JK",
"Ba":["S3","D5","S6"],
"Yama":"",
"History":["2-[S3]","3-[D5]","4-[S6]"]
}
この中でKind
の値がProcessTurn
の場合、「あなた」の手番が回ってきたことになるので、
このメッセージを受信したときに出す手を決めてサーバに返すとゲームが進行していきます。
NeofugoClient概要
NeofugoClientは
- サーバと指定した部屋(練習用の部屋、本番勝負用の部屋などがあります)にアクセスし、メッセージを送受信する部分
- 「あなた」のロジックを実装する部分
に分かれています。
上記で「Kind
の値がProcessTrun
の場合」と書きましたが、そのあたりはライブラリ側が処理するので、
実際に実装するのはStrategy
クラスを継承したの特定のメソッドのみになります。
Strategy
クラスを継承すると予めサーバからのメッセージのKind
に対応したメソッドが定義されているので、
その中で反応したいメッセージに対応するメソッドのみオーバーライドしてロジックを完成させてください。
最小限のサンプル
基本的にはKind=PorcessTrun
に反応すれば良いため対応するon_process_turn
をオーバーライドします。
また選んだカードを送信するには、(これもネオ富豪のメッセージに変換されますが)put()
で出すカードを指定します。
require "neofugo_client"
class MyStrategy < NeofugoClient::Strategy
def on_process_turn(m)
cards = your_comprelex_daifugo_logic(m)
puts(cards)
end
end
引数のm
は先程載せたメッセージのjson
データをRubyのオブジェクトに変換したものです。
- メッセージ全体は
Message
クラスに該当します - メッセージ直下にあるプロパティはプロパティー名をスネークケースにしたインスタンス変数として保持しています。例)
YourNum
=> @your_num @player_info
はPlayerInfo
クラスの配列です。@deck
はCard
クラスの配列です。@ba
はCard
クラスの配列の配列です。@yama
はCard
クラスの配列です。@history
はHistory
クラスの配列です。
この内、最もロジックに関連する変数はba
(今現在場に出ているカード)とdeck
(今あなたが持っているカード)です。
どちらもCard
クラスが元になっているため、Card
クラスの概要を下記に記載します。
メッセージ上カードがどう表されるかは公式サイトを参照してください。
このライブラリ上ではCard
クラスは3つのプロパティで表現されます。
class Card
def initialize
@type
@mark
@value
end
end
このCard
クラスのインスタンスがba
, deck
を構成しています。
deck
は単純に今「あなた」が持っているCard
の配列です。
ba
は今場に出ているカードの状態です。流れた場合は[]
配列です。
ba
については1回に複数枚出すパターンがありえるので、「Card
の配列の配列」で保持しています。
-
カードが1枚ずつ3人からc1, c2, c3
の順で出された
ba = [[c1], [c2], [c3]]
-
カードが2枚ずつ二人から(c1-1, c1-2), (c2-1, c2-2)
の順で出された
ba = [[c1-1, c1-2], [c2-1, c2-2]]
という形で取得できます。直接的には最後の手順に対して出せる札が決まるので最後の要素を解析して出す札を決めてください。
その他
ネオ富豪のメッセージは、常に最新のメッセージ一つの中に今までのゲームの状態を取得するための情報をすべて保持しているため
上記までで説明していない変数などを利用して有利なロジックを考えてみてください。
例えば、今までに出された札(history
)と自分が今持っているカード(deck
)を解析すれば、少なくともこのカードはもう
自分しか持っていないはず、などが推測出来ると思います。