neofugo_client 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/README.md +130 -0
- data/Rakefile +6 -0
- data/lib/neofugo_client.rb +91 -0
- data/lib/neofugo_client/base.rb +145 -0
- data/lib/neofugo_client/strategy.rb +62 -0
- data/lib/neofugo_client/test_connection.rb +13 -0
- data/lib/neofugo_client/test_practice.rb +13 -0
- data/lib/neofugo_client/test_rule_test.rb +13 -0
- data/lib/neofugo_client/util/util.rb +11 -0
- data/lib/neofugo_client/version.rb +3 -0
- data/neofugo_client.gemspec +28 -0
- data/sample/neofugo_client_sample.rb +75 -0
- metadata +130 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ae350873d6d5289db3b32e6c9bbd9dc615ffc905
|
4
|
+
data.tar.gz: e80a24c7aa733414d00576795501ab2f584d59a8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 28f61bf81eb23d697e15d3ed4537e318fc0cb1af0b6e158b1843708cee9efcddac94a33b61cbaa731ce681d20c17f909e896893740f3061c03f9005714d3f342
|
7
|
+
data.tar.gz: 7c81ccf07552993f5fceb017a8c247e12d3942d46ccc4d11d39de92bc9c96b10cc5648416219cb476e7f9eebf6c5aa10981e50a506adb0f2462e4be264c44e43
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
# NeofugoClient
|
2
|
+
|
3
|
+
[株式会社ネオジニア](http://www.neogenia.co.jp)のサービス「[ネオ富豪](http://neof5.neogenia.co.jp)」にRubyプログラムから参加するのを簡略化するgemです。
|
4
|
+
|
5
|
+
## インストール
|
6
|
+
下記コマンドでgemをインストールします。
|
7
|
+
|
8
|
+
$ gem install neofugo_client
|
9
|
+
|
10
|
+
## サンプル
|
11
|
+
|
12
|
+
sampleディレクトリに、ただ単純に手札を出すだけのサンプルクライアントを置いています。
|
13
|
+
|
14
|
+
## 前提
|
15
|
+
ネオ富豪はサーバとWebSocketを使用して通信します。
|
16
|
+
通信内容の仕様は公式サイトの[プログラム仕様](http://neof5.neogenia.co.jp/spec/)を確認してください。
|
17
|
+
|
18
|
+
ごく簡単に説明すると
|
19
|
+
- サーバと接続する
|
20
|
+
- サーバから各種情報を受信する
|
21
|
+
- 受信した内容から自分の出す札を決定する
|
22
|
+
- 決定した札をサーバに送信する
|
23
|
+
|
24
|
+
を繰り返します。この内、
|
25
|
+
|
26
|
+
- 受信した内容から自分の出す札を決定する
|
27
|
+
|
28
|
+
*以外*の部分をこのライブラリがサポートし、何を出すかの部分だけを実装すると
|
29
|
+
ネオ富豪のクライアントとして動作するようになります。
|
30
|
+
|
31
|
+
#### ネオ富豪サーバからのメッセージ概要
|
32
|
+
|
33
|
+
サーバからは以下のようなメッセージが送信されます。
|
34
|
+
|
35
|
+
```js
|
36
|
+
{
|
37
|
+
"YourNum":0, // 受信者の番号(接続順に0から振られます)
|
38
|
+
"Kind":"ProcessTurn", // ゲーム内で起こったイベントの種類
|
39
|
+
"Teban":0, // 現在の手番(プレイヤー番号)
|
40
|
+
"IsKakumei":false, // 革命中かどうか
|
41
|
+
"PlayerInfo":[ // 対戦中のプレイヤーの情報
|
42
|
+
{"Name":"ExampleProgram","HavingCardCount":11,"Ranking":0,"OrderOfFinish":0},
|
43
|
+
{"Name":"COM1","HavingCardCount":11,"Ranking":0,"OrderOfFinish":0},
|
44
|
+
{"Name":"COM2","HavingCardCount":10,"Ranking":0,"OrderOfFinish":0},
|
45
|
+
{"Name":"COM3","HavingCardCount":9,"Ranking":0,"OrderOfFinish":0},
|
46
|
+
{"Name":"COM4","HavingCardCount":9,"Ranking":0,"OrderOfFinish":0}],
|
47
|
+
"Deck":"D3 H3 D4 S7 H9 D0 SJ CQ SQ DA JK", // 現在の手札(1枚のカードを2文字で表します)
|
48
|
+
"Ba":["S3","D5","S6"], // 場に出ているカード
|
49
|
+
"Yama":"", // 山にあるカード(流れたカード)
|
50
|
+
"History":["2-[S3]","3-[D5]","4-[S6]"] // ゲームの初手から現在局面までの手の全履歴
|
51
|
+
}
|
52
|
+
```
|
53
|
+
|
54
|
+
この中で`Kind`の値が`ProcessTurn`の場合、「あなた」の手番が回ってきたことになるので、
|
55
|
+
このメッセージを受信したときに出す手を決めてサーバに返すとゲームが進行していきます。
|
56
|
+
|
57
|
+
#### NeofugoClient概要
|
58
|
+
NeofugoClientは
|
59
|
+
|
60
|
+
- サーバと指定した部屋(練習用の部屋、本番勝負用の部屋などがあります)にアクセスし、メッセージを送受信する部分
|
61
|
+
- 「あなた」のロジックを実装する部分
|
62
|
+
|
63
|
+
に分かれています。
|
64
|
+
上記で「`Kind`の値が`ProcessTrun`の場合」と書きましたが、そのあたりはライブラリ側が処理するので、
|
65
|
+
実際に実装するのは`Strategy`クラスを継承したの特定のメソッドのみになります。
|
66
|
+
`Strategy`クラスを継承すると予めサーバからのメッセージの`Kind`に対応したメソッドが定義されているので、
|
67
|
+
その中で反応したいメッセージに対応するメソッドのみオーバーライドしてロジックを完成させてください。
|
68
|
+
|
69
|
+
#### 最小限のサンプル
|
70
|
+
基本的には`Kind=PorcessTrun`に反応すれば良いため対応する`on_process_turn`をオーバーライドします。
|
71
|
+
また選んだカードを送信するには、(これもネオ富豪のメッセージに変換されますが)`put()`で出すカードを指定します。
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
require "neofugo_client"
|
75
|
+
|
76
|
+
class MyStrategy < NeofugoClient::Strategy
|
77
|
+
def on_process_turn(m)
|
78
|
+
cards = your_comprelex_daifugo_logic(m)
|
79
|
+
puts(cards)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
```
|
83
|
+
|
84
|
+
引数の`m`は先程載せたメッセージの`json`データをRubyのオブジェクトに変換したものです。
|
85
|
+
|
86
|
+
- メッセージ全体は`Message`クラスに該当します
|
87
|
+
- メッセージ直下にあるプロパティはプロパティー名をスネークケースにしたインスタンス変数として保持しています。例) `YourNum` => @your_num
|
88
|
+
- `@player_info`は`PlayerInfo`クラスの配列です。
|
89
|
+
- `@deck`は`Card`クラスの配列です。
|
90
|
+
- `@ba`は`Card`クラスの配列の配列です。
|
91
|
+
- `@yama`は`Card`クラスの配列です。
|
92
|
+
- `@history`は`History`クラスの配列です。
|
93
|
+
|
94
|
+
この内、最もロジックに関連する変数は`ba`(今現在場に出ているカード)と`deck`(今あなたが持っているカード)です。
|
95
|
+
どちらも`Card`クラスが元になっているため、`Card`クラスの概要を下記に記載します。
|
96
|
+
メッセージ上カードがどう表されるかは公式サイトを参照してください。
|
97
|
+
このライブラリ上では`Card`クラスは3つのプロパティで表現されます。
|
98
|
+
|
99
|
+
```ruby
|
100
|
+
class Card
|
101
|
+
def initialize
|
102
|
+
@type #カードの種類を表す文字列です。クラブ: C, ハート: H, ダイヤ: D, スペード: S, ただしJokerの場合JKです。
|
103
|
+
@mark #カードに書かれている数字です。A, 2, 3, 4, ... J, Q, K。ただしJokerの場合`nil`です。
|
104
|
+
@value #革命時でない場合のカードの強さを表します。3から順に, 0, 1, 2, 3, 4, 5
|
105
|
+
end
|
106
|
+
end
|
107
|
+
```
|
108
|
+
|
109
|
+
この`Card`クラスのインスタンスが`ba`, `deck`を構成しています。
|
110
|
+
`deck`は単純に今「あなた」が持っている`Card`の配列です。
|
111
|
+
|
112
|
+
`ba`は今場に出ているカードの状態です。流れた場合は`[]`配列です。
|
113
|
+
`ba`については1回に複数枚出すパターンがありえるので、「`Card`の配列の配列」で保持しています。
|
114
|
+
|
115
|
+
- カードが1枚ずつ3人から`c1, c2, c3`の順で出された
|
116
|
+
|
117
|
+
`ba = [[c1], [c2], [c3]]`
|
118
|
+
|
119
|
+
- カードが2枚ずつ二人から`(c1-1, c1-2), (c2-1, c2-2)`の順で出された
|
120
|
+
|
121
|
+
`ba = [[c1-1, c1-2], [c2-1, c2-2]]`
|
122
|
+
|
123
|
+
という形で取得できます。直接的には最後の手順に対して出せる札が決まるので最後の要素を解析して出す札を決めてください。
|
124
|
+
|
125
|
+
#### その他
|
126
|
+
ネオ富豪のメッセージは、常に最新のメッセージ一つの中に今までのゲームの状態を取得するための情報をすべて保持しているため
|
127
|
+
上記までで説明していない変数などを利用して有利なロジックを考えてみてください。
|
128
|
+
例えば、今までに出された札(`history`)と自分が今持っているカード(`deck`)を解析すれば、少なくともこのカードはもう
|
129
|
+
自分しか持っていないはず、などが推測出来ると思います。
|
130
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
require 'websocket-client-simple'
|
4
|
+
|
5
|
+
require "neofugo_client/version"
|
6
|
+
require 'neofugo_client/util/util'
|
7
|
+
require 'neofugo_client/base'
|
8
|
+
require 'neofugo_client/test_connection'
|
9
|
+
require 'neofugo_client/test_rule_test'
|
10
|
+
require 'neofugo_client/test_practice'
|
11
|
+
require 'neofugo_client/strategy'
|
12
|
+
|
13
|
+
module NeofugoClient
|
14
|
+
class PlayerInfo
|
15
|
+
attr_accessor :name, :having_card_count, :ranking, :order_of_finish
|
16
|
+
|
17
|
+
def to_s
|
18
|
+
inspect
|
19
|
+
end
|
20
|
+
|
21
|
+
def inspect
|
22
|
+
"(Player name:r#{@name}, having_card_count: #{@having_card_count}, ranking: #{@ranking}, order_of_finish: #{@order_of_finish})"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
class Message
|
27
|
+
attr_accessor :your_num, :kind, :teban, :is_kakumei, :player_info, :deck, :ba, :yama, :history, :message
|
28
|
+
def inspect
|
29
|
+
"(your_num: #{@your_num}, kind: #{@kind}, teban: #{@teban}, is_kakumei: #{@is_kakumei}, player_info: #{@player_info}, deck: #{@deck}, ba: #{@ba}, yama: #{@yama}, history: #{@history}, message: #{@message})"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Card
|
34
|
+
MARK_TO_VALUE = {
|
35
|
+
'3' => 0,
|
36
|
+
'4' => 1,
|
37
|
+
'5' => 2,
|
38
|
+
'6' => 3,
|
39
|
+
'7' => 4,
|
40
|
+
'8' => 5,
|
41
|
+
'9' => 6,
|
42
|
+
'0' => 7,
|
43
|
+
'J' => 8,
|
44
|
+
'Q' => 9,
|
45
|
+
'K' => 10,
|
46
|
+
'A' => 11,
|
47
|
+
'2' => 12,
|
48
|
+
'JK' => 13
|
49
|
+
}
|
50
|
+
attr_accessor :type, :mark, :value
|
51
|
+
|
52
|
+
def to_card_string
|
53
|
+
[@type, @mark].join
|
54
|
+
end
|
55
|
+
|
56
|
+
def to_s
|
57
|
+
inspect
|
58
|
+
end
|
59
|
+
|
60
|
+
def inspect
|
61
|
+
[@type, @mark, ["(", @value, ")"].join].join
|
62
|
+
end
|
63
|
+
|
64
|
+
class << self
|
65
|
+
def to_card(e)
|
66
|
+
c = Card.new
|
67
|
+
if e == 'JK'
|
68
|
+
c.type = 'JK'
|
69
|
+
c.mark = nil
|
70
|
+
c.value = MARK_TO_VALUE['JK']
|
71
|
+
else
|
72
|
+
c.type = e[0]
|
73
|
+
c.mark = e[1]
|
74
|
+
#p [:mark_to_value, e[1], MARK_TO_VALUE[e[1]], MARK_TO_VALUE]
|
75
|
+
c.value = MARK_TO_VALUE[e[1]]
|
76
|
+
end
|
77
|
+
c
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class History
|
83
|
+
attr_accessor :player_num, :action, :cards
|
84
|
+
def to_s
|
85
|
+
inspect
|
86
|
+
end
|
87
|
+
def inspect
|
88
|
+
"(Hist player_num: #{@player_num}, action: #{@action}, cards: #{@cards})"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
module NeofugoClient
|
2
|
+
using Util::StringEx
|
3
|
+
class Base
|
4
|
+
class << self
|
5
|
+
def create(opts={})
|
6
|
+
client = self.new(opts)
|
7
|
+
yield client
|
8
|
+
client
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
attr_accessor :host, :port, :verbose, :strategy_class
|
13
|
+
def initialize(opts = {})
|
14
|
+
@host = opts['host'] || 'neof5master.azurewebsites.net'
|
15
|
+
@port = opts['port'] || 80
|
16
|
+
@ws_handler = nil
|
17
|
+
@finished = false
|
18
|
+
end
|
19
|
+
|
20
|
+
def run()
|
21
|
+
@ws = WebSocket::Client::Simple.connect(build_url)
|
22
|
+
@strategy = @strategy_class.new(@ws)
|
23
|
+
handle
|
24
|
+
|
25
|
+
loop do
|
26
|
+
if @finished
|
27
|
+
@ws.close
|
28
|
+
break
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def handle
|
34
|
+
this = self
|
35
|
+
ws = @ws
|
36
|
+
ws.on :message do |msg|
|
37
|
+
if msg.data == 'ping'
|
38
|
+
ws.send(nil, :type => :pong)
|
39
|
+
else
|
40
|
+
this.on_message(msg)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
ws.on :open do
|
45
|
+
this.on_open
|
46
|
+
end
|
47
|
+
|
48
|
+
ws.on :close do |e|
|
49
|
+
this.on_close(e)
|
50
|
+
end
|
51
|
+
|
52
|
+
ws.on :error do |e|
|
53
|
+
this.on_error(e)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def on_open()
|
58
|
+
end
|
59
|
+
|
60
|
+
def on_close(e)
|
61
|
+
end
|
62
|
+
|
63
|
+
def on_error(e)
|
64
|
+
end
|
65
|
+
|
66
|
+
def on_message(msg)
|
67
|
+
begin
|
68
|
+
obj = parse_message(msg)
|
69
|
+
dispatch_by_kind(obj)
|
70
|
+
rescue => e
|
71
|
+
STDERR.puts e
|
72
|
+
STDERR.puts e.backtrace.join("\n")
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def build_base_websocket_url()
|
77
|
+
"ws://#{@host}:#{@port}"
|
78
|
+
end
|
79
|
+
|
80
|
+
def list_to_card_list(card_list_string)
|
81
|
+
card_list_string.split(/ /).map {|e|
|
82
|
+
Card.to_card(e)
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
def dispatch_by_kind(obj)
|
87
|
+
result = @strategy.send("on_" + obj.kind.pascal_to_snake, obj)
|
88
|
+
if obj.kind == "Finish"
|
89
|
+
@finished = true
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def parse_message(msg)
|
94
|
+
begin
|
95
|
+
j = JSON.parse(msg.data)
|
96
|
+
|
97
|
+
m = Message.new
|
98
|
+
m.kind = j['Kind']
|
99
|
+
if %w(Tweet Exception).include?(j['Kind'])
|
100
|
+
m.message = j['Message']
|
101
|
+
return m
|
102
|
+
end
|
103
|
+
|
104
|
+
m.your_num = j["YourNum"]
|
105
|
+
m.teban = j['Teban']
|
106
|
+
m.is_kakumei = j['IsKakumei']
|
107
|
+
m.player_info = j['PlayerInfo'].map {|e|
|
108
|
+
pi = PlayerInfo.new
|
109
|
+
pi.name = e['Name']
|
110
|
+
pi.having_card_count = e['HavingCardCount']
|
111
|
+
pi.ranking = e['Ranking']
|
112
|
+
pi.order_of_finish = e['OrderOfFinish']
|
113
|
+
pi
|
114
|
+
}
|
115
|
+
m.deck = list_to_card_list(j['Deck'])
|
116
|
+
#p [:ba_raw, j['Ba']]
|
117
|
+
m.ba = j['Ba'].map{|e| list_to_card_list(e)}
|
118
|
+
m.yama = j['Yama']
|
119
|
+
m.history = j['History'].map {|e|
|
120
|
+
a = History.new
|
121
|
+
if e[0] == '/'
|
122
|
+
a.action = :nagare
|
123
|
+
else
|
124
|
+
a.player_num = e[0].to_i
|
125
|
+
if e[2] == 'P'
|
126
|
+
a.action = :pass
|
127
|
+
elsif e[2] == 'A'
|
128
|
+
a.action = :agari
|
129
|
+
else
|
130
|
+
a.action = :player_action
|
131
|
+
end
|
132
|
+
if /\[([^\]]+)\]/ =~ e
|
133
|
+
a.cards = list_to_card_list(Regexp.last_match(1))
|
134
|
+
end
|
135
|
+
end
|
136
|
+
a
|
137
|
+
}
|
138
|
+
m
|
139
|
+
rescue => e
|
140
|
+
p e
|
141
|
+
end
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module NeofugoClient
|
2
|
+
class Strategy
|
3
|
+
def initialize(ws)
|
4
|
+
@ws = ws
|
5
|
+
end
|
6
|
+
|
7
|
+
def put(cards)
|
8
|
+
json = {
|
9
|
+
"Kind": "Put",
|
10
|
+
"Cards": cards.map(&:to_card_string).join(" ")
|
11
|
+
}.to_json
|
12
|
+
puts "put -----------------------------------"
|
13
|
+
p json
|
14
|
+
@ws.send(json)
|
15
|
+
end
|
16
|
+
|
17
|
+
def tweet(msg)
|
18
|
+
@ws.send({
|
19
|
+
"Kind": "Tweet",
|
20
|
+
"Message": msg
|
21
|
+
}.to_json)
|
22
|
+
end
|
23
|
+
|
24
|
+
def on_start(m)
|
25
|
+
end
|
26
|
+
|
27
|
+
def on_card_distributed(m)
|
28
|
+
end
|
29
|
+
|
30
|
+
def on_card_swapped(m)
|
31
|
+
end
|
32
|
+
|
33
|
+
def on_thinking(m)
|
34
|
+
end
|
35
|
+
|
36
|
+
def on_process_turn(m)
|
37
|
+
end
|
38
|
+
|
39
|
+
def on_cards_are_put(m)
|
40
|
+
end
|
41
|
+
|
42
|
+
def on_kakumei(m)
|
43
|
+
end
|
44
|
+
|
45
|
+
def on_nagare(m)
|
46
|
+
end
|
47
|
+
|
48
|
+
def on_agari(m)
|
49
|
+
end
|
50
|
+
|
51
|
+
def on_finish(m)
|
52
|
+
end
|
53
|
+
|
54
|
+
def on_tweet(m)
|
55
|
+
end
|
56
|
+
|
57
|
+
def on_exception(m)
|
58
|
+
puts "exception -------------------------------------------------------"
|
59
|
+
p m
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'neofugo_client/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "neofugo_client"
|
8
|
+
spec.version = NeofugoClient::VERSION
|
9
|
+
spec.authors = ["pocari"]
|
10
|
+
spec.email = ["caffelattenonsugar@gmail.com"]
|
11
|
+
|
12
|
+
spec.summary = %q{Neofugo client by ruby}
|
13
|
+
spec.description = %q{This library can implement Neofugo Client easy.}
|
14
|
+
spec.homepage = "https://github.com/pocari"
|
15
|
+
spec.license = "MIT"
|
16
|
+
|
17
|
+
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
18
|
+
spec.bindir = "exe"
|
19
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
|
+
spec.require_paths = ["lib"]
|
21
|
+
|
22
|
+
spec.add_development_dependency "bundler", "~> 1.10"
|
23
|
+
spec.add_development_dependency "rake", "~> 10.0"
|
24
|
+
spec.add_development_dependency "rspec"
|
25
|
+
spec.add_development_dependency "pry"
|
26
|
+
|
27
|
+
spec.add_dependency "websocket-client-simple", "~> 0.2.2"
|
28
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
$:.unshift File.expand_path '../lib', File.dirname(__FILE__)
|
2
|
+
require "neofugo_client"
|
3
|
+
|
4
|
+
require 'open-uri'
|
5
|
+
|
6
|
+
def get_new_room_id
|
7
|
+
str = open('http://neof5master.azurewebsites.net/playroom/practice/B').read
|
8
|
+
if /<pre>(.*)<\/pre>/ =~ str
|
9
|
+
ws_url = Regexp.last_match(1)
|
10
|
+
if /(P\d+)/ =~ ws_url
|
11
|
+
Regexp.last_match(1)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
class MyStrategy < NeofugoClient::Strategy
|
17
|
+
def on_start(m)
|
18
|
+
puts "start----------------------------------------"
|
19
|
+
tweet("よろしくお願いします")
|
20
|
+
end
|
21
|
+
|
22
|
+
def on_finish(m)
|
23
|
+
puts "finish----------------------------------------"
|
24
|
+
p m
|
25
|
+
tweet("お疲れ様でした")
|
26
|
+
end
|
27
|
+
|
28
|
+
def build_pattern(deck, n)
|
29
|
+
deck.chunk{|e|
|
30
|
+
e.value
|
31
|
+
}.select {|e, ch|
|
32
|
+
ch.size >= n
|
33
|
+
}.map {|e, ch|
|
34
|
+
[e, ch.first(n)]
|
35
|
+
}
|
36
|
+
end
|
37
|
+
|
38
|
+
def on_process_turn(m)
|
39
|
+
puts "process trun --------------------------------------------------->"
|
40
|
+
p [:ba, m.ba]
|
41
|
+
p [:deck, m.deck]
|
42
|
+
|
43
|
+
last = m.ba.last
|
44
|
+
cards = nil
|
45
|
+
if !last
|
46
|
+
cards = 4.downto(1).map{|e| build_pattern(m.deck, e)}.find{|e| e.size > 0}.first[1]
|
47
|
+
else
|
48
|
+
pattern = build_pattern(m.deck, last.size)
|
49
|
+
|
50
|
+
n, cards = pattern.find {|e, ch|
|
51
|
+
if m.is_kakumei
|
52
|
+
last.first.value > e
|
53
|
+
else
|
54
|
+
last.first.value < e
|
55
|
+
end
|
56
|
+
}
|
57
|
+
end
|
58
|
+
|
59
|
+
p [:cards, cards]
|
60
|
+
tweet("action: #{cards}")
|
61
|
+
put(cards ? cards : [])
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
room_id = ARGV.shift || get_new_room_id
|
66
|
+
client = NeofugoClient::TestPractice.create do |c|
|
67
|
+
c.verbose = true
|
68
|
+
c.name = 'Sample'
|
69
|
+
c.room_id = room_id
|
70
|
+
c.strategy_class = MyStrategy
|
71
|
+
end
|
72
|
+
|
73
|
+
puts "playroom id: #{room_id}"
|
74
|
+
client.run
|
75
|
+
|
metadata
ADDED
@@ -0,0 +1,130 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: neofugo_client
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- pocari
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-10-26 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: bundler
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.10'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.10'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '10.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '10.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: websocket-client-simple
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.2.2
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.2.2
|
83
|
+
description: This library can implement Neofugo Client easy.
|
84
|
+
email:
|
85
|
+
- caffelattenonsugar@gmail.com
|
86
|
+
executables: []
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- ".gitignore"
|
91
|
+
- ".rspec"
|
92
|
+
- ".travis.yml"
|
93
|
+
- Gemfile
|
94
|
+
- README.md
|
95
|
+
- Rakefile
|
96
|
+
- lib/neofugo_client.rb
|
97
|
+
- lib/neofugo_client/base.rb
|
98
|
+
- lib/neofugo_client/strategy.rb
|
99
|
+
- lib/neofugo_client/test_connection.rb
|
100
|
+
- lib/neofugo_client/test_practice.rb
|
101
|
+
- lib/neofugo_client/test_rule_test.rb
|
102
|
+
- lib/neofugo_client/util/util.rb
|
103
|
+
- lib/neofugo_client/version.rb
|
104
|
+
- neofugo_client.gemspec
|
105
|
+
- sample/neofugo_client_sample.rb
|
106
|
+
homepage: https://github.com/pocari
|
107
|
+
licenses:
|
108
|
+
- MIT
|
109
|
+
metadata: {}
|
110
|
+
post_install_message:
|
111
|
+
rdoc_options: []
|
112
|
+
require_paths:
|
113
|
+
- lib
|
114
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - ">="
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - ">="
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
requirements: []
|
125
|
+
rubyforge_project:
|
126
|
+
rubygems_version: 2.4.5
|
127
|
+
signing_key:
|
128
|
+
specification_version: 4
|
129
|
+
summary: Neofugo client by ruby
|
130
|
+
test_files: []
|