studio_game_davidb583 5.8.3
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/LICENSE +1 -0
- data/README +7 -0
- data/bin/players.csv +3 -0
- data/bin/studio_game +70 -0
- data/lib/studio_game_module/auditable.rb +7 -0
- data/lib/studio_game_module/berserk_player.rb +31 -0
- data/lib/studio_game_module/clumsy_player.rb +30 -0
- data/lib/studio_game_module/die.rb +22 -0
- data/lib/studio_game_module/game.rb +118 -0
- data/lib/studio_game_module/game_turn.rb +29 -0
- data/lib/studio_game_module/loaded_die.rb +16 -0
- data/lib/studio_game_module/playable.rb +17 -0
- data/lib/studio_game_module/player.rb +55 -0
- data/lib/studio_game_module/treasure_trove.rb +21 -0
- data/spec/studio_game_module/berserk_player_spec.rb +37 -0
- data/spec/studio_game_module/clumsy_player_spec.rb +33 -0
- data/spec/studio_game_module/game_spec.rb +49 -0
- data/spec/studio_game_module/player_spec.rb +116 -0
- data/spec/studio_game_module/treasure_trove_spec.rb +59 -0
- metadata +89 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0efa16ba938b99399acbd177fbdff113e91e9dc2
|
4
|
+
data.tar.gz: 1bb7967c8e3ba3b473e63625b6d70e0e5d5817a0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a6e4c25ec19a5239cd2d03d100a54c890375486d58e6edb22408df238475d0a104184caf16a41743ac6e9f154152b30674638f5f3472704615175a39bae4d3f7
|
7
|
+
data.tar.gz: 7a1d5cb21576d514d5807631b13c6662d1fd02b55e6f6ee7821afbc9db330490266be98164baa95f584b3bdecee3a1164ab86bb8de5d98f1f9e865044a83d909
|
data/LICENSE
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Copyright (c) David B.
|
data/README
ADDED
data/bin/players.csv
ADDED
data/bin/studio_game
ADDED
@@ -0,0 +1,70 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/studio_game_module/game'
|
4
|
+
require_relative '../lib/studio_game_module/clumsy_player'
|
5
|
+
require_relative '../lib/studio_game_module/berserk_player'
|
6
|
+
|
7
|
+
|
8
|
+
knuckleheads = StudioGameModule::Game.new("Knuckleheads")
|
9
|
+
|
10
|
+
puts knuckleheads.title
|
11
|
+
|
12
|
+
knuckleheads.load_players ARGV.shift || "players.csv"
|
13
|
+
|
14
|
+
clumsy = StudioGameModule::ClumsyPlayer.new("klutz", 105)
|
15
|
+
knuckleheads.add_player(clumsy)
|
16
|
+
|
17
|
+
berserker = StudioGameModule::BerserkPlayer.new("berserker", 50)
|
18
|
+
knuckleheads.add_player(berserker)
|
19
|
+
|
20
|
+
loop do
|
21
|
+
puts "How many game rounds? ('quit' to exit)"
|
22
|
+
rounds = gets.chomp.downcase
|
23
|
+
|
24
|
+
case rounds.to_s
|
25
|
+
when rounds.to_i.to_s # check that inputs is numeric
|
26
|
+
knuckleheads.play(rounds.to_i)
|
27
|
+
when 'quit', 'exit'
|
28
|
+
knuckleheads.print_stats
|
29
|
+
break
|
30
|
+
else
|
31
|
+
puts "Please enter a number or 'quit'"
|
32
|
+
end
|
33
|
+
|
34
|
+
end
|
35
|
+
knuckleheads.save_high_scores
|
36
|
+
|
37
|
+
# player1 = Player.new("moe")
|
38
|
+
# player2 = Player.new("larry", 60)
|
39
|
+
# player3 = Player.new("curly", 125)
|
40
|
+
# player4 = Player.new("shemp", 90)
|
41
|
+
|
42
|
+
# players = [player1, player2, player3]
|
43
|
+
|
44
|
+
# players.pop
|
45
|
+
# players << player4
|
46
|
+
|
47
|
+
# puts "There are #{players.length} players in the game"
|
48
|
+
|
49
|
+
# players.each do |p|
|
50
|
+
# p.blam
|
51
|
+
# p.w00t
|
52
|
+
# p.blam
|
53
|
+
# puts p
|
54
|
+
# end
|
55
|
+
|
56
|
+
# puts player3
|
57
|
+
# player3.blam
|
58
|
+
# puts player3
|
59
|
+
# player3.w00t
|
60
|
+
# puts player3
|
61
|
+
|
62
|
+
# player2.w00t
|
63
|
+
# player1.w00t
|
64
|
+
|
65
|
+
# puts player1
|
66
|
+
# puts player2
|
67
|
+
# puts player3
|
68
|
+
|
69
|
+
|
70
|
+
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative "player"
|
2
|
+
|
3
|
+
module StudioGameModule
|
4
|
+
class BerserkPlayer < Player
|
5
|
+
def initialize(name, health=100)
|
6
|
+
super(name, health)
|
7
|
+
@w00t_count = 0
|
8
|
+
end
|
9
|
+
|
10
|
+
def berserk?
|
11
|
+
@w00t_count > 5
|
12
|
+
end
|
13
|
+
|
14
|
+
def w00t
|
15
|
+
super
|
16
|
+
@w00t_count += 1
|
17
|
+
puts "#{@name} is berserk!" if berserk?
|
18
|
+
end
|
19
|
+
|
20
|
+
def blam
|
21
|
+
berserk? ? w00t : super
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if __FILE__ == $0
|
26
|
+
berserker = BerserkPlayer.new("berserker", 50)
|
27
|
+
6.times { berserker.w00t }
|
28
|
+
2.times { berserker.blam }
|
29
|
+
puts berserker.health
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require_relative "player"
|
2
|
+
|
3
|
+
module StudioGameModule
|
4
|
+
class ClumsyPlayer < Player
|
5
|
+
def found_treasure(treasure)
|
6
|
+
# pts = treasure.points / 2.0
|
7
|
+
# @found_treasures[treasure.name] += pts
|
8
|
+
# puts "#{@name} found a #{treasure.name} worth #{pts} points."
|
9
|
+
damaged_treasure = Treasure.new(treasure.name, treasure.points / 2.0)
|
10
|
+
super(damaged_treasure)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
if __FILE__ == $0
|
15
|
+
clumsy = ClumsyPlayer.new("klutz")
|
16
|
+
|
17
|
+
hammer = Treasure.new(:hammer, 50)
|
18
|
+
clumsy.found_treasure(hammer)
|
19
|
+
clumsy.found_treasure(hammer)
|
20
|
+
clumsy.found_treasure(hammer)
|
21
|
+
|
22
|
+
crowbar = Treasure.new(:crowbar, 400)
|
23
|
+
clumsy.found_treasure(crowbar)
|
24
|
+
|
25
|
+
clumsy.each_found_treasure do |treasure|
|
26
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
27
|
+
end
|
28
|
+
puts "#{clumsy.points} grand total points"
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative 'auditable'
|
2
|
+
|
3
|
+
module StudioGameModule
|
4
|
+
class Die
|
5
|
+
include Auditable
|
6
|
+
|
7
|
+
attr_reader :number
|
8
|
+
def initialize
|
9
|
+
roll
|
10
|
+
end
|
11
|
+
def roll
|
12
|
+
@number = rand 1..6
|
13
|
+
audit
|
14
|
+
@number
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
if __FILE__ == $0
|
19
|
+
die = Die.new
|
20
|
+
puts die.number
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require_relative "player"
|
2
|
+
require_relative "die"
|
3
|
+
require_relative 'game_turn'
|
4
|
+
require_relative 'treasure_trove'
|
5
|
+
|
6
|
+
module StudioGameModule
|
7
|
+
class Game
|
8
|
+
attr_reader :title
|
9
|
+
def initialize(title)
|
10
|
+
@title = title
|
11
|
+
@players = []
|
12
|
+
end
|
13
|
+
|
14
|
+
def add_player(player)
|
15
|
+
@players << player
|
16
|
+
end
|
17
|
+
def load_players(filename="players.csv")
|
18
|
+
File.readlines(filename).each do |line|
|
19
|
+
add_player(Player.from_csv(line))
|
20
|
+
end
|
21
|
+
end
|
22
|
+
def save_high_scores(filename="high_scores.txt")
|
23
|
+
File.open(filename, "w") do |file|
|
24
|
+
file.puts("Knuckleheads High Scores:")
|
25
|
+
@players.sort.each do |p|
|
26
|
+
file.puts formatted_player(p)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
def play(rounds)
|
31
|
+
puts "There are #{@players.size} players in #{@title}: "
|
32
|
+
|
33
|
+
display_players
|
34
|
+
|
35
|
+
display_treasures(TreasureTrove::TREASURES)
|
36
|
+
|
37
|
+
1.upto(rounds) do |r|
|
38
|
+
puts "\nRound #{r}:"
|
39
|
+
@players.each do |p|
|
40
|
+
GameTurn.take_turn(p)
|
41
|
+
puts p
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def print_stats
|
47
|
+
strongs = @players.select {|n| n.strong?}
|
48
|
+
wimpies = @players.reject {|n| n.strong?}
|
49
|
+
#puts strongs.size
|
50
|
+
|
51
|
+
puts ""
|
52
|
+
puts "Knuckleheads Statistics:"
|
53
|
+
display_player_stats("strong", strongs)
|
54
|
+
display_player_stats("wimpy", wimpies)
|
55
|
+
|
56
|
+
puts ""
|
57
|
+
puts "Knuckleheads High Scores:"
|
58
|
+
display_players_score
|
59
|
+
|
60
|
+
# puts ""
|
61
|
+
# display_total_points
|
62
|
+
|
63
|
+
puts ""
|
64
|
+
display_total_points_per_player
|
65
|
+
end
|
66
|
+
|
67
|
+
private
|
68
|
+
def formatted_player(player)
|
69
|
+
"#{player.name.ljust(30, '.')} (#{player.score})"
|
70
|
+
end
|
71
|
+
def display_total_points_per_player
|
72
|
+
@players.each do |p|
|
73
|
+
puts ""
|
74
|
+
puts "#{p.name} point totals:"
|
75
|
+
p.each_found_treasure do |treasure|
|
76
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
77
|
+
end
|
78
|
+
puts "#{p.points} grand total points"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
def display_total_points
|
82
|
+
@players.each do |p|
|
83
|
+
puts "#{p.name} point totals:"
|
84
|
+
puts "#{p.points} grand total points"
|
85
|
+
puts ""
|
86
|
+
end
|
87
|
+
end
|
88
|
+
def display_players
|
89
|
+
@players.each do |p|
|
90
|
+
puts p
|
91
|
+
end
|
92
|
+
end
|
93
|
+
def display_treasures(treasures)
|
94
|
+
puts ""
|
95
|
+
puts "number of treasures : #{treasures.size}"
|
96
|
+
treasures.each do |t|
|
97
|
+
puts "A #{t.name} is worth #{t.points} points"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
def display_player_stats(kind, players_array)
|
101
|
+
puts ""
|
102
|
+
puts "#{players_array.size} #{kind} players"
|
103
|
+
players_array.each do |p|
|
104
|
+
puts "#{p.name} (#{p.health})"
|
105
|
+
end
|
106
|
+
end
|
107
|
+
def display_players_score
|
108
|
+
# sorted_players = @players.sort { |a,b| b.score <=> a.score }
|
109
|
+
# sorted_players.each do |p|
|
110
|
+
# puts "#{p.name.ljust(30, '.')} (#{p.score})"
|
111
|
+
# end
|
112
|
+
@players.sort.each do |p|
|
113
|
+
puts formatted_player(p)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative "die"
|
2
|
+
require_relative "player"
|
3
|
+
require_relative "treasure_trove"
|
4
|
+
require_relative "loaded_die"
|
5
|
+
|
6
|
+
module StudioGameModule
|
7
|
+
module GameTurn
|
8
|
+
def self.take_turn(player)
|
9
|
+
|
10
|
+
die = Die.new
|
11
|
+
number_rolled = die.roll
|
12
|
+
case number_rolled
|
13
|
+
when 5..6
|
14
|
+
player.w00t
|
15
|
+
when 1..2
|
16
|
+
player.blam
|
17
|
+
else
|
18
|
+
puts "#{player.name} was skipped"
|
19
|
+
end
|
20
|
+
|
21
|
+
t = TreasureTrove.random
|
22
|
+
|
23
|
+
#puts "#{player.name} found a #{t.name} worth #{t.points}."
|
24
|
+
|
25
|
+
player.found_treasure(t)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require_relative 'treasure_trove'
|
2
|
+
require_relative 'playable'
|
3
|
+
|
4
|
+
module StudioGameModule
|
5
|
+
class Player
|
6
|
+
include Playable
|
7
|
+
|
8
|
+
attr_reader :health, :name
|
9
|
+
|
10
|
+
def initialize(name, health=100)
|
11
|
+
@name = name.capitalize
|
12
|
+
@health = health.to_i
|
13
|
+
@found_treasures = Hash.new(0)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.from_csv(val)
|
17
|
+
name, health = val.split(",")
|
18
|
+
Player.new(name, Integer(health))
|
19
|
+
end
|
20
|
+
|
21
|
+
def each_found_treasure
|
22
|
+
@found_treasures.each do |name, points|
|
23
|
+
yield Treasure.new(name, points)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
"I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}."
|
29
|
+
end
|
30
|
+
def score
|
31
|
+
@health + points
|
32
|
+
end
|
33
|
+
def found_treasure(treasure)
|
34
|
+
@found_treasures[treasure.name] += treasure.points
|
35
|
+
puts "I'm #{@name}, I found #{treasure.name} worth #{treasure.points}"
|
36
|
+
puts "#{@name}'s treasures #{@found_treasures}"
|
37
|
+
end
|
38
|
+
def points
|
39
|
+
@found_treasures.values.reduce(0, :+)
|
40
|
+
end
|
41
|
+
def <=>(other)
|
42
|
+
other.score <=> score
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
if __FILE__ == $0
|
47
|
+
player = Player.new("moe")
|
48
|
+
puts player.name
|
49
|
+
puts player.health
|
50
|
+
player.w00t
|
51
|
+
puts player.health
|
52
|
+
player.blam
|
53
|
+
puts player.health
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module StudioGameModule
|
2
|
+
Treasure = Struct.new(:name, :points)
|
3
|
+
|
4
|
+
module TreasureTrove
|
5
|
+
TREASURES = [
|
6
|
+
Treasure.new(:pie, 5),
|
7
|
+
Treasure.new(:bottle, 25),
|
8
|
+
Treasure.new(:hammer, 50),
|
9
|
+
Treasure.new(:skillet, 100),
|
10
|
+
Treasure.new(:broomstick, 200),
|
11
|
+
Treasure.new(:crowbar, 400),
|
12
|
+
]
|
13
|
+
|
14
|
+
def self.random
|
15
|
+
TREASURES[rand 0..TREASURES.size-1] # pb here with size?
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'studio_game_module/berserk_player'
|
2
|
+
|
3
|
+
module StudioGameModule
|
4
|
+
describe BerserkPlayer do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@initial_health = 50
|
8
|
+
@player = BerserkPlayer.new("berserker", @initial_health)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "does not go berserk when w00ted up to 5 times" do
|
12
|
+
1.upto(5) { @player.w00t }
|
13
|
+
|
14
|
+
#@player.berserk?.should be_false
|
15
|
+
|
16
|
+
#or if using Rspec 3.0:
|
17
|
+
@player.berserk?.should be_falsey
|
18
|
+
end
|
19
|
+
|
20
|
+
it "goes berserk when w00ted more than 5 times" do
|
21
|
+
1.upto(6) { @player.w00t }
|
22
|
+
|
23
|
+
# @player.berserk?.should be_true
|
24
|
+
|
25
|
+
#or if using Rspec 3.0:
|
26
|
+
@player.berserk?.should be_truthy
|
27
|
+
end
|
28
|
+
|
29
|
+
it "gets w00ted instead of blammed when it's gone berserk" do
|
30
|
+
1.upto(6) { @player.w00t }
|
31
|
+
1.upto(2) { @player.blam }
|
32
|
+
|
33
|
+
@player.health.should == @initial_health + (8 * 15)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'studio_game_module/clumsy_player'
|
2
|
+
|
3
|
+
module StudioGameModule
|
4
|
+
describe ClumsyPlayer do
|
5
|
+
before do
|
6
|
+
@player = ClumsyPlayer.new("klutz")
|
7
|
+
end
|
8
|
+
|
9
|
+
it "only gets half the point value for each treasure" do
|
10
|
+
@player.points.should == 0
|
11
|
+
|
12
|
+
hammer = Treasure.new(:hammer, 50)
|
13
|
+
@player.found_treasure(hammer)
|
14
|
+
@player.found_treasure(hammer)
|
15
|
+
@player.found_treasure(hammer)
|
16
|
+
|
17
|
+
@player.points.should == 75
|
18
|
+
|
19
|
+
crowbar = Treasure.new(:crowbar, 400)
|
20
|
+
@player.found_treasure(crowbar)
|
21
|
+
|
22
|
+
@player.points.should == 275
|
23
|
+
|
24
|
+
yielded = []
|
25
|
+
@player.each_found_treasure do |treasure|
|
26
|
+
yielded << treasure
|
27
|
+
end
|
28
|
+
|
29
|
+
yielded.should == [Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)]
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'studio_game_module/game'
|
2
|
+
|
3
|
+
module StudioGameModule
|
4
|
+
describe Game do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@game = Game.new("Knuckleheads")
|
8
|
+
|
9
|
+
@initial_health = 100
|
10
|
+
@player = Player.new("moe", @initial_health)
|
11
|
+
|
12
|
+
@game.add_player(@player)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be healthier if roll dice > = 5" do
|
16
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(5)
|
17
|
+
@player.health.should == 100
|
18
|
+
@game.play(2)
|
19
|
+
@player.health.should == 130
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should be same health if roll dice > = 3" do
|
23
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(3)
|
24
|
+
@player.health.should == 100
|
25
|
+
@game.play(2)
|
26
|
+
@player.health.should == 100
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should be healthier if roll dice < = 2" do
|
30
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(2)
|
31
|
+
@player.health.should == 100
|
32
|
+
@game.play(2)
|
33
|
+
@player.health.should == 80
|
34
|
+
end
|
35
|
+
it "assigns a treasure for points during a player's turn" do
|
36
|
+
game = Game.new("Knuckleheads")
|
37
|
+
player = Player.new("moe")
|
38
|
+
|
39
|
+
game.add_player(player)
|
40
|
+
|
41
|
+
game.play(1)
|
42
|
+
|
43
|
+
player.points.should_not be_zero
|
44
|
+
|
45
|
+
# or use alternate expectation syntax:
|
46
|
+
# expect(player.points).not_to be_zero
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,116 @@
|
|
1
|
+
require 'studio_game_module/player'
|
2
|
+
require 'studio_game_module/treasure_trove'
|
3
|
+
|
4
|
+
module StudioGameModule
|
5
|
+
describe Player do
|
6
|
+
|
7
|
+
|
8
|
+
before do
|
9
|
+
@initial_health = 150
|
10
|
+
@player = Player.new("larry", @initial_health)
|
11
|
+
end
|
12
|
+
it "has a capitalized name" do
|
13
|
+
@player.name.should == "Larry"
|
14
|
+
end
|
15
|
+
it "has an initial health" do
|
16
|
+
@player.health.should == 150
|
17
|
+
end
|
18
|
+
it "has a string representation" do
|
19
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
20
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
21
|
+
|
22
|
+
@player.to_s.should == "I'm Larry with health = 150, points = 100, and score = 250."
|
23
|
+
end
|
24
|
+
it "computes a score as the sum of its health and points" do
|
25
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
26
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
27
|
+
|
28
|
+
@player.score.should == 250
|
29
|
+
end
|
30
|
+
|
31
|
+
it "increases health by 15 when w00ted" do
|
32
|
+
@player.w00t
|
33
|
+
@player.health.should == 165
|
34
|
+
end
|
35
|
+
|
36
|
+
it "decreases health by 10 when blammed" do
|
37
|
+
@player.blam
|
38
|
+
@player.health.should == 140
|
39
|
+
end
|
40
|
+
|
41
|
+
context "in a collection of players" do
|
42
|
+
before do
|
43
|
+
@player1 = Player.new("moe", 100)
|
44
|
+
@player2 = Player.new("larry", 200)
|
45
|
+
@player3 = Player.new("curly", 300)
|
46
|
+
|
47
|
+
@players = [@player1, @player2, @player3]
|
48
|
+
end
|
49
|
+
|
50
|
+
it "is sorted by decreasing score" do
|
51
|
+
@players.sort.should == [@player3, @player2, @player1]
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context "with a health greater than 100" do
|
56
|
+
before do
|
57
|
+
@player = Player.new("hulk", 150)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should be a strong player" do
|
61
|
+
@player.should be_strong
|
62
|
+
end
|
63
|
+
end
|
64
|
+
context "with a health lower than 100" do
|
65
|
+
before do
|
66
|
+
@player = Player.new("bony", 33)
|
67
|
+
end
|
68
|
+
|
69
|
+
it "should not be a strong player" do
|
70
|
+
@player.should_not be_strong
|
71
|
+
end
|
72
|
+
end
|
73
|
+
it "computes points as the sum of all treasure points" do
|
74
|
+
@player.points.should == 0
|
75
|
+
|
76
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
77
|
+
|
78
|
+
@player.points.should == 50
|
79
|
+
|
80
|
+
@player.found_treasure(Treasure.new(:crowbar, 400))
|
81
|
+
|
82
|
+
@player.points.should == 450
|
83
|
+
|
84
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
85
|
+
|
86
|
+
@player.points.should == 500
|
87
|
+
end
|
88
|
+
it "yields each found treasure and its total points" do
|
89
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
90
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
91
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
92
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
93
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
94
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
95
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
96
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
97
|
+
|
98
|
+
yielded = []
|
99
|
+
@player.each_found_treasure do |treasure|
|
100
|
+
yielded << treasure
|
101
|
+
end
|
102
|
+
|
103
|
+
yielded.should == [
|
104
|
+
Treasure.new(:skillet, 200),
|
105
|
+
Treasure.new(:hammer, 50),
|
106
|
+
Treasure.new(:bottle, 25)
|
107
|
+
]
|
108
|
+
end
|
109
|
+
it "can be created from a CSV string" do
|
110
|
+
player = Player.from_csv("larry,150")
|
111
|
+
|
112
|
+
player.name.should == "Larry"
|
113
|
+
player.health.should == 150
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'studio_game_module/treasure_trove'
|
2
|
+
|
3
|
+
module StudioGameModule
|
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
|
+
|
55
|
+
# or use alternate expectation syntax:
|
56
|
+
# expect(TreasureTrove::TREASURES).to include(treasure)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
metadata
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: studio_game_davidb583
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 5.8.3
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- david b
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-08-18 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: |
|
28
|
+
# my first gem
|
29
|
+
|
30
|
+
This is one hell of a program : my first ruby gem
|
31
|
+
|
32
|
+
## Installation
|
33
|
+
|
34
|
+
Don't know yet
|
35
|
+
email: fishing_junk@yahoo.fr
|
36
|
+
executables:
|
37
|
+
- studio_game
|
38
|
+
extensions: []
|
39
|
+
extra_rdoc_files: []
|
40
|
+
files:
|
41
|
+
- LICENSE
|
42
|
+
- README
|
43
|
+
- bin/players.csv
|
44
|
+
- bin/studio_game
|
45
|
+
- lib/studio_game_module/auditable.rb
|
46
|
+
- lib/studio_game_module/berserk_player.rb
|
47
|
+
- lib/studio_game_module/clumsy_player.rb
|
48
|
+
- lib/studio_game_module/die.rb
|
49
|
+
- lib/studio_game_module/game.rb
|
50
|
+
- lib/studio_game_module/game_turn.rb
|
51
|
+
- lib/studio_game_module/loaded_die.rb
|
52
|
+
- lib/studio_game_module/playable.rb
|
53
|
+
- lib/studio_game_module/player.rb
|
54
|
+
- lib/studio_game_module/treasure_trove.rb
|
55
|
+
- spec/studio_game_module/berserk_player_spec.rb
|
56
|
+
- spec/studio_game_module/clumsy_player_spec.rb
|
57
|
+
- spec/studio_game_module/game_spec.rb
|
58
|
+
- spec/studio_game_module/player_spec.rb
|
59
|
+
- spec/studio_game_module/treasure_trove_spec.rb
|
60
|
+
homepage: http://sfeir.com
|
61
|
+
licenses:
|
62
|
+
- MIT
|
63
|
+
metadata: {}
|
64
|
+
post_install_message:
|
65
|
+
rdoc_options: []
|
66
|
+
require_paths:
|
67
|
+
- lib
|
68
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
69
|
+
requirements:
|
70
|
+
- - ">="
|
71
|
+
- !ruby/object:Gem::Version
|
72
|
+
version: '1.9'
|
73
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
requirements: []
|
79
|
+
rubyforge_project:
|
80
|
+
rubygems_version: 2.2.2
|
81
|
+
signing_key:
|
82
|
+
specification_version: 4
|
83
|
+
summary: first attempt of gem file
|
84
|
+
test_files:
|
85
|
+
- spec/studio_game_module/berserk_player_spec.rb
|
86
|
+
- spec/studio_game_module/clumsy_player_spec.rb
|
87
|
+
- spec/studio_game_module/game_spec.rb
|
88
|
+
- spec/studio_game_module/player_spec.rb
|
89
|
+
- spec/studio_game_module/treasure_trove_spec.rb
|