warcards 0.0.3 → 0.0.5
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.
- data/.gitignore +1 -0
- data/Gemfile.lock +11 -1
- data/lib/warcards.rb +92 -88
- data/lib/warcards/ai.rb +0 -2
- data/lib/warcards/cardgame.rb +43 -0
- data/lib/warcards/gameplay.rb +11 -8
- data/lib/warcards/version.rb +1 -1
- data/spec/spec_helper.rb +4 -0
- data/spec/warcards/gameplay_spec.rb +18 -17
- data/spec/warcards_spec.rb +232 -1
- data/warcards.gemspec +2 -0
- metadata +112 -23
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
warcards (0.0.
|
4
|
+
warcards (0.0.5)
|
5
5
|
bundler (~> 1.1)
|
6
6
|
querinator
|
7
7
|
rake (~> 0.9.2)
|
@@ -25,6 +25,9 @@ GEM
|
|
25
25
|
rb-fsevent (~> 0.9.1)
|
26
26
|
rb-inotify (~> 0.8.8)
|
27
27
|
minitest (3.3.0)
|
28
|
+
minitest-growl (0.0.3)
|
29
|
+
growl
|
30
|
+
minitest
|
28
31
|
minitest-reporters (0.9.0)
|
29
32
|
ansi
|
30
33
|
builder
|
@@ -32,6 +35,7 @@ GEM
|
|
32
35
|
powerbar
|
33
36
|
minitest-spec (0.0.2.1)
|
34
37
|
minitest (>= 3.0)
|
38
|
+
multi_json (1.3.6)
|
35
39
|
powerbar (1.0.8)
|
36
40
|
ansi (~> 1.4.0)
|
37
41
|
hashie (>= 1.1.0)
|
@@ -43,6 +47,10 @@ GEM
|
|
43
47
|
rb-fsevent (0.9.1)
|
44
48
|
rb-inotify (0.8.8)
|
45
49
|
ffi (>= 0.5.0)
|
50
|
+
simplecov (0.6.4)
|
51
|
+
multi_json (~> 1.0)
|
52
|
+
simplecov-html (~> 0.5.3)
|
53
|
+
simplecov-html (0.5.3)
|
46
54
|
thor (0.15.4)
|
47
55
|
turn (0.9.6)
|
48
56
|
ansi
|
@@ -55,8 +63,10 @@ DEPENDENCIES
|
|
55
63
|
growl (~> 1.0.3)
|
56
64
|
guard (~> 1.2.3)
|
57
65
|
guard-minitest (~> 0.5.0)
|
66
|
+
minitest-growl
|
58
67
|
minitest-reporters (~> 0.9.0)
|
59
68
|
minitest-spec (~> 0.0.2)
|
60
69
|
rb-fsevent (~> 0.9.1)
|
70
|
+
simplecov (~> 0.6)
|
61
71
|
turn (~> 0.9.6)
|
62
72
|
warcards!
|
data/lib/warcards.rb
CHANGED
@@ -4,51 +4,22 @@ require 'querinator'
|
|
4
4
|
module Cardgame
|
5
5
|
class Game
|
6
6
|
def initialize
|
7
|
-
@deck
|
8
|
-
@player
|
9
|
-
@ai
|
10
|
-
@gameplay =
|
7
|
+
@deck = Deck.new
|
8
|
+
@player = Player.new
|
9
|
+
@ai = Ai.new
|
10
|
+
@gameplay = gameplay(:deck => @deck, :player => @player, :ai => @ai)
|
11
11
|
@gameplay.shuffle
|
12
12
|
@gameplay.deal
|
13
13
|
@output = Struct.new(:winner, :player_feedback, :ai_feedback, :posed)
|
14
|
-
|
14
|
+
@slow = TRUE
|
15
15
|
end
|
16
16
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
##end
|
24
|
-
##
|
25
|
-
##def show_cards
|
26
|
-
## @gameplay.show_cards
|
27
|
-
##end
|
28
|
-
##
|
29
|
-
##def war?
|
30
|
-
## @gameplay.contest
|
31
|
-
##end
|
32
|
-
##
|
33
|
-
##def contest
|
34
|
-
## @gameplay.contest
|
35
|
-
##end
|
36
|
-
##
|
37
|
-
##def discard(result)
|
38
|
-
## @gameplay.discard(result)
|
39
|
-
##end
|
40
|
-
##
|
41
|
-
##def game_over?
|
42
|
-
## @gameplay.game_over?
|
43
|
-
##end
|
44
|
-
#
|
45
|
-
#def player
|
46
|
-
# @player
|
47
|
-
#end
|
48
|
-
#
|
49
|
-
#def ai
|
50
|
-
# @ai
|
51
|
-
#end
|
17
|
+
def gameplay(args)
|
18
|
+
deck = args[:deck]
|
19
|
+
player = args[:player]
|
20
|
+
ai = args[:ai]
|
21
|
+
Gameplay.new(:deck => deck, :player => player, :ai => ai)
|
22
|
+
end
|
52
23
|
|
53
24
|
def run
|
54
25
|
filename = get_filename
|
@@ -57,87 +28,120 @@ module Cardgame
|
|
57
28
|
end
|
58
29
|
@questions = Querinator::Game.new.get_questions(filename)
|
59
30
|
loop do
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
31
|
+
begin
|
32
|
+
end_game = @gameplay.game_over?
|
33
|
+
|
34
|
+
if end_game[:over?]
|
35
|
+
puts "Game over #{end_game[:winner]} won!"
|
36
|
+
exit
|
37
|
+
else
|
38
|
+
@gameplay.rearm?
|
39
|
+
@gameplay.show_cards
|
40
|
+
@gameplay.war?
|
41
|
+
result = @gameplay.contest
|
42
|
+
output_cli(result)
|
43
|
+
challenge_participants(result)
|
44
|
+
#continue?
|
45
|
+
@gameplay.discard(result)
|
46
|
+
end
|
47
|
+
rescue SignalException => e
|
48
|
+
puts "\n\nThanks for playing!"
|
49
|
+
exit(status=1)
|
50
|
+
end
|
70
51
|
end
|
71
52
|
end
|
72
53
|
|
73
|
-
def get_filename
|
74
|
-
puts "
|
75
|
-
|
76
|
-
file
|
77
|
-
|
78
|
-
file
|
54
|
+
def get_filename(input = STDIN, output = STDOUT)
|
55
|
+
output.puts(Dir.glob "**/*.txt")
|
56
|
+
sample_questions = "spec/test_question_file.txt"
|
57
|
+
output.puts "What question file?\n(Just hit enter to use the sample questions.)\nfilename: "
|
58
|
+
filename = input.gets.chomp
|
59
|
+
if File.file?(File.expand_path(filename))
|
60
|
+
File.expand_path(filename)
|
61
|
+
else
|
62
|
+
sample_questions
|
63
|
+
end
|
79
64
|
end
|
80
65
|
|
81
|
-
def continue?
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
66
|
+
#def continue?(input = STDIN, output = STDOUT, really_end = :yes)
|
67
|
+
# output.puts("go again?\n")
|
68
|
+
# next_round = input.gets
|
69
|
+
# if next_round.downcase.chomp.include? "n"
|
70
|
+
# output.puts "You ended the game"
|
71
|
+
# if really_end == :yes
|
72
|
+
# exit
|
73
|
+
# end
|
74
|
+
# end
|
75
|
+
#end
|
76
|
+
|
77
|
+
def output_cli(result, output = STDOUT)
|
78
|
+
graph = build_graph(player_holdings, ai_holdings)
|
79
|
+
output.puts "\n#{result[:winner].name} has the high card."
|
80
|
+
output.puts "Player has #{player_holdings} cards.\tAI has #{ai_holdings} cards."
|
81
|
+
output.puts graph
|
82
|
+
#challenge_participants(result)
|
83
|
+
# TODO get challenge_participants out of here. No longer belongs. Causing hard tests.
|
88
84
|
end
|
89
85
|
|
90
|
-
def
|
91
|
-
|
92
|
-
|
93
|
-
|
86
|
+
def build_graph(player_holdings, ai_holdings)
|
87
|
+
graph = ""
|
88
|
+
player_holdings.times { graph << "p" }
|
89
|
+
graph << "|"
|
90
|
+
ai_holdings.times { graph << "a" }
|
91
|
+
graph
|
94
92
|
end
|
95
93
|
|
96
94
|
def player_holdings
|
95
|
+
# When this is run there is one card from each participant in play.
|
96
|
+
# That is what the +1 compensates for and why the test looks wack.
|
97
97
|
(@gameplay.player.stack.length + @gameplay.player.discard.length + 1)
|
98
98
|
end
|
99
99
|
|
100
100
|
def ai_holdings
|
101
|
-
|
101
|
+
# When this is run there is one card from each participant in play.
|
102
|
+
# That is what the +1 compensates for and why the test looks wack.
|
103
|
+
(@gameplay.ai.stack.length + @gameplay.ai.discard.length + 1)
|
102
104
|
end
|
103
105
|
|
104
|
-
def challenge_participants(result)
|
105
|
-
if result[:winner] ==
|
106
|
-
challenge_player(result)
|
106
|
+
def challenge_participants(result, question = @questions.sample, input = STDIN, output = STDOUT, rnd_src = rand)
|
107
|
+
if result[:winner].class == Player
|
108
|
+
challenge_player(result, question, input, output)
|
107
109
|
else
|
108
|
-
challenge_ai(result)
|
110
|
+
challenge_ai(result, output, rnd_src)
|
109
111
|
end
|
110
112
|
end
|
111
113
|
|
112
|
-
def challenge_ai(result)
|
113
|
-
if test_ai
|
114
|
-
puts "Ai was correct."
|
114
|
+
def challenge_ai(result, output = STDOUT, rnd_src = rand)
|
115
|
+
if test_ai(rnd_src)
|
116
|
+
output.puts "Ai was correct. Ai wins the round."
|
115
117
|
else
|
116
|
-
puts "Ai was wrong. #{@gameplay.player.name} became the winner!"
|
118
|
+
output.puts "Ai was wrong. #{@gameplay.player.name} became the winner!"
|
117
119
|
result[:winner] = @gameplay.player
|
120
|
+
if @slow
|
121
|
+
sleep 0.75
|
122
|
+
end
|
118
123
|
end
|
119
124
|
end
|
120
125
|
|
121
|
-
def challenge_player(result)
|
122
|
-
|
123
|
-
|
126
|
+
def challenge_player(result, question = @questions.sample, input = STDIN, output = STDOUT)
|
127
|
+
#question = @questions.sample
|
128
|
+
if test_player(question, input, output)
|
129
|
+
output.puts "Correct! Yay!"
|
124
130
|
else
|
125
|
-
puts
|
131
|
+
output.puts %Q{Oooh. I'm sorry. The correct answer was "#{question.answer}". #{@gameplay.ai.name} became the winner.}
|
126
132
|
result[:winner] = @gameplay.ai
|
127
133
|
end
|
134
|
+
#continue?(input, output)
|
128
135
|
end
|
129
136
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
puts question.pose
|
134
|
-
answer = gets
|
137
|
+
def test_player(question, input = STDIN, output = STDOUT)
|
138
|
+
output.puts question.pose
|
139
|
+
answer = input.gets
|
135
140
|
question.is_correct?(answer.chomp)
|
136
141
|
end
|
137
142
|
|
138
|
-
def test_ai(difficulty)
|
139
|
-
difficulty
|
140
|
-
@ai.difficulty_check?(rand, difficulty)
|
143
|
+
def test_ai(rand_src = rand, difficulty = 0.4)
|
144
|
+
@ai.difficulty_check?(rand_src, difficulty)
|
141
145
|
end
|
142
146
|
|
143
147
|
end
|
data/lib/warcards/ai.rb
CHANGED
@@ -0,0 +1,43 @@
|
|
1
|
+
#module Cardgame
|
2
|
+
=begin
|
3
|
+
def challenge_participants(result)
|
4
|
+
if result[:winner] == @gameplay.player
|
5
|
+
challenge_player(result)
|
6
|
+
else
|
7
|
+
challenge_ai(result)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def challenge_ai(result)
|
12
|
+
if test_ai
|
13
|
+
puts "Ai was correct."
|
14
|
+
else
|
15
|
+
puts "Ai was wrong. #{@gameplay.player.name} became the winner!"
|
16
|
+
result[:winner] = @gameplay.player
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def challenge_player(result)
|
21
|
+
if test_player
|
22
|
+
puts "Correct! Yay!"
|
23
|
+
else
|
24
|
+
puts "Oooh. I'm sorry. The correct answer was 'TODO'. #{@gameplay.ai.name} became the winner."
|
25
|
+
result[:winner] = @gameplay.ai
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def test_player
|
31
|
+
question = @questions.sample
|
32
|
+
puts question.pose
|
33
|
+
answer = gets
|
34
|
+
question.is_correct?(answer.chomp)
|
35
|
+
end
|
36
|
+
|
37
|
+
def test_ai(difficulty)
|
38
|
+
difficulty ||= 0.4
|
39
|
+
@ai.difficulty_check?(rand, difficulty)
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
=end
|
data/lib/warcards/gameplay.rb
CHANGED
@@ -2,6 +2,7 @@ require_relative 'deck'
|
|
2
2
|
require_relative 'card'
|
3
3
|
require_relative 'ai'
|
4
4
|
require_relative 'player'
|
5
|
+
require 'ostruct'
|
5
6
|
|
6
7
|
module Cardgame
|
7
8
|
class Gameplay
|
@@ -24,16 +25,18 @@ module Cardgame
|
|
24
25
|
end
|
25
26
|
|
26
27
|
def game_over?
|
27
|
-
|
28
|
+
end_game = Hash.new
|
29
|
+
participants = [@player, @ai]
|
30
|
+
participants.each_with_index do |participant, index|
|
28
31
|
if (participant.stack.length + participant.discard.length) < 1
|
29
|
-
participants = [@ai, @player]
|
30
32
|
participants.delete_at index
|
31
|
-
|
32
|
-
|
33
|
+
end_game[:winner] = participants.first.name
|
34
|
+
end_game[:over?] = TRUE
|
33
35
|
else
|
34
|
-
|
36
|
+
end_game[:over?] = FALSE
|
35
37
|
end
|
36
38
|
end
|
39
|
+
end_game
|
37
40
|
end
|
38
41
|
|
39
42
|
def rearm?
|
@@ -58,11 +61,11 @@ module Cardgame
|
|
58
61
|
{ :winner => winner, :player_cards => @player_cards, :ai_cards => @ai_cards }
|
59
62
|
end
|
60
63
|
|
61
|
-
def war?
|
64
|
+
def war?(output = STDOUT)
|
62
65
|
while @ai_cards.last.value == @player_cards.last.value
|
63
66
|
rearm?
|
64
|
-
#TODO make the
|
65
|
-
puts "WAR!!!"
|
67
|
+
#TODO make the following line a flag or something so the view code can decide to show it or not.
|
68
|
+
output.puts "WAR!!!"
|
66
69
|
show_cards
|
67
70
|
end
|
68
71
|
end
|
data/lib/warcards/version.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -3,9 +3,9 @@ require_relative '../spec_helper'
|
|
3
3
|
module Cardgame
|
4
4
|
describe Gameplay do
|
5
5
|
def setup
|
6
|
-
@deck
|
7
|
-
@player
|
8
|
-
@ai
|
6
|
+
@deck = Deck.new
|
7
|
+
@player = Player.new
|
8
|
+
@ai = Ai.new
|
9
9
|
@gameplay = Gameplay.new(:deck => @deck, :player => @player, :ai => @ai)
|
10
10
|
end
|
11
11
|
|
@@ -35,9 +35,9 @@ module Cardgame
|
|
35
35
|
|
36
36
|
describe "dealt deck" do
|
37
37
|
def setup
|
38
|
-
@deck
|
39
|
-
player
|
40
|
-
ai
|
38
|
+
@deck = Deck.new
|
39
|
+
player = Player.new
|
40
|
+
ai = Ai.new
|
41
41
|
@gameplay = Gameplay.new(:deck => @deck, :player => player, :ai => ai)
|
42
42
|
@gameplay.shuffle
|
43
43
|
@gameplay.deal
|
@@ -102,9 +102,10 @@ module Cardgame
|
|
102
102
|
|
103
103
|
describe "#war" do
|
104
104
|
it "must play war when there is a draw" do
|
105
|
-
|
106
|
-
|
107
|
-
|
105
|
+
output = StringIO.new("")
|
106
|
+
card_ai_1 = (Card.new(:suit => :clubs, :value => 5))
|
107
|
+
card_ai_2 = (Card.new(:suit => :spades, :value => 4))
|
108
|
+
card_ai_3 = (Card.new(:suit => :clubs, :value => 4))
|
108
109
|
card_player_1 = (Card.new(:suit => :hearts, :value => 4))
|
109
110
|
card_player_2 = (Card.new(:suit => :diamonds, :value => 4))
|
110
111
|
card_player_3 = (Card.new(:suit => :hearts, :value => 4))
|
@@ -116,7 +117,7 @@ module Cardgame
|
|
116
117
|
@gameplay.player.stack << card_player_3
|
117
118
|
|
118
119
|
@gameplay.show_cards
|
119
|
-
@gameplay.war?
|
120
|
+
@gameplay.war?(output)
|
120
121
|
result = @gameplay.contest
|
121
122
|
|
122
123
|
result[:ai_cards].must_be_instance_of Array
|
@@ -160,9 +161,9 @@ module Cardgame
|
|
160
161
|
|
161
162
|
describe "#game_over?" do
|
162
163
|
def setup
|
163
|
-
@deck
|
164
|
-
player
|
165
|
-
ai
|
164
|
+
@deck = Deck.new
|
165
|
+
player = Player.new
|
166
|
+
ai = Ai.new
|
166
167
|
@gameplay = Gameplay.new(:deck => @deck, :player => player, :ai => ai)
|
167
168
|
@gameplay.ai.stack.clear << (Card.new(:suit => :clubs, :value => 2))
|
168
169
|
@gameplay.ai.stack << (Card.new(:suit => :hearts, :value => 1))
|
@@ -171,15 +172,15 @@ module Cardgame
|
|
171
172
|
end
|
172
173
|
|
173
174
|
it "must end the game when a participant is out of cards" do
|
174
|
-
skip "you'll need to mock stdout and stderr first. Of course you'll have to learn how before doing that."
|
175
175
|
2.times do
|
176
|
+
@gameplay.game_over?
|
176
177
|
@gameplay.show_cards
|
177
178
|
@gameplay.discard(@gameplay.contest)
|
178
179
|
end
|
179
|
-
|
180
|
-
|
181
|
-
end.must_output(STDOUT, STDERR) {"Game Over"; exit}
|
180
|
+
@gameplay.game_over?
|
181
|
+
@gameplay.game_over?[:over?].must_equal true
|
182
182
|
end
|
183
183
|
end
|
184
|
+
|
184
185
|
end
|
185
186
|
end
|
data/spec/warcards_spec.rb
CHANGED
@@ -24,10 +24,241 @@ module Cardgame
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
game = Game.new
|
27
|
-
|
27
|
+
5.times do
|
28
28
|
game.excercise
|
29
29
|
game.sum_cards.must_equal 52
|
30
30
|
end
|
31
31
|
end
|
32
|
+
|
33
|
+
|
34
|
+
describe "#player_holdings" do
|
35
|
+
def setup
|
36
|
+
@game = Game.new
|
37
|
+
end
|
38
|
+
|
39
|
+
it "shows how many cards the player has between stack and discard" do
|
40
|
+
@game.player_holdings.must_equal 27
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe "#ai_holdings" do
|
45
|
+
def setup
|
46
|
+
@game = Game.new
|
47
|
+
end
|
48
|
+
|
49
|
+
it "shows how many cards the AI has between the stack and discard" do
|
50
|
+
@game.ai_holdings.must_equal 27
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
#describe "#continue?" do
|
55
|
+
# def setup
|
56
|
+
# @game = Game.new
|
57
|
+
# end
|
58
|
+
#
|
59
|
+
# it "asks if I want to continue" do
|
60
|
+
# input = StringIO.new("\n")
|
61
|
+
# output = StringIO.new("")
|
62
|
+
# @game.continue?(input, output)
|
63
|
+
# output.string.must_equal "go again?\n"
|
64
|
+
# end
|
65
|
+
#
|
66
|
+
# it "tells me I ended the game if I say 'n'" do
|
67
|
+
# input = StringIO.new("n")
|
68
|
+
# output = StringIO.new("")
|
69
|
+
# @game.continue?(input, output, :no)
|
70
|
+
# output.string.must_match /.*You ended the game.*/
|
71
|
+
# end
|
72
|
+
#end
|
73
|
+
|
74
|
+
describe "#output_cli" do
|
75
|
+
def setup
|
76
|
+
@game = Game.new
|
77
|
+
@gameplay = @game.gameplay(deck: Deck.new, player: Player.new, ai: Ai.new)
|
78
|
+
@gameplay.ai_cards.clear << (Card.new(:suit => :clubs, :value => 2))
|
79
|
+
@gameplay.player_cards.clear << (Card.new(:suit => :clubs, :value => 13))
|
80
|
+
@result = @gameplay.contest
|
81
|
+
@output = StringIO.new("")
|
82
|
+
end
|
83
|
+
|
84
|
+
it "displays the comparison winner" do
|
85
|
+
@game.output_cli(@result, @output)
|
86
|
+
@output.string.must_match /^Player has the high card\./
|
87
|
+
end
|
88
|
+
|
89
|
+
it "displays the number of cards each participant has" do
|
90
|
+
@game.output_cli(@result, @output)
|
91
|
+
@output.string.must_match /Player has 27 cards.*AI has 27 cards/
|
92
|
+
end
|
93
|
+
|
94
|
+
it "shows a graph representation of the deck" do
|
95
|
+
@game.output_cli(@result, @output)
|
96
|
+
@output.string.must_match /pppppppppppppppppppppppppp|aaaaaaaaaaaaaaaaaaaaaaaaaa/
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
describe "#build_graph" do
|
101
|
+
def setup
|
102
|
+
@game = Game.new
|
103
|
+
@gameplay = @game.gameplay(deck: Deck.new, player: Player.new, ai: Ai.new)
|
104
|
+
@gameplay.ai_cards.clear << (Card.new(:suit => :clubs, :value => 2))
|
105
|
+
@gameplay.player_cards.clear << (Card.new(:suit => :clubs, :value => 13))
|
106
|
+
@result = @gameplay.contest
|
107
|
+
@output = StringIO.new("")
|
108
|
+
end
|
109
|
+
|
110
|
+
it "shows a graph representation of the deck" do
|
111
|
+
res = @game.build_graph((@game.player_holdings - 1), (@game.ai_holdings - 1))
|
112
|
+
res.must_equal "pppppppppppppppppppppppppp|aaaaaaaaaaaaaaaaaaaaaaaaaa"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe "#test_ai" do
|
117
|
+
def setup
|
118
|
+
@game = Game.new
|
119
|
+
end
|
120
|
+
|
121
|
+
it "is true if difficulty is lower than random" do
|
122
|
+
@game.test_ai(0.1).must_equal TRUE
|
123
|
+
end
|
124
|
+
|
125
|
+
it "if false if difficulty is higher than random" do
|
126
|
+
@game.test_ai(0.3, 0.2).must_equal FALSE
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "#test_player" do
|
131
|
+
def setup
|
132
|
+
@questions = Querinator::Game.new.get_questions("spec/test_question_file.txt")
|
133
|
+
@input = StringIO.new("\n")
|
134
|
+
@output = StringIO.new("")
|
135
|
+
@game = Game.new
|
136
|
+
end
|
137
|
+
|
138
|
+
it "asks the player a question" do
|
139
|
+
@game.test_player(@questions.first, @input, @output)
|
140
|
+
@output.string.must_equal "Do you get Tom Servo?\n"
|
141
|
+
end
|
142
|
+
|
143
|
+
it "tells me the given answer is incorrect" do
|
144
|
+
input = StringIO.new("no I do not")
|
145
|
+
@game.test_player(@questions.first, input, @output).must_equal FALSE
|
146
|
+
end
|
147
|
+
|
148
|
+
it "tells me the given answer is correct" do
|
149
|
+
input = StringIO.new("Nobody does. I'm the wind baby.")
|
150
|
+
@game.test_player(@questions.first, input, @output).must_equal TRUE
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe "#challenge_player" do
|
155
|
+
def setup
|
156
|
+
@game = Game.new
|
157
|
+
@questions = Querinator::Game.new.get_questions("spec/test_question_file.txt")
|
158
|
+
@gameplay = @game.gameplay(deck: Deck.new, player: Player.new, ai: Ai.new)
|
159
|
+
@gameplay.ai_cards.clear << (Card.new(:suit => :clubs, :value => 2))
|
160
|
+
@gameplay.player_cards.clear << (Card.new(:suit => :clubs, :value => 13))
|
161
|
+
@result = @gameplay.contest
|
162
|
+
@output = StringIO.new("")
|
163
|
+
end
|
164
|
+
|
165
|
+
it "congratulates me when I get it correct" do
|
166
|
+
input = StringIO.new("Nobody does. I'm the wind baby.\n")
|
167
|
+
@game.challenge_player(@result, @questions.first, input, @output)
|
168
|
+
@output.string.split("\n").last.must_equal "Correct! Yay!"
|
169
|
+
end
|
170
|
+
|
171
|
+
it "consoles me when I get it wrong" do
|
172
|
+
input = StringIO.new("Who's Tom Servo?\n")
|
173
|
+
@game.challenge_player(@result, @questions.first, input, @output)
|
174
|
+
@output.string.split("\n").last.must_match /^Oooh\. I'm sorry/
|
175
|
+
end
|
176
|
+
|
177
|
+
#it "asks me if I want to continue" do
|
178
|
+
# input = StringIO.new("Who's Tom Servo?\n\n")
|
179
|
+
# @game.challenge_player(@result, @questions.first, input, @output)
|
180
|
+
# @output.string.split("\n").last.must_match /go again\?/
|
181
|
+
#end
|
182
|
+
end
|
183
|
+
|
184
|
+
describe "#challenge_ai" do
|
185
|
+
def setup
|
186
|
+
@game = Game.new
|
187
|
+
@gameplay = @game.gameplay(deck: Deck.new, player: Player.new, ai: Ai.new)
|
188
|
+
@gameplay.ai_cards.clear << (Card.new(:suit => :clubs, :value => 12))
|
189
|
+
@gameplay.player_cards.clear << (Card.new(:suit => :clubs, :value => 3))
|
190
|
+
@result = @gameplay.contest
|
191
|
+
@output = StringIO.new("")
|
192
|
+
end
|
193
|
+
|
194
|
+
it "tells me the ai lost" do
|
195
|
+
@game.challenge_ai(@result, @output, 0.9)
|
196
|
+
@output.string.must_equal "Ai was wrong. Player became the winner!\n"
|
197
|
+
end
|
198
|
+
|
199
|
+
it "tells me the ai won" do
|
200
|
+
@game.challenge_ai(@result, @output, 0.1)
|
201
|
+
@output.string.must_equal "Ai was correct. Ai wins the round.\n"
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def challenge_partic_setup(args)
|
206
|
+
@game = Game.new
|
207
|
+
@questions = Querinator::Game.new.get_questions("spec/test_question_file.txt")
|
208
|
+
@gameplay = @game.gameplay(deck: Deck.new, player: Player.new, ai: Ai.new)
|
209
|
+
@gameplay.ai_cards.clear << (args[:ai_card])
|
210
|
+
@gameplay.player_cards.clear << (args[:player_card])
|
211
|
+
@result = @gameplay.contest
|
212
|
+
@output = StringIO.new("")
|
213
|
+
@input = StringIO.new("incorrect answer\n")
|
214
|
+
end
|
215
|
+
|
216
|
+
describe "#challenge_participants player" do
|
217
|
+
def setup
|
218
|
+
challenge_partic_setup(:ai_card => Card.new(:suit => :clubs, :value => 2), :player_card => Card.new(:suit => :clubs, :value => 11))
|
219
|
+
end
|
220
|
+
|
221
|
+
it "calls #challenge_player if player has high card" do
|
222
|
+
@game.challenge_participants(@result, @questions.first, @input, @output, 0.1)
|
223
|
+
@output.string.must_match /#{@questions.first.pose}/
|
224
|
+
end
|
225
|
+
end
|
226
|
+
|
227
|
+
describe "#challenge_participants ai" do
|
228
|
+
def setup
|
229
|
+
challenge_partic_setup(:ai_card => Card.new(:suit => :clubs, :value => 12), :player_card => Card.new(:suit => :clubs, :value => 1))
|
230
|
+
end
|
231
|
+
|
232
|
+
it "calls #challenge_ai if ai has high card" do
|
233
|
+
result = @gameplay.contest
|
234
|
+
@game.challenge_participants(result, @questions.first, @input, @output, 0.1)
|
235
|
+
@output.string.must_match /Ai was correct\. Ai wins the round\.\n/
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
describe "#get_filename" do
|
240
|
+
def setup
|
241
|
+
@output = StringIO.new("")
|
242
|
+
@input = StringIO.new("incorrect answer\n")
|
243
|
+
@game = Game.new
|
244
|
+
end
|
245
|
+
|
246
|
+
it "displays the path of the sample question file" do
|
247
|
+
@game.get_filename(@input, @output)
|
248
|
+
@output.string.must_match "spec/test_question_file.txt"
|
249
|
+
end
|
250
|
+
|
251
|
+
it "returns an absolute path if a path is passed in" do
|
252
|
+
input = StringIO.new("~/.bash_history\n")
|
253
|
+
@game.get_filename(input, @output).must_match ".bash_history"
|
254
|
+
end
|
255
|
+
|
256
|
+
it "returns the path to the sample question if the user hits enter" do
|
257
|
+
input = StringIO.new("\n")
|
258
|
+
@game.get_filename(input, @output).must_equal "spec/test_question_file.txt"
|
259
|
+
end
|
260
|
+
end
|
32
261
|
end
|
262
|
+
|
263
|
+
|
33
264
|
end
|
data/warcards.gemspec
CHANGED
@@ -19,10 +19,12 @@ Gem::Specification.new do |gem|
|
|
19
19
|
gem.add_development_dependency 'rb-fsevent', '~>0.9.1'
|
20
20
|
gem.add_development_dependency 'minitest-spec', '~>0.0.2'
|
21
21
|
gem.add_development_dependency 'minitest-reporters', '~>0.9.0'
|
22
|
+
gem.add_development_dependency 'minitest-growl'
|
22
23
|
gem.add_development_dependency 'guard', '~>1.2.3'
|
23
24
|
gem.add_development_dependency 'guard-minitest', '~>0.5.0'
|
24
25
|
gem.add_development_dependency 'growl', '~>1.0.3'
|
25
26
|
gem.add_development_dependency 'turn', '~>0.9.6'
|
27
|
+
gem.add_development_dependency 'simplecov', '~>0.6'
|
26
28
|
|
27
29
|
# specify run dependencies here
|
28
30
|
gem.add_dependency 'bundler', "~>1.1"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: warcards
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-08
|
12
|
+
date: 2012-09-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rb-fsevent
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,15 @@ dependencies:
|
|
21
21
|
version: 0.9.1
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.9.1
|
25
30
|
- !ruby/object:Gem::Dependency
|
26
31
|
name: minitest-spec
|
27
|
-
requirement:
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
28
33
|
none: false
|
29
34
|
requirements:
|
30
35
|
- - ~>
|
@@ -32,10 +37,15 @@ dependencies:
|
|
32
37
|
version: 0.0.2
|
33
38
|
type: :development
|
34
39
|
prerelease: false
|
35
|
-
version_requirements:
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.0.2
|
36
46
|
- !ruby/object:Gem::Dependency
|
37
47
|
name: minitest-reporters
|
38
|
-
requirement:
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
39
49
|
none: false
|
40
50
|
requirements:
|
41
51
|
- - ~>
|
@@ -43,10 +53,31 @@ dependencies:
|
|
43
53
|
version: 0.9.0
|
44
54
|
type: :development
|
45
55
|
prerelease: false
|
46
|
-
version_requirements:
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.9.0
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: minitest-growl
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
47
78
|
- !ruby/object:Gem::Dependency
|
48
79
|
name: guard
|
49
|
-
requirement:
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
50
81
|
none: false
|
51
82
|
requirements:
|
52
83
|
- - ~>
|
@@ -54,10 +85,15 @@ dependencies:
|
|
54
85
|
version: 1.2.3
|
55
86
|
type: :development
|
56
87
|
prerelease: false
|
57
|
-
version_requirements:
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ~>
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: 1.2.3
|
58
94
|
- !ruby/object:Gem::Dependency
|
59
95
|
name: guard-minitest
|
60
|
-
requirement:
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
61
97
|
none: false
|
62
98
|
requirements:
|
63
99
|
- - ~>
|
@@ -65,10 +101,15 @@ dependencies:
|
|
65
101
|
version: 0.5.0
|
66
102
|
type: :development
|
67
103
|
prerelease: false
|
68
|
-
version_requirements:
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 0.5.0
|
69
110
|
- !ruby/object:Gem::Dependency
|
70
111
|
name: growl
|
71
|
-
requirement:
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
72
113
|
none: false
|
73
114
|
requirements:
|
74
115
|
- - ~>
|
@@ -76,10 +117,15 @@ dependencies:
|
|
76
117
|
version: 1.0.3
|
77
118
|
type: :development
|
78
119
|
prerelease: false
|
79
|
-
version_requirements:
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: 1.0.3
|
80
126
|
- !ruby/object:Gem::Dependency
|
81
127
|
name: turn
|
82
|
-
requirement:
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
83
129
|
none: false
|
84
130
|
requirements:
|
85
131
|
- - ~>
|
@@ -87,10 +133,31 @@ dependencies:
|
|
87
133
|
version: 0.9.6
|
88
134
|
type: :development
|
89
135
|
prerelease: false
|
90
|
-
version_requirements:
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ~>
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 0.9.6
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: simplecov
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ~>
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0.6'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ~>
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0.6'
|
91
158
|
- !ruby/object:Gem::Dependency
|
92
159
|
name: bundler
|
93
|
-
requirement:
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
94
161
|
none: false
|
95
162
|
requirements:
|
96
163
|
- - ~>
|
@@ -98,10 +165,15 @@ dependencies:
|
|
98
165
|
version: '1.1'
|
99
166
|
type: :runtime
|
100
167
|
prerelease: false
|
101
|
-
version_requirements:
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ~>
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '1.1'
|
102
174
|
- !ruby/object:Gem::Dependency
|
103
175
|
name: querinator
|
104
|
-
requirement:
|
176
|
+
requirement: !ruby/object:Gem::Requirement
|
105
177
|
none: false
|
106
178
|
requirements:
|
107
179
|
- - ! '>='
|
@@ -109,10 +181,15 @@ dependencies:
|
|
109
181
|
version: '0'
|
110
182
|
type: :runtime
|
111
183
|
prerelease: false
|
112
|
-
version_requirements:
|
184
|
+
version_requirements: !ruby/object:Gem::Requirement
|
185
|
+
none: false
|
186
|
+
requirements:
|
187
|
+
- - ! '>='
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: '0'
|
113
190
|
- !ruby/object:Gem::Dependency
|
114
191
|
name: rake
|
115
|
-
requirement:
|
192
|
+
requirement: !ruby/object:Gem::Requirement
|
116
193
|
none: false
|
117
194
|
requirements:
|
118
195
|
- - ~>
|
@@ -120,7 +197,12 @@ dependencies:
|
|
120
197
|
version: 0.9.2
|
121
198
|
type: :runtime
|
122
199
|
prerelease: false
|
123
|
-
version_requirements:
|
200
|
+
version_requirements: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
202
|
+
requirements:
|
203
|
+
- - ~>
|
204
|
+
- !ruby/object:Gem::Version
|
205
|
+
version: 0.9.2
|
124
206
|
description: An addictive game of War! to help slog through flash-card memorization
|
125
207
|
email:
|
126
208
|
- robie1373@gmail.com
|
@@ -142,6 +224,7 @@ files:
|
|
142
224
|
- lib/warcards.rb
|
143
225
|
- lib/warcards/ai.rb
|
144
226
|
- lib/warcards/card.rb
|
227
|
+
- lib/warcards/cardgame.rb
|
145
228
|
- lib/warcards/deck.rb
|
146
229
|
- lib/warcards/gameplay.rb
|
147
230
|
- lib/warcards/player.rb
|
@@ -168,15 +251,21 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
168
251
|
- - ! '>='
|
169
252
|
- !ruby/object:Gem::Version
|
170
253
|
version: '0'
|
254
|
+
segments:
|
255
|
+
- 0
|
256
|
+
hash: -569622757642697416
|
171
257
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
172
258
|
none: false
|
173
259
|
requirements:
|
174
260
|
- - ! '>='
|
175
261
|
- !ruby/object:Gem::Version
|
176
262
|
version: '0'
|
263
|
+
segments:
|
264
|
+
- 0
|
265
|
+
hash: -569622757642697416
|
177
266
|
requirements: []
|
178
267
|
rubyforge_project:
|
179
|
-
rubygems_version: 1.8.
|
268
|
+
rubygems_version: 1.8.24
|
180
269
|
signing_key:
|
181
270
|
specification_version: 3
|
182
271
|
summary: Play a game of War! against the computer. If your card is higher, you get
|