studio_game_mike_brooks 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: fe286b338f71c3270ab2bddde31ea0cf37c73eb0
4
+ data.tar.gz: 1ae846ce68014c4e95ef9f4ed051673f29be878c
5
+ SHA512:
6
+ metadata.gz: dfda0df4248ab9eabf1fc1e9ef3ed640101cd3a5bbb52652e7cf93cc4544026aa3581a77bd41be2ff1f287a65ba6f52c3280888ab83ecceb7f93c1cc5310be55
7
+ data.tar.gz: db9915e6a1f0bd1ad58b2e6bfcaf84ac2e3afd52c7fe4ba20db1d4b46236e9cfda73df84216c904885960c457350155ab32627adce7f363c6c781a10a9873876
data/LICENSE ADDED
@@ -0,0 +1 @@
1
+ The LICENSE file should contain, well, the license under which you're distributing your source code. If you're unsure or just need a reasonable, no-lawyers-required example, check out the short terms of the MIT license. Choose whatever you like, just don't release your code without some kind of license, otherwise folks won't know if they can use it.
data/README ADDED
@@ -0,0 +1 @@
1
+ The README should contain a short description of what your gem does and how to use it.
@@ -0,0 +1,4 @@
1
+ Knuckleheads High Scores:
2
+ Alvin............... 550
3
+ Simon............... 525
4
+ Theo................ 350
@@ -0,0 +1,3 @@
1
+ Rocky,50
2
+ Rambo,40
3
+ Bambo,70
data/bin/players.csv ADDED
@@ -0,0 +1,3 @@
1
+ Alvin,100
2
+ Simon,60
3
+ Theo,125
data/bin/studio_game ADDED
@@ -0,0 +1,269 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # require_relative 'player'
4
+ # require_relative 'game'
5
+ # require_relative 'clumsy_player'
6
+ # require_relative 'berserk_player'
7
+
8
+ # require 'studio_game/player'
9
+ require_relative '../lib/studio_game/game'
10
+ require_relative '../lib/studio_game/clumsy_player'
11
+ require_relative '../lib/studio_game/berserk_player'
12
+
13
+
14
+ # player1 = Player.new("moe")
15
+ # player2 = Player.new("larry", 60)
16
+ # player3 = Player.new("curly", 125)
17
+
18
+ knuckleheads = StudioGame::Game.new("Knuckleheads")
19
+ puts knuckleheads.title; puts
20
+
21
+ # knuckleheads.load_players(ARGV.shift || "players.csv")
22
+
23
+ default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
24
+ knuckleheads.load_players(ARGV.shift || default_player_file)
25
+
26
+ # klutz = ClumsyPlayer.new("klutz", 105)
27
+ # knuckleheads.add_player(klutz)
28
+ #
29
+ # berserk = BerserkPlayer.new("berserk", 50)
30
+ # knuckleheads.add_player(berserk)
31
+
32
+ knuckleheads.play(2)
33
+
34
+ # loop do
35
+ # puts "\nHow many rounds? or 'quit'/'exit' to finish."
36
+ # answer = gets.chomp.downcase
37
+ # case answer
38
+ # when 'quit', 'exit'
39
+ # knuckleheads.print_stats
40
+ # break
41
+ # when /^\d+$/
42
+ # knuckleheads.play(answer.to_i)
43
+ # # {knuckleheads.total_points >= 2000}
44
+ # else
45
+ # puts "Input error: enter either number of rounds or type in 'quit' or 'exit'"
46
+ # end
47
+ # end
48
+
49
+ knuckleheads.save_high_scores
50
+
51
+ #knuckleheads.print_stats
52
+ #knuckleheads.high_scores
53
+
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+ # puts
87
+ #
88
+ # player4 = Player.new("alvin", 100)
89
+ # player5 = Player.new("simon", 60)
90
+ # player6 = Player.new("theodore", 125)
91
+ #
92
+ # chipmunks = Game.new("Chipmunks")
93
+ # puts chipmunks.title
94
+ # chipmunks.add_player(player4)
95
+ # chipmunks.add_player(player5)
96
+ # chipmunks.add_player(player6)
97
+ # chipmunks.add_player(player1)
98
+ # chipmunks.play
99
+
100
+
101
+
102
+
103
+
104
+ # players = [player1, player2, player3]
105
+ #
106
+ # puts "There are #{players.size} players in the game:"
107
+ #
108
+ # players.each do |player|
109
+ # puts player
110
+ # end
111
+ #
112
+ # puts
113
+ #
114
+ # players.each do |player|
115
+ # puts player.health
116
+ # end
117
+ #
118
+ # puts
119
+ #
120
+ # players.each do |player|
121
+ # player.blam
122
+ # player.w00t
123
+ # player.w00t
124
+ # puts player
125
+ # end
126
+ #
127
+ # puts
128
+ #
129
+ # puts players
130
+ #
131
+ # puts
132
+ #
133
+ # players.pop
134
+ # player4 = Player.new("Shemp", 90)
135
+ # players.push(player4)
136
+ #
137
+ # puts
138
+ #
139
+ # puts players
140
+
141
+ # players.each do
142
+
143
+
144
+
145
+
146
+ # puts
147
+
148
+ # puts player1
149
+ # puts player2
150
+ # puts player3
151
+
152
+ # puts player1.health
153
+ # puts player2.health
154
+ # puts player3.health
155
+ # puts
156
+ #
157
+ # player2.name = "lawrence"
158
+ # puts player2.name
159
+ # puts
160
+ #
161
+ # puts player1.score
162
+ # puts player1
163
+ # puts player2
164
+ # puts player3
165
+
166
+ # puts
167
+ # puts player1.inspect
168
+ # puts player2.inspect
169
+ # puts player3.inspect
170
+ # puts
171
+
172
+
173
+ # puts player3.say_hello
174
+ # player3.blam
175
+ # puts player3.say_hello
176
+ # player3.w00t
177
+ # puts player3.say_hello
178
+ # puts
179
+ #
180
+ # puts player1.say_hello
181
+ # player1.blam
182
+ # player1.blam
183
+ # player1.blam
184
+ # player1.blam
185
+ # player1.blam
186
+ # puts player1.say_hello
187
+ # player1.w00t
188
+ # player1.w00t
189
+ # player1.w00t
190
+ # player1.w00t
191
+ # player1.w00t
192
+ # puts player1.say_hello
193
+ # puts
194
+ #
195
+ # puts player2.say_hello
196
+ # player2.blam
197
+ # player2.blam
198
+ # player2.blam
199
+ # player2.blam
200
+ # player2.blam
201
+ # player2.blam
202
+ # player2.blam
203
+ # player2.blam
204
+ # puts player2.say_hello
205
+ # puts
206
+ #
207
+ #
208
+ # puts player1.say_hello
209
+ # puts player2.say_hello
210
+ # puts player3.say_hello
211
+ #
212
+ # puts player1
213
+
214
+
215
+
216
+ # def time
217
+ # current_time = Time.new
218
+ # current_time.strftime("%H:%M:%S")
219
+ # end
220
+ #
221
+ # def say_hello(name, health=100)
222
+ # "I'm #{name.capitalize} with a health of #{health} as of #{time}."
223
+ # end
224
+ #
225
+ # puts say_hello("larry", 60)
226
+ # puts say_hello("curly", 125)
227
+ # puts say_hello("moe")
228
+ # puts say_hello("shemp", 90)
229
+
230
+
231
+ # name1 = "larry"
232
+ # health1 = 60
233
+ #
234
+ # puts "#{name1.capitalize} has a health of #{health1}"
235
+ #
236
+ # name2 = "curly"
237
+ # health2 = 125
238
+ #
239
+ # puts "#{name2.upcase} has a health of #{health2}"
240
+ #
241
+ # health2 = health1
242
+ # puts "#{name2.upcase} has a health of #{health2}"
243
+ #
244
+ # health1 = 30
245
+ # puts "#{name1.capitalize} has a health of #{health1}"
246
+ # puts "#{name2.upcase} has a health of #{health2}"
247
+ #
248
+ # name3 = "moe"
249
+ # health3 = 100
250
+ #
251
+ # puts "#{name3.capitalize} has a health of #{health3}.".center(50, '*')
252
+ #
253
+ # text = "#{name3.capitalize} has a health of #{health3}."
254
+ # puts text.center(50, '*')
255
+ #
256
+ # name4 = "shemp"
257
+ # health4 = 90
258
+ #
259
+ # puts "#{name4.capitalize.ljust(30, '.')} #{health4} health"
260
+ #
261
+ # current_time = Time.new
262
+ # puts "The game started on #{current_time.strftime("%A %d/%m/%y at%l:%M%p")}"
263
+ #
264
+ # # puts name1 +'\'s health is ' + health1.to_s
265
+ # # puts "#{name1}'s health is #{health1 * 3 / 9.0}"
266
+ # #
267
+ # # puts "Players:\n\tlarry\n\tcurly\n\tmoe"
268
+ # #
269
+ # # puts "Players:\n\t#{name1}\n\t#{name2}\n\t#{name3}"
@@ -0,0 +1,7 @@
1
+ module StudioGame
2
+ module Auditable
3
+ def audit
4
+ puts "Rolled a #{self.number} (#{self.class})"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,72 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+ class BerserkPlayer < Player
5
+
6
+ def initialize(name, health=100)
7
+ super(name, health)
8
+ @w00t_counter = 0
9
+ end
10
+
11
+ def berserk?
12
+ @w00t_counter > 5
13
+ end
14
+
15
+ def w00t
16
+ super
17
+ @w00t_counter += 1
18
+ if berserk?
19
+ puts "Watch out! player #{@name} has been w00ted #{@w00t_counter} times."
20
+ else
21
+ puts "Current w00t count of player #{@name}: #{@w00t_counter}"
22
+ end
23
+ end
24
+
25
+ def blam
26
+ if berserk?
27
+ puts "Ooops! Player #{@name} went beserk! And instead of being blammed, he will be w00ted! (current w00t count: #{@w00t_counter})"
28
+ w00t
29
+ else
30
+ super
31
+ end
32
+ end
33
+
34
+ # @w00t_counter >= 5 ? puts "Watch out! This player has been w00ted 5 or more times, to precise - #{@w00t_counter} times." : puts "Current w00t count: #{@w00t_counter}"
35
+
36
+ # or use the ternary operator:
37
+
38
+ # def blam
39
+ # berserk? ? w00t : super
40
+ # end
41
+ end
42
+ end
43
+
44
+
45
+ if __FILE__ == $0
46
+ player = BerserkPlayer.new("berserk")
47
+ puts player.name
48
+ puts player.health
49
+ player.w00t
50
+ player.w00t
51
+ player.w00t
52
+ player.w00t
53
+ player.w00t
54
+ player.w00t
55
+ puts player.health
56
+ player.blam
57
+ puts player.health
58
+ player.w00t
59
+ puts player.health
60
+ player.found_treasure(TreasureTrove::random)
61
+ puts player
62
+ player.practice
63
+
64
+ puts
65
+ puts
66
+ puts
67
+
68
+ berserker = BerserkPlayer.new("berserker", 50)
69
+ 6.times { berserker.w00t }
70
+ 2.times { berserker.blam }
71
+ puts berserker.health
72
+ end
@@ -0,0 +1,95 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+ class ClumsyPlayer < Player
5
+
6
+ attr_reader :boost_factor
7
+
8
+ def initialize(name, health=100, boost_factor=1)
9
+ super(name, health)
10
+ @boost_factor = boost_factor
11
+ end
12
+
13
+ def found_treasure(treasure)
14
+
15
+ damaged_treasure = Treasure.new(treasure.name, treasure.points / 2.0)
16
+
17
+ super(damaged_treasure)
18
+ end
19
+
20
+ def w00t
21
+ @boost_factor.times{super}
22
+ puts "SUPERBOOSTED"
23
+ end
24
+
25
+ end
26
+ end
27
+
28
+
29
+ if __FILE__ == $0
30
+ clumsy = ClumsyPlayer.new("klutz", 105, 3)
31
+
32
+ hammer = Treasure.new(:hammer, 50)
33
+ clumsy.found_treasure(hammer)
34
+ clumsy.found_treasure(hammer)
35
+ clumsy.found_treasure(hammer)
36
+
37
+ crowbar = Treasure.new(:crowbar, 400)
38
+ clumsy.found_treasure(crowbar)
39
+
40
+ clumsy.each_found_treasure do |treasure|
41
+ puts "#{treasure.points} total #{treasure.name} points"
42
+ end
43
+ puts "#{clumsy.points} grand total points"
44
+
45
+
46
+ puts
47
+ puts
48
+ puts
49
+
50
+
51
+ puts clumsy.health
52
+ clumsy.w00t
53
+ puts clumsy.health
54
+ end
55
+
56
+
57
+ =begin
58
+
59
+ Klutz found a hammer worth 25 points.
60
+ Klutz's treasures: {:hammer=>25}.
61
+ hammer - 25
62
+ Klutz found a hammer worth 25 points.
63
+ Klutz's treasures: {:hammer=>50}.
64
+ hammer - 50
65
+ Klutz found a hammer worth 25 points.
66
+ Klutz's treasures: {:hammer=>75}.
67
+ hammer - 75
68
+ Klutz found a crowbar worth 200 points.
69
+ Klutz's treasures: {:hammer=>75, :crowbar=>200}.
70
+ hammer - 75
71
+ crowbar - 200
72
+ 75 total hammer points
73
+ 200 total crowbar points
74
+ 275 grand total points
75
+
76
+
77
+ Klutz found a hammer worth 50 points.
78
+ Klutz's treasures: {:hammer=>50}.
79
+ hammer - 50
80
+ Klutz found a hammer worth 50 points.
81
+ Klutz's treasures: {:hammer=>100}.
82
+ hammer - 100
83
+ Klutz found a hammer worth 50 points.
84
+ Klutz's treasures: {:hammer=>150}.
85
+ hammer - 150
86
+ Klutz found a crowbar worth 400 points.
87
+ Klutz's treasures: {:hammer=>150, :crowbar=>400}.
88
+ hammer - 150
89
+ crowbar - 400
90
+ 150 total hammer points
91
+ 400 total crowbar points
92
+ 550 grand total points
93
+
94
+ =end
95
+
@@ -0,0 +1,51 @@
1
+ require_relative 'auditable'
2
+
3
+ module StudioGame
4
+ class Die
5
+ include Auditable
6
+ attr_reader :number
7
+
8
+ def initialize
9
+ roll
10
+ end
11
+
12
+ def roll
13
+ @number = rand(1..6)
14
+ audit
15
+ @number
16
+ end
17
+ end
18
+
19
+
20
+
21
+ class LoadedDie
22
+ include Auditable
23
+ attr_reader :number
24
+
25
+ # def initialize
26
+ # roll
27
+ # end
28
+
29
+ def roll
30
+ numbers = [1, 1, 2, 5, 6, 6]
31
+ @number = numbers.sample
32
+ audit
33
+ @number
34
+ end
35
+
36
+ end
37
+ end
38
+
39
+
40
+
41
+
42
+ if __FILE__ == $0
43
+
44
+ die = Die.new
45
+
46
+ die = LoadedDie.new
47
+ puts die.roll
48
+ puts die.roll
49
+ puts die.roll
50
+
51
+ end
@@ -0,0 +1,150 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'game_turn'
4
+ require_relative 'treasure_trove'
5
+ require 'csv'
6
+
7
+ module StudioGame
8
+ class Game
9
+
10
+ attr_reader :title
11
+
12
+ def initialize(title)
13
+ @title = title
14
+ @players = []
15
+ end
16
+
17
+ def print_name_and_health(player)
18
+ puts "#{player.name} (#{player.health})"
19
+ end
20
+
21
+ def print_stats
22
+ puts "\n#{@title} Statistics:\n"
23
+ # strong_players, wimpy_players = @players.partition { |player| player.strong? }
24
+ #
25
+ # puts "\n#{strong_players.size} strong players:"
26
+ # strong_players.each do |player|
27
+ # print_name_and_health(player)
28
+ # end
29
+ #
30
+ # puts "\n#{wimpy_players.size} wimpy players:"
31
+ # wimpy_players.each do |player|
32
+ # print_name_and_health(player)
33
+ # end
34
+
35
+ @players.each do |player|
36
+ puts "#{player.name}'s point totals:"
37
+
38
+ # B
39
+ player.each_found_treasure do |treasure|
40
+ puts "#{treasure.points} total #{treasure.name} points"
41
+ end
42
+
43
+ # another way (alternative for player.each_found_treasure above)
44
+ player.practice
45
+
46
+ puts "#{player.points} GRAND TOTAL points\n\n"
47
+ end
48
+
49
+
50
+ puts "\n#{title} High Scores:"
51
+ @players.sort.each do |player|
52
+ puts print_high_scores(player)
53
+ end
54
+
55
+
56
+ puts "Total found treasures by all players: #{total_points}"
57
+ puts "\n----------------------------------------------------------"
58
+
59
+ end
60
+
61
+
62
+ def total_points
63
+ @players.reduce(0){|sum, player| sum + player.points}
64
+ end
65
+
66
+
67
+ def add_player(a_player)
68
+ @players << a_player
69
+ end
70
+
71
+ def play(rounds)
72
+
73
+ puts "There are #{@players.size} players in #{@title}:\n\n"
74
+
75
+ @players.each do |player|
76
+ puts player
77
+ end
78
+
79
+ treasures = TreasureTrove::TREASURES
80
+
81
+ puts "There are #{treasures.size} treasures to be found:"
82
+ treasures.each do |treasure|
83
+ puts "A #{treasure.name} is worth #{treasure.points} points"
84
+ end
85
+
86
+ puts "\n* * * * * * * * * * * * * * * * * * * *"
87
+
88
+ 1.upto(rounds) do |round|
89
+
90
+ if block_given?
91
+ break if yield
92
+ end
93
+
94
+ puts "\nRound #{round}:\n\n"
95
+ @players.each do |player|
96
+ GameTurn.take_turn(player)
97
+ puts player
98
+
99
+ end
100
+ print_stats
101
+ end
102
+ end
103
+
104
+ # Input / Output
105
+
106
+ def print_high_scores(player)
107
+ formatted_name = player.name.ljust(20, '.')
108
+ "#{formatted_name} #{player.score}"
109
+ end
110
+
111
+
112
+ # def turning_CSV_string_into_a_Player_object(line)
113
+ # name, health = line.split(',')
114
+ # player = Player.new(name, Integer(health))
115
+ # end
116
+
117
+ def load_players(from_file)
118
+ CSV.foreach(from_file) do |row|
119
+ player = Player.new(row[0], row[1].to_i)
120
+ add_player(player)
121
+
122
+ # File.readlines(from_file).each do |line|
123
+ # add_player(turning_CSV_string_into_a_Player_object(line))
124
+
125
+ end
126
+ end
127
+
128
+ def save_high_scores(to_file="high_scores.txt")
129
+ File.open(to_file, "w") do |file|
130
+ file.puts "#{@title} High Scores:"
131
+ @players.sort.each do |player|
132
+ file.puts print_high_scores(player)
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+
140
+ if __FILE__ == $0
141
+ player1 = Player.new("moe")
142
+ player2 = Player.new("larry", 60)
143
+ knuckleheads = Game.new("Knuckleheads")
144
+ puts knuckleheads.title
145
+ knuckleheads.add_player(player1)
146
+ knuckleheads.add_player(player2)
147
+ #knuckleheads.print_name_and_health(player1)
148
+
149
+ knuckleheads.play(1)
150
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'treasure_trove'
4
+
5
+ module StudioGame
6
+ module GameTurn
7
+
8
+ def self.take_turn(player)
9
+ die = Die.new
10
+ case die.roll
11
+ when 1..2
12
+ player.blam
13
+ when 3..4
14
+ puts "#{player.name} was skipped."
15
+ else
16
+ player.w00t
17
+ end
18
+
19
+ random_treasure = TreasureTrove.random
20
+ # puts "#{player.name} found a #{random_treasure.name} worth #{random_treasure.points} points."
21
+ player.found_treasure(random_treasure)
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,19 @@
1
+ module StudioGame
2
+ module Playable
3
+
4
+ def blam
5
+ self.health -= 10
6
+ puts "#{self.name} got blammed!"
7
+ end
8
+
9
+ def w00t
10
+ self.health += 15
11
+ puts "#{self.name} got w00ted! (+15)"
12
+ end
13
+
14
+ def strong?
15
+ self.health > 100
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,74 @@
1
+ require_relative 'treasure_trove'
2
+ require_relative 'playable'
3
+
4
+ module StudioGame
5
+ class Player
6
+ include Playable
7
+
8
+ attr_accessor :name
9
+ attr_accessor :health
10
+
11
+ def initialize(name, health=100)
12
+ @name = name.capitalize
13
+ @health = health
14
+ @found_treasures = Hash.new(0)
15
+ end
16
+
17
+ def to_s
18
+ "I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}.\n\n"
19
+ end
20
+
21
+
22
+ def score
23
+ self.health + points
24
+ end
25
+
26
+ def <=>(other)
27
+ other.score <=> score
28
+ end
29
+
30
+ def found_treasure(treasure)
31
+ @found_treasures[treasure.name] += treasure.points
32
+ puts "#{@name} found a #{treasure.name} worth #{treasure.points} points."
33
+ puts "#{@name}'s treasures: #{@found_treasures}."
34
+ practice
35
+ # puts "#{treasure.name} accumulated #{treasure.points} points."
36
+ end
37
+
38
+ def points
39
+ @found_treasures.values.reduce(0, :+)
40
+ end
41
+
42
+ # A
43
+ def each_found_treasure
44
+ @found_treasures.each do |name, points|
45
+ treasure = Treasure.new(name, points)
46
+ yield treasure # or in one line: yield Treasure.new(name, points)
47
+ end
48
+ end
49
+
50
+ # another way (alternative for def each_found_treasure)
51
+ def practice
52
+ @found_treasures.each do |key, value|
53
+ print "#{key} - #{value}\n"
54
+ end
55
+ end
56
+
57
+ end
58
+ end
59
+
60
+ #some example code
61
+
62
+ if __FILE__ == $0
63
+ player = StudioGame::Player.new("moe")
64
+ puts player.name
65
+ puts player.health
66
+ player.w00t
67
+ puts player.health
68
+ player.blam
69
+ puts player.health
70
+ player.found_treasure(TreasureTrove::random)
71
+ puts player
72
+ puts player.score
73
+ player.practice
74
+ end
@@ -0,0 +1,30 @@
1
+ module StudioGame
2
+ Treasure = Struct.new(:name, :points)
3
+
4
+ # attr_reader :name, :points
5
+
6
+ module TreasureTrove
7
+
8
+ TREASURES = [
9
+ Treasure.new(:pie, 5),
10
+ Treasure.new(:bottle, 25),
11
+ Treasure.new(:hammer, 50),
12
+ Treasure.new(:skillet, 100),
13
+ Treasure.new(:broomstick, 200),
14
+ Treasure.new(:crowbar, 400)
15
+ ]
16
+
17
+ def self.random
18
+ TREASURES.sample
19
+ end
20
+
21
+ end
22
+ end
23
+
24
+
25
+ if __FILE__ == $0
26
+ # puts TreasureTrove::TREASURES
27
+
28
+ puts TreasureTrove::random.name
29
+
30
+ end
@@ -0,0 +1,31 @@
1
+ # require_relative 'berserk_player'
2
+ require 'studio_game/berserk_player'
3
+
4
+ module StudioGame
5
+ describe BerserkPlayer do
6
+
7
+ before do
8
+ @initial_health = 50
9
+ @player = BerserkPlayer.new("berserker", @initial_health)
10
+ end
11
+
12
+ it "does not go berserk when w00ted up to 5 times" do
13
+ 1.upto(5) { @player.w00t }
14
+
15
+ @player.berserk?.should be_false
16
+ end
17
+
18
+ it "goes berserk when w00ted more than 5 times" do
19
+ 1.upto(6) { @player.w00t }
20
+
21
+ @player.berserk?.should be_true
22
+ end
23
+
24
+ it "gets w00ted instead of blammed when it's gone berserk" do
25
+ 1.upto(6) { @player.w00t }
26
+ 1.upto(2) { @player.blam }
27
+
28
+ @player.health.should == @initial_health + (8 * 15)
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,51 @@
1
+ # require_relative 'clumsy_player'
2
+ require 'studio_game/clumsy_player'
3
+
4
+ module StudioGame
5
+ describe ClumsyPlayer do
6
+ before do
7
+ @player = ClumsyPlayer.new("klutz")
8
+ end
9
+
10
+ it "only gets half the point value for each treasure" do
11
+ @player.points.should == 0
12
+
13
+ hammer = Treasure.new(:hammer, 50)
14
+ @player.found_treasure(hammer)
15
+ @player.found_treasure(hammer)
16
+ @player.found_treasure(hammer)
17
+
18
+ @player.points.should == 75
19
+
20
+ crowbar = Treasure.new(:crowbar, 400)
21
+ @player.found_treasure(crowbar)
22
+
23
+ @player.points.should == 275
24
+
25
+ yielded = []
26
+ @player.each_found_treasure do |treasure|
27
+ yielded << treasure
28
+ end
29
+
30
+ yielded.should == [Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)]
31
+ end
32
+
33
+ context "with a boost factor" do
34
+ before do
35
+ @initial_health = 100
36
+ @boost_factor = 5
37
+ @player = ClumsyPlayer.new("klutz", @initial_health, @boost_factor)
38
+ end
39
+
40
+ it "has a boost factor" do
41
+ @player.boost_factor.should == 5
42
+ end
43
+
44
+ it "gets boost factor number of w00ts when w00ted" do
45
+ @player.w00t
46
+
47
+ @player.health.should == @initial_health + (15 * @boost_factor)
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,77 @@
1
+ # require_relative 'game'
2
+ require 'studio_game/game'
3
+
4
+ module StudioGame
5
+ describe Game do
6
+
7
+ before do
8
+ @game = Game.new("Knuckleheads")
9
+
10
+ @initial_health = 100
11
+ @player = Player.new("moe", @initial_health)
12
+
13
+ @game.add_player(@player)
14
+
15
+ #$stdout = StringIO.new
16
+ end
17
+
18
+ it "has a title" do
19
+ @game.title.should == "Knuckleheads"
20
+ end
21
+
22
+ it "w00ts the player if a high number is rolled" do
23
+ Die.any_instance.stub(:roll).and_return(5)
24
+
25
+ @game.play(2)
26
+
27
+ @player.health.should == @initial_health + (15 * 2)
28
+ end
29
+
30
+ it "skips the player if a medium number is rolled" do
31
+ Die.any_instance.stub(:roll).and_return(3)
32
+
33
+ @game.play(2)
34
+
35
+ @player.health.should == @initial_health
36
+ end
37
+
38
+ it "blams the player if a low number is rolled" do
39
+ Die.any_instance.stub(:roll).and_return(1)
40
+
41
+ @game.play(2)
42
+
43
+ @player.health.should == @initial_health - (10 * 2)
44
+ end
45
+
46
+ it "assigns a treasure for points during a player's turn" do
47
+ game = Game.new("Knuckleheads")
48
+ player = Player.new("moe")
49
+
50
+ game.add_player(player)
51
+
52
+ game.play(1)
53
+
54
+ player.points.should_not be_zero
55
+
56
+ # or use alternate expectation syntax:
57
+ # expect(player.points).not_to be_zero
58
+ end
59
+
60
+
61
+ it "computes total points as the sum of all player points" do
62
+ game = Game.new("Knuckleheads")
63
+
64
+ player1 = Player.new("moe")
65
+ player2 = Player.new("larry")
66
+
67
+ game.add_player(player1)
68
+ game.add_player(player2)
69
+
70
+ player1.found_treasure(Treasure.new(:hammer, 50))
71
+ player1.found_treasure(Treasure.new(:hammer, 50))
72
+ player2.found_treasure(Treasure.new(:crowbar, 400))
73
+
74
+ game.total_points.should == 500
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,121 @@
1
+ # require_relative '../../lib/studio_game/player'
2
+ require 'studio_game/player'
3
+
4
+ module StudioGame
5
+ describe Player do
6
+
7
+ before do
8
+ @initial_health = 150
9
+ @player = Player.new("larry", @initial_health)
10
+ $stdout = StringIO.new
11
+ end
12
+
13
+ it "has a capitalized name" do
14
+ @player.name.should == "Larry"
15
+ end
16
+
17
+ it "has an initial health" do
18
+ @player.health.should == 150
19
+ end
20
+
21
+ it "has a string representation" do
22
+ @player.found_treasure(Treasure.new(:hammer, 50))
23
+ @player.found_treasure(Treasure.new(:hammer, 50))
24
+ puts @player.to_s.should == "I'm Larry with health = 150, points = 100, and score = 250.\n\n"
25
+ end
26
+
27
+ it "computes a score as the sum of its health and points" do
28
+ @player.found_treasure(Treasure.new(:hammer, 50))
29
+ @player.found_treasure(Treasure.new(:hammer, 50))
30
+
31
+ @player.score.should == 250
32
+ end
33
+
34
+ it "increases health by 15 when w00ted" do
35
+ @player.w00t
36
+
37
+ @player.health.should == (@initial_health + 15)
38
+ end
39
+
40
+ it "decreases health by 10 when blammed" do
41
+ @player.blam
42
+
43
+ @player.health.should == (@initial_health - 10)
44
+ end
45
+
46
+ context "with a health greater than 100" do
47
+ before do
48
+ @player = Player.new("larry", 150)
49
+ end
50
+
51
+ it "is strong" do
52
+ @player.should be_strong #instead of: strong?.should be_true
53
+ end
54
+ end
55
+
56
+ context "with a health of 100 or less" do
57
+ before do
58
+ @player = Player.new("larry", 100)
59
+ end
60
+
61
+ it "is wimpy" do
62
+ @player.should_not be_strong #(instead of: @player.strong?.should_not be_true)
63
+ end
64
+ end
65
+
66
+ context "in a collection of players" do
67
+ before do
68
+ @player1 = Player.new("moe", 100)
69
+ @player2 = Player.new("larry", 200)
70
+ @player3 = Player.new("curly", 300)
71
+
72
+ @players = [@player1, @player2, @player3]
73
+ end
74
+
75
+ it "is sorted by decreasing score" do
76
+ @players.sort.should == [@player3, @player2, @player1]
77
+ end
78
+ end
79
+
80
+
81
+ it "computes points as the sum of all treasure points" do
82
+ @player.points.should == 0
83
+
84
+ @player.found_treasure(Treasure.new(:hammer, 50))
85
+
86
+ @player.points.should == 50
87
+
88
+ @player.found_treasure(Treasure.new(:crowbar, 400))
89
+
90
+ @player.points.should == 450
91
+
92
+ @player.found_treasure(Treasure.new(:hammer, 50))
93
+
94
+ @player.points.should == 500
95
+ end
96
+
97
+
98
+ it "yields each found treasure and its total points" do
99
+ @player.found_treasure(Treasure.new(:skillet, 100))
100
+ @player.found_treasure(Treasure.new(:skillet, 100))
101
+ @player.found_treasure(Treasure.new(:hammer, 50))
102
+ @player.found_treasure(Treasure.new(:bottle, 5))
103
+ @player.found_treasure(Treasure.new(:bottle, 5))
104
+ @player.found_treasure(Treasure.new(:bottle, 5))
105
+ @player.found_treasure(Treasure.new(:bottle, 5))
106
+ @player.found_treasure(Treasure.new(:bottle, 5))
107
+
108
+ yielded = []
109
+ @player.each_found_treasure do |treasure|
110
+ yielded << treasure
111
+ end
112
+
113
+ yielded.should == [
114
+ Treasure.new(:skillet, 200),
115
+ Treasure.new(:hammer, 50),
116
+ Treasure.new(:bottle, 25)
117
+ ]
118
+ end
119
+
120
+ end
121
+ end
@@ -0,0 +1,12 @@
1
+ require_relative 'project'
2
+ require 'test/unit'
3
+
4
+ module StudioGame
5
+ class TestProject < Test::Unit::TestCase
6
+
7
+ def test1
8
+ assert_equal(200, Project.new("SPC", 200, 800).funding)
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1,61 @@
1
+ # require_relative 'treasure_trove'
2
+ require 'studio_game/treasure_trove'
3
+
4
+ module StudioGame
5
+ describe Treasure do
6
+
7
+ before do
8
+ @treasure = Treasure.new(:hammer, 50)
9
+ end
10
+
11
+ it "has a name attribute" do
12
+ @treasure.name.should == :hammer
13
+ end
14
+
15
+ it "has a points attribute" do
16
+ @treasure.points.should == 50
17
+ end
18
+
19
+ end
20
+
21
+
22
+ describe TreasureTrove do
23
+
24
+ it "has six treasures" do
25
+ TreasureTrove::TREASURES.size.should == 6
26
+ end
27
+
28
+ it "has a pie worth 5 points" do
29
+ TreasureTrove::TREASURES[0].should == Treasure.new(:pie, 5)
30
+ end
31
+
32
+ it "has a bottle worth 25 points" do
33
+ TreasureTrove::TREASURES[1].should == Treasure.new(:bottle, 25)
34
+ end
35
+
36
+ it "has a hammer worth 50 points" do
37
+ TreasureTrove::TREASURES[2].should == Treasure.new(:hammer, 50)
38
+ end
39
+
40
+ it "has a skillet worth 100 points" do
41
+ TreasureTrove::TREASURES[3].should == Treasure.new(:skillet, 100)
42
+ end
43
+
44
+ it "has a broomstick worth 200 points" do
45
+ TreasureTrove::TREASURES[4].should == Treasure.new(:broomstick, 200)
46
+ end
47
+
48
+ it "has a crowbar worth 400 points" do
49
+ TreasureTrove::TREASURES[5].should == Treasure.new(:crowbar, 400)
50
+ end
51
+
52
+ it "returns a random treasure" do
53
+ treasure = TreasureTrove.random
54
+
55
+ TreasureTrove::TREASURES.should include(treasure)
56
+
57
+ # or use alternate expectation syntax:
58
+ # expect(TreasureTrove::TREASURES).to include(treasure)
59
+ end
60
+ end
61
+ end
metadata ADDED
@@ -0,0 +1,86 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game_mike_brooks
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Mike Brooks
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-04-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: The README should contain a short description of what your gem does and
28
+ how to use it.
29
+ email: brooksbrisbane@gmail.com
30
+ executables:
31
+ - studio_game
32
+ extensions: []
33
+ extra_rdoc_files: []
34
+ files:
35
+ - LICENSE
36
+ - README
37
+ - bin/high_scores.txt
38
+ - bin/my_favourite_players.csv
39
+ - bin/players.csv
40
+ - bin/studio_game
41
+ - lib/studio_game/auditable.rb
42
+ - lib/studio_game/berserk_player.rb
43
+ - lib/studio_game/clumsy_player.rb
44
+ - lib/studio_game/die.rb
45
+ - lib/studio_game/game.rb
46
+ - lib/studio_game/game_turn.rb
47
+ - lib/studio_game/playable.rb
48
+ - lib/studio_game/player.rb
49
+ - lib/studio_game/treasure_trove.rb
50
+ - spec/studio_game/berserk_player_spec.rb
51
+ - spec/studio_game/clumsy_player_spec.rb
52
+ - spec/studio_game/game_spec.rb
53
+ - spec/studio_game/player_spec.rb
54
+ - spec/studio_game/project_unit_testing.rb
55
+ - spec/studio_game/treasure_trove_spec.rb
56
+ homepage: http://www.brooksmike.com
57
+ licenses:
58
+ - MIT
59
+ metadata: {}
60
+ post_install_message:
61
+ rdoc_options: []
62
+ require_paths:
63
+ - lib
64
+ required_ruby_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '1.9'
69
+ required_rubygems_version: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - '>='
72
+ - !ruby/object:Gem::Version
73
+ version: '0'
74
+ requirements: []
75
+ rubyforge_project:
76
+ rubygems_version: 2.2.2
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: gem created only for practice purposes
80
+ test_files:
81
+ - spec/studio_game/berserk_player_spec.rb
82
+ - spec/studio_game/clumsy_player_spec.rb
83
+ - spec/studio_game/game_spec.rb
84
+ - spec/studio_game/player_spec.rb
85
+ - spec/studio_game/project_unit_testing.rb
86
+ - spec/studio_game/treasure_trove_spec.rb