mikesstudiogame 1.0.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.
- data/LICENSE +2 -0
- data/README +3 -0
- data/bin/high_scores.txt +7 -0
- data/bin/iterators.rb +21 -0
- data/bin/my_favourite_players.csv +4 -0
- data/bin/players.csv +3 -0
- data/bin/studio_game +54 -0
- data/lib/studio_game/auditable.rb +10 -0
- data/lib/studio_game/berserk_player.rb +36 -0
- data/lib/studio_game/clumsy_player.rb +40 -0
- data/lib/studio_game/die.rb +20 -0
- data/lib/studio_game/game.rb +107 -0
- data/lib/studio_game/game_turn.rb +25 -0
- data/lib/studio_game/loaded_die.rb +21 -0
- data/lib/studio_game/playable.rb +18 -0
- data/lib/studio_game/player.rb +61 -0
- data/lib/studio_game/treasure_trove.rb +19 -0
- data/spec/studio_game/berserk_player_spec.rb +17 -0
- data/spec/studio_game/clumsy_player_spec.rb +52 -0
- data/spec/studio_game/game_spec.rb +71 -0
- data/spec/studio_game/player_spec.rb +112 -0
- data/spec/studio_game/treasure_trove_spec.rb +57 -0
- metadata +91 -0
data/LICENSE
ADDED
data/README
ADDED
data/bin/high_scores.txt
ADDED
data/bin/iterators.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
def conversation
|
2
|
+
puts "Hello"
|
3
|
+
yield
|
4
|
+
puts "Goodbye"
|
5
|
+
end
|
6
|
+
|
7
|
+
conversation { puts "Good to meet you!" }
|
8
|
+
|
9
|
+
|
10
|
+
def n_times(number)
|
11
|
+
1.upto(number) do |n|
|
12
|
+
yield n
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
n_times(5) do |n|
|
17
|
+
puts "#{n} situps"
|
18
|
+
puts "#{n} pushups"
|
19
|
+
puts "#{n} chinups"
|
20
|
+
end
|
21
|
+
|
data/bin/players.csv
ADDED
data/bin/studio_game
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/studio_game/clumsy_player'
|
4
|
+
require_relative '../lib/studio_game/berserk_player'
|
5
|
+
require_relative '../lib/studio_game/game'
|
6
|
+
|
7
|
+
# player1 = Player.new("moe")
|
8
|
+
# player2 = Player.new("larry",60)
|
9
|
+
# player3 = Player.new("curly",125)
|
10
|
+
# player4 = Player.new("shemp",90)
|
11
|
+
# players = [player1, player2, player3,player4]
|
12
|
+
# players.pop
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
knuckleheads = StudioGame::Game.new("Knuckleheads")
|
17
|
+
|
18
|
+
default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
|
19
|
+
knuckleheads.load_players(ARGV.shift || default_player_file)
|
20
|
+
|
21
|
+
klutz = StudioGame::ClumsyPlayer.new("klutz",105)
|
22
|
+
knuckleheads.add_player(klutz)
|
23
|
+
|
24
|
+
superklutz = StudioGame::ClumsyPlayer.new("superklutz",105,3)
|
25
|
+
knuckleheads.add_player(superklutz)
|
26
|
+
|
27
|
+
berserker = StudioGame::BerserkPlayer.new("berserker", 50)
|
28
|
+
knuckleheads.add_player(berserker)
|
29
|
+
|
30
|
+
# players.each do |p|
|
31
|
+
# knuckleheads.add_player(p)
|
32
|
+
# end
|
33
|
+
|
34
|
+
loop do
|
35
|
+
puts "How many game rounds? ('quit' to exit)"
|
36
|
+
answer = gets.chomp.downcase
|
37
|
+
case answer
|
38
|
+
when /^\d+$/
|
39
|
+
knuckleheads.play(answer.to_i)
|
40
|
+
when 'quit','exit'
|
41
|
+
knuckleheads.print_treasures
|
42
|
+
knuckleheads.print_stats
|
43
|
+
break
|
44
|
+
else
|
45
|
+
"Please enter a valid number of rounds (or 'quit')"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
knuckleheads.save_high_scores
|
50
|
+
|
51
|
+
|
52
|
+
|
53
|
+
|
54
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
class BerserkPlayer < Player
|
5
|
+
|
6
|
+
def initialize(name, health)
|
7
|
+
super(name, health)
|
8
|
+
@w00t_count = 0
|
9
|
+
end
|
10
|
+
|
11
|
+
def w00t
|
12
|
+
super
|
13
|
+
@w00t_count += 1
|
14
|
+
puts "#{@name} is beserk!" if beserk?
|
15
|
+
end
|
16
|
+
|
17
|
+
def blam
|
18
|
+
if beserk?
|
19
|
+
w00t
|
20
|
+
else
|
21
|
+
super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def beserk?
|
26
|
+
@w00t_count > 5
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if __FILE__ == $0
|
32
|
+
berserker = BerserkPlayer.new("berserker", 50)
|
33
|
+
6.times { berserker.w00t }
|
34
|
+
2.times { berserker.blam }
|
35
|
+
puts berserker.health
|
36
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
class ClumsyPlayer < Player
|
5
|
+
|
6
|
+
attr_reader :boost
|
7
|
+
|
8
|
+
def initialize(name, health, boost=1)
|
9
|
+
super(name,health)
|
10
|
+
@boost = boost
|
11
|
+
end
|
12
|
+
|
13
|
+
def found_treasure(treasure)
|
14
|
+
damaged = Treasure.new(treasure.name, treasure.points / 2.0)
|
15
|
+
super(damaged)
|
16
|
+
end
|
17
|
+
|
18
|
+
def w00t
|
19
|
+
(@boost).times { super }
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if __FILE__ == $0
|
26
|
+
clumsy = ClumsyPlayer.new("klutz")
|
27
|
+
|
28
|
+
hammer = Treasure.new(:hammer, 50)
|
29
|
+
clumsy.found_treasure(hammer)
|
30
|
+
clumsy.found_treasure(hammer)
|
31
|
+
clumsy.found_treasure(hammer)
|
32
|
+
|
33
|
+
crowbar = Treasure.new(:crowbar, 400)
|
34
|
+
clumsy.found_treasure(crowbar)
|
35
|
+
|
36
|
+
clumsy.each_found_treasure do |treasure|
|
37
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
38
|
+
end
|
39
|
+
puts "#{clumsy.points} grand total points"
|
40
|
+
end
|
@@ -0,0 +1,107 @@
|
|
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
|
+
def initialize(title)
|
11
|
+
@title = title.capitalize
|
12
|
+
@players = []
|
13
|
+
@die = Die.new
|
14
|
+
@game_total_points = 0
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_player(player)
|
18
|
+
@players << player
|
19
|
+
end
|
20
|
+
|
21
|
+
def print_stats
|
22
|
+
puts "\n#{@title} Statistics:"
|
23
|
+
strong_players, weak_players = @players.partition {|p| p.strong?}
|
24
|
+
puts "\n#{strong_players.size} strong players:"
|
25
|
+
strong_players.each do |player|
|
26
|
+
print_name_and_health(player)
|
27
|
+
end
|
28
|
+
puts "\n#{weak_players.size} weak players:"
|
29
|
+
weak_players.each do |player|
|
30
|
+
print_name_and_health(player)
|
31
|
+
end
|
32
|
+
point_totals
|
33
|
+
get_high_scores
|
34
|
+
puts "\n#{game_total_points} total points from treasures found"
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_high_scores
|
38
|
+
puts "\n#{@title} High Scores:"
|
39
|
+
@players.sort.each do |player|
|
40
|
+
puts high_score_string(player)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def high_score_string(player)
|
45
|
+
"#{player.name.ljust(20,'.')} #{player.score}"
|
46
|
+
end
|
47
|
+
|
48
|
+
def print_name_and_health(player)
|
49
|
+
puts "#{player.name} (#{player.health})"
|
50
|
+
end
|
51
|
+
|
52
|
+
def point_totals
|
53
|
+
@players.each do |p|
|
54
|
+
puts "\n#{p.name}'s point totals:"
|
55
|
+
p.each_found_treasure do |treasure|
|
56
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
57
|
+
end
|
58
|
+
|
59
|
+
puts "#{p.points} grand total points"
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def game_total_points
|
64
|
+
@players.reduce(0) {|sum, player| sum + player.points}
|
65
|
+
end
|
66
|
+
|
67
|
+
def play(rounds)
|
68
|
+
puts "There are #{@players.size} players in #{@title}"
|
69
|
+
@players.each do |p|
|
70
|
+
puts p
|
71
|
+
end
|
72
|
+
1.upto(rounds) do |round|
|
73
|
+
if block_given?
|
74
|
+
break if yield
|
75
|
+
end
|
76
|
+
puts "\nRound #{round}"
|
77
|
+
@players.each do |p|
|
78
|
+
GameTurn.take_turn(p)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def print_treasures
|
84
|
+
treasures = TreasureTrove::TREASURES
|
85
|
+
puts "\nThere are #{treasures.size} available treasures:"
|
86
|
+
treasures.each do |t|
|
87
|
+
puts "#{t.name} (#{t.points} points)"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def load_players(file_name)
|
92
|
+
File.readlines(file_name).each do |line|
|
93
|
+
add_player(Player.from_csv(line))
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def save_high_scores(file_name="high_scores.txt")
|
98
|
+
File.open(file_name, "w") do |file|
|
99
|
+
file.puts "#{@title} High Scores:"
|
100
|
+
@players.sort.each do |player|
|
101
|
+
file.puts high_score_string(player)
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
require_relative 'die'
|
3
|
+
require_relative 'loaded_die'
|
4
|
+
require_relative 'treasure_trove'
|
5
|
+
|
6
|
+
module StudioGame
|
7
|
+
module GameTurn
|
8
|
+
|
9
|
+
def self.take_turn(player)
|
10
|
+
die = Die.new
|
11
|
+
case die.roll
|
12
|
+
when 1..2
|
13
|
+
player.blam
|
14
|
+
when 3..4
|
15
|
+
puts "#{player.name} was skipped"
|
16
|
+
else
|
17
|
+
player.w00t
|
18
|
+
end
|
19
|
+
treasure = TreasureTrove.random
|
20
|
+
player.found_treasure(treasure)
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require_relative 'auditable'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
class LoadedDie
|
5
|
+
include Auditable
|
6
|
+
|
7
|
+
attr_reader :number
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
roll
|
11
|
+
end
|
12
|
+
|
13
|
+
def roll
|
14
|
+
numbers = [1, 1, 2, 5, 6, 6]
|
15
|
+
@number = numbers.sample
|
16
|
+
audit
|
17
|
+
@number
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative 'treasure_trove'
|
2
|
+
require_relative 'playable'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
class Player
|
6
|
+
include Playable
|
7
|
+
attr_accessor :health
|
8
|
+
attr_accessor :name
|
9
|
+
|
10
|
+
def initialize(name, health=100)
|
11
|
+
@name = name.capitalize
|
12
|
+
@health = health
|
13
|
+
@found_treasures = Hash.new(0)
|
14
|
+
end
|
15
|
+
|
16
|
+
def <=>(other)
|
17
|
+
other.score <=> score
|
18
|
+
end
|
19
|
+
|
20
|
+
def to_s
|
21
|
+
"I'm #{@name} with a health of #{@health}, points of #{points} and a score of #{score}"
|
22
|
+
end
|
23
|
+
|
24
|
+
def score
|
25
|
+
@health + points
|
26
|
+
end
|
27
|
+
|
28
|
+
def found_treasure(treasure)
|
29
|
+
@found_treasures[treasure.name] += treasure.points
|
30
|
+
puts "#{@name} found a #{treasure.name} worth #{treasure.points} points"
|
31
|
+
puts "#{@name}'s treasures: #{@found_treasures}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def points
|
35
|
+
@found_treasures.values.reduce(0,:+)
|
36
|
+
end
|
37
|
+
|
38
|
+
def each_found_treasure
|
39
|
+
@found_treasures.each do |name, points|
|
40
|
+
t = Treasure.new(name, points)
|
41
|
+
yield t
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.from_csv(csv_string)
|
46
|
+
name, health = csv_string.split(",")
|
47
|
+
new(name, Integer(health))
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
if __FILE__ == $0
|
54
|
+
player = Player.new("moe")
|
55
|
+
puts player.name
|
56
|
+
puts player.health
|
57
|
+
player.w00t
|
58
|
+
puts player.health
|
59
|
+
player.blam
|
60
|
+
puts player.health
|
61
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module StudioGame
|
2
|
+
|
3
|
+
Treasure = Struct.new(:name, :points)
|
4
|
+
|
5
|
+
module TreasureTrove
|
6
|
+
TREASURES = [
|
7
|
+
Treasure.new(:pie, 5),
|
8
|
+
Treasure.new(:bottle, 25),
|
9
|
+
Treasure.new(:hammer,50),
|
10
|
+
Treasure.new(:skillet, 100),
|
11
|
+
Treasure.new(:broomstick, 200),
|
12
|
+
Treasure.new(:crowbar, 400)
|
13
|
+
]
|
14
|
+
|
15
|
+
def self.random
|
16
|
+
TREASURES.sample
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'studio_game/berserk_player'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
describe BerserkPlayer do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@berserker = BerserkPlayer.new("berserker",50)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "blams become w00ts after six w00ts" do
|
11
|
+
6.times { @berserker.w00t }
|
12
|
+
2.times { @berserker.blam }
|
13
|
+
@berserker.health.should == 170
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'studio_game/clumsy_player'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
describe ClumsyPlayer do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@player = ClumsyPlayer.new("klutz",0)
|
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 boost factor" do
|
34
|
+
before do
|
35
|
+
@initial_health = 100
|
36
|
+
@boost = 5
|
37
|
+
@player = ClumsyPlayer.new("klutz", @initial_health, @boost)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "has boost factor" do
|
41
|
+
@player.boost.should == 5
|
42
|
+
end
|
43
|
+
|
44
|
+
it "gets boost factor number of w00ts when w00ted" do
|
45
|
+
@player.w00t
|
46
|
+
@player.health.should == @initial_health + 15 * @boost
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'studio_game/game'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
describe Game do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@game = Game.new("Knuckleheads")
|
8
|
+
|
9
|
+
@health = 100
|
10
|
+
@player = Player.new("moe", @health)
|
11
|
+
|
12
|
+
@game.add_player(@player)
|
13
|
+
$stdout = StringIO.new
|
14
|
+
end
|
15
|
+
|
16
|
+
it "rolls a high number" do
|
17
|
+
Die.any_instance.stub(:roll).and_return(5)
|
18
|
+
|
19
|
+
@game.play(2)
|
20
|
+
|
21
|
+
@player.health.should == @health + (15 * 2)
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
it "rolls a medium number" do
|
26
|
+
Die.any_instance.stub(:roll).and_return(3)
|
27
|
+
|
28
|
+
@game.play(2)
|
29
|
+
|
30
|
+
@player.health.should == @health
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
it "rolls a low number" do
|
35
|
+
Die.any_instance.stub(:roll).and_return(1)
|
36
|
+
|
37
|
+
@game.play(2)
|
38
|
+
|
39
|
+
@player.health.should == @health - (10 * 2)
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
it "assigns a treasure for points during a player's turn" do
|
44
|
+
game = Game.new("Knuckleheads")
|
45
|
+
player = Player.new("moe")
|
46
|
+
|
47
|
+
game.add_player(player)
|
48
|
+
|
49
|
+
game.play(1)
|
50
|
+
|
51
|
+
player.points.should_not be_zero
|
52
|
+
end
|
53
|
+
|
54
|
+
context "in a collection of players" do
|
55
|
+
|
56
|
+
before do
|
57
|
+
@player1 = Player.new("moe",100)
|
58
|
+
@player2 = Player.new("larry",200)
|
59
|
+
@player3 = Player.new("curly",300)
|
60
|
+
|
61
|
+
@players = [@player1, @player2, @player3]
|
62
|
+
end
|
63
|
+
|
64
|
+
it "is sorted by decreasing score" do
|
65
|
+
@players.sort.should == [@player3, @player2, @player1]
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'studio_game/player'
|
2
|
+
require 'studio_game/treasure_trove'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
describe Player do
|
6
|
+
|
7
|
+
before do
|
8
|
+
player = Player.new("larry", 150)
|
9
|
+
@player = player
|
10
|
+
@health = @player.health
|
11
|
+
$stdout = StringIO.new
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has capitalised name" do
|
15
|
+
@player.name.should == "Larry"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "has an initial health" do
|
19
|
+
@player.health.should == 150
|
20
|
+
end
|
21
|
+
|
22
|
+
it "has a string representation" do
|
23
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
24
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
25
|
+
|
26
|
+
@player.to_s.should == "I'm Larry with a health of 150, points of 100 and a score of 250"
|
27
|
+
end
|
28
|
+
|
29
|
+
it "computes a score as the sum of its health and points" do
|
30
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
31
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
32
|
+
|
33
|
+
@player.score.should == 250
|
34
|
+
end
|
35
|
+
|
36
|
+
it "increases health by 15 when w00ted" do
|
37
|
+
@player.w00t
|
38
|
+
@player.health.should == @health + 15
|
39
|
+
end
|
40
|
+
|
41
|
+
it "decreases health by 10 when blammed" do
|
42
|
+
@player.blam
|
43
|
+
@player.health == @health - 10
|
44
|
+
end
|
45
|
+
|
46
|
+
it "computes points as the sum of all treasure points" do
|
47
|
+
@player.points.should == 0
|
48
|
+
|
49
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
50
|
+
|
51
|
+
@player.points.should == 50
|
52
|
+
|
53
|
+
@player.found_treasure(Treasure.new(:crowbar, 400))
|
54
|
+
|
55
|
+
@player.points.should == 450
|
56
|
+
|
57
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
58
|
+
|
59
|
+
@player.points.should == 500
|
60
|
+
end
|
61
|
+
|
62
|
+
it "can be created from a csv string" do
|
63
|
+
player = Player.from_csv("slim, 30")
|
64
|
+
|
65
|
+
player.name.should == "Slim"
|
66
|
+
player.health.should == 30
|
67
|
+
end
|
68
|
+
|
69
|
+
it "yields each found treasure and its total points" do
|
70
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
71
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
72
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
73
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
74
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
75
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
76
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
77
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
78
|
+
|
79
|
+
yielded = []
|
80
|
+
@player.each_found_treasure do |treasure|
|
81
|
+
yielded << treasure
|
82
|
+
end
|
83
|
+
|
84
|
+
yielded.should == [
|
85
|
+
Treasure.new(:skillet, 200),
|
86
|
+
Treasure.new(:hammer, 50),
|
87
|
+
Treasure.new(:bottle, 25)
|
88
|
+
]
|
89
|
+
end
|
90
|
+
|
91
|
+
context "player with an initial health of 150" do
|
92
|
+
before do
|
93
|
+
@player = Player.new("jim", 150)
|
94
|
+
end
|
95
|
+
|
96
|
+
it "is a strong player" do
|
97
|
+
@player.should be_strong
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
context "with a health of 100 or less" do
|
102
|
+
before do
|
103
|
+
@player = Player.new("tim", 100)
|
104
|
+
end
|
105
|
+
|
106
|
+
it "is a weak player" do
|
107
|
+
@player.should_not be_strong
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'studio_game/treasure_trove'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
describe Treasure do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@treasure = Treasure.new(:hammer, 50)
|
8
|
+
end
|
9
|
+
|
10
|
+
it "has a name attribute" do
|
11
|
+
@treasure.name.should == :hammer
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a points attribute" do
|
15
|
+
@treasure.points.should == 50
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe TreasureTrove do
|
21
|
+
|
22
|
+
it "has six treasures" do
|
23
|
+
TreasureTrove::TREASURES.size.should == 6
|
24
|
+
end
|
25
|
+
|
26
|
+
it "has a pie worth 5 points" do
|
27
|
+
TreasureTrove::TREASURES[0].should == Treasure.new(:pie, 5)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "has a bottle worth 25 points" do
|
31
|
+
TreasureTrove::TREASURES[1].should == Treasure.new(:bottle, 25)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "has a hammer worth 50 points" do
|
35
|
+
TreasureTrove::TREASURES[2].should == Treasure.new(:hammer, 50)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "has a skillet worth 100 points" do
|
39
|
+
TreasureTrove::TREASURES[3].should == Treasure.new(:skillet, 100)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "has a broomstick worth 200 points" do
|
43
|
+
TreasureTrove::TREASURES[4].should == Treasure.new(:broomstick, 200)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "has a crowbar worth 400 points" do
|
47
|
+
TreasureTrove::TREASURES[5].should == Treasure.new(:crowbar, 400)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns a random treasure" do
|
51
|
+
treasure = TreasureTrove.random
|
52
|
+
|
53
|
+
TreasureTrove::TREASURES.should include(treasure)
|
54
|
+
end
|
55
|
+
|
56
|
+
end
|
57
|
+
end
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mikesstudiogame
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Mike Penhall
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-01-30 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: ! 'A game that generates random scores for players.
|
31
|
+
|
32
|
+
|
33
|
+
Type ''StudioGame'' in command line to run.'
|
34
|
+
email: mikepenhall@gmail.com
|
35
|
+
executables:
|
36
|
+
- studio_game
|
37
|
+
extensions: []
|
38
|
+
extra_rdoc_files: []
|
39
|
+
files:
|
40
|
+
- bin/high_scores.txt
|
41
|
+
- bin/iterators.rb
|
42
|
+
- bin/my_favourite_players.csv
|
43
|
+
- bin/players.csv
|
44
|
+
- bin/studio_game
|
45
|
+
- lib/studio_game/auditable.rb
|
46
|
+
- lib/studio_game/berserk_player.rb
|
47
|
+
- lib/studio_game/clumsy_player.rb
|
48
|
+
- lib/studio_game/die.rb
|
49
|
+
- lib/studio_game/game.rb
|
50
|
+
- lib/studio_game/game_turn.rb
|
51
|
+
- lib/studio_game/loaded_die.rb
|
52
|
+
- lib/studio_game/playable.rb
|
53
|
+
- lib/studio_game/player.rb
|
54
|
+
- lib/studio_game/treasure_trove.rb
|
55
|
+
- spec/studio_game/berserk_player_spec.rb
|
56
|
+
- spec/studio_game/clumsy_player_spec.rb
|
57
|
+
- spec/studio_game/game_spec.rb
|
58
|
+
- spec/studio_game/player_spec.rb
|
59
|
+
- spec/studio_game/treasure_trove_spec.rb
|
60
|
+
- LICENSE
|
61
|
+
- README
|
62
|
+
homepage: http://www.mikepenhall.com
|
63
|
+
licenses: []
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '1.9'
|
74
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
75
|
+
none: false
|
76
|
+
requirements:
|
77
|
+
- - ! '>='
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
requirements: []
|
81
|
+
rubyforge_project:
|
82
|
+
rubygems_version: 1.8.24
|
83
|
+
signing_key:
|
84
|
+
specification_version: 3
|
85
|
+
summary: A game built as a demo using a Pragmatic Studio tutorial
|
86
|
+
test_files:
|
87
|
+
- spec/studio_game/berserk_player_spec.rb
|
88
|
+
- spec/studio_game/clumsy_player_spec.rb
|
89
|
+
- spec/studio_game/game_spec.rb
|
90
|
+
- spec/studio_game/player_spec.rb
|
91
|
+
- spec/studio_game/treasure_trove_spec.rb
|