studio_game_edward 1.0
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.md +1 -0
- data/README.md +2 -0
- data/bin/favorite_players.csv +3 -0
- data/bin/studio_game +36 -0
- data/lib/studio_game/auditable.rb +7 -0
- data/lib/studio_game/berserk_player.rb +40 -0
- data/lib/studio_game/clumsy_player.rb +29 -0
- data/lib/studio_game/die.rb +21 -0
- data/lib/studio_game/game.rb +104 -0
- data/lib/studio_game/game_turn.rb +29 -0
- data/lib/studio_game/loaded_die.rb +18 -0
- data/lib/studio_game/playable.rb +17 -0
- data/lib/studio_game/player.rb +69 -0
- data/lib/studio_game/players.csv +3 -0
- data/lib/studio_game/treasure_trove.rb +20 -0
- data/spec/studio_game/game_spec.rb +63 -0
- data/spec/studio_game/player_spec.rb +130 -0
- data/spec/studio_game/treasure_trove_spec.rb +59 -0
- metadata +81 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 81ae3595e03f25434bb04b948882b544289b55de
|
|
4
|
+
data.tar.gz: 94f409dc02217a8e09d1099bb058a73309b5f202
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 0fc2bd9b547263edf2121dd03a3f265733986e16befb56c986672b83c33d85fa94eb8edb8eb5db72c1eaa0d9493322bb8fb835132047873745a90b164f69dec9
|
|
7
|
+
data.tar.gz: b3cbe7796b5fde25103b7030672091613e636ba45e0f8274509827c8df8f04c74c11c2fb1bac08e387d36c279d217620436ee92dc997de4d493448fb3667ddf2
|
data/LICENSE.md
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#Program License
|
data/README.md
ADDED
data/bin/studio_game
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require_relative '../lib/studio_game/game'
|
|
4
|
+
require_relative '../lib/studio_game/clumsy_player'
|
|
5
|
+
require_relative '../lib/studio_game/berserk_player'
|
|
6
|
+
|
|
7
|
+
player1 = StudioGame::Player.new("bob")
|
|
8
|
+
player2 = StudioGame::Player.new("larry", 60)
|
|
9
|
+
player3 = StudioGame::Player.new("curly", 125)
|
|
10
|
+
player4 = StudioGame::ClumsyPlayer.new("klutz", 105)
|
|
11
|
+
player5 = StudioGame::BerserkPlayer.new("berzerker", 50)
|
|
12
|
+
|
|
13
|
+
knuckleheads = StudioGame::Game.new("Knuckleheads")
|
|
14
|
+
default_path = File.join(File.dirname(__FILE__), "favorite_players.csv")
|
|
15
|
+
knuckleheads.load_players(ARGV.shift || default_path)
|
|
16
|
+
knuckleheads.add_player(player4)
|
|
17
|
+
knuckleheads.add_player(player5)
|
|
18
|
+
|
|
19
|
+
loop do
|
|
20
|
+
puts "\nHow many rounds would you like to play?"
|
|
21
|
+
answer = gets.chomp.downcase
|
|
22
|
+
|
|
23
|
+
case answer
|
|
24
|
+
when /^\d+$/
|
|
25
|
+
knuckleheads.play(answer.to_i)
|
|
26
|
+
when "exit", "quit"
|
|
27
|
+
knuckleheads.print_stats
|
|
28
|
+
knuckleheads.save_scores
|
|
29
|
+
break
|
|
30
|
+
else
|
|
31
|
+
puts "Please enter a number or quit"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require_relative 'player'
|
|
2
|
+
|
|
3
|
+
module StudioGame
|
|
4
|
+
|
|
5
|
+
class BerserkPlayer < Player
|
|
6
|
+
|
|
7
|
+
def initialize(name, health=100)
|
|
8
|
+
super(name, health)
|
|
9
|
+
@woot_count = 0
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def berserk?
|
|
13
|
+
@woot_count > 5
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def w00t
|
|
17
|
+
super
|
|
18
|
+
@woot_count += 1
|
|
19
|
+
puts "#{@name} is berserk!" if berserk?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def blam
|
|
23
|
+
if berserk?
|
|
24
|
+
w00t
|
|
25
|
+
else
|
|
26
|
+
super
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
if __FILE__ == $0
|
|
36
|
+
berserker = StudioGame::BerserkPlayer.new("berserker", 50)
|
|
37
|
+
6.times { berserker.w00t }
|
|
38
|
+
2.times { berserker.blam }
|
|
39
|
+
puts berserker.health
|
|
40
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require_relative 'player'
|
|
2
|
+
require_relative 'treasure_trove'
|
|
3
|
+
|
|
4
|
+
module StudioGame
|
|
5
|
+
|
|
6
|
+
class ClumsyPlayer < Player
|
|
7
|
+
|
|
8
|
+
def found_treasure(treasure)
|
|
9
|
+
super(StudioGame::Treasure.new(treasure.name, treasure.points/2.0))
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
if __FILE__ == $0
|
|
15
|
+
clumsy = StudioGame::ClumsyPlayer.new("klutz")
|
|
16
|
+
|
|
17
|
+
hammer = StudioGame::Treasure.new(:hammer, 50)
|
|
18
|
+
clumsy.found_treasure(hammer)
|
|
19
|
+
clumsy.found_treasure(hammer)
|
|
20
|
+
clumsy.found_treasure(hammer)
|
|
21
|
+
|
|
22
|
+
crowbar = StudioGame::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
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
require_relative 'player'
|
|
2
|
+
require_relative 'die'
|
|
3
|
+
require_relative 'game_turn'
|
|
4
|
+
require_relative 'treasure_trove'
|
|
5
|
+
|
|
6
|
+
module StudioGame
|
|
7
|
+
|
|
8
|
+
class Game
|
|
9
|
+
|
|
10
|
+
attr_reader :title
|
|
11
|
+
|
|
12
|
+
def initialize(title)
|
|
13
|
+
@title = title
|
|
14
|
+
@players = []
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def add_player(player)
|
|
18
|
+
#@players.push(player)
|
|
19
|
+
@players << player
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def total_points
|
|
23
|
+
@players.reduce(0) {|sum, player| sum + player.points}
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def load_players(file)
|
|
28
|
+
File.readlines(file).each do |line|
|
|
29
|
+
add_player(Player.from_csv(line))
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def save_scores(file="high_scores.txt")
|
|
34
|
+
File.open(file, 'w') do |file|
|
|
35
|
+
@players.each do |player|
|
|
36
|
+
file.puts create_high_score_entry(player)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def create_high_score_entry(player)
|
|
42
|
+
formatted_score = player.name.ljust(30, ".")
|
|
43
|
+
"#{formatted_score}#{player.score}"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def play(rounds)
|
|
47
|
+
|
|
48
|
+
treasures = TreasureTrove::TREASURES
|
|
49
|
+
puts "There are #{treasures.count} treasures to be found."
|
|
50
|
+
treasures.each do |treasure|
|
|
51
|
+
puts "A #{treasure.name} is worth #{treasure.points} points."
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
puts "\nThere are #{@players.size} players in #{@title}: "
|
|
55
|
+
|
|
56
|
+
@players.each do |player|
|
|
57
|
+
puts player
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
1.upto(rounds) do |turn|
|
|
61
|
+
|
|
62
|
+
puts "\nRound: #{turn}"
|
|
63
|
+
|
|
64
|
+
@players.each do |player|
|
|
65
|
+
GameTurn.take_turn(player)
|
|
66
|
+
puts player
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def print_name_and_health(player)
|
|
72
|
+
puts player.name.ljust(30, ".").concat(player.score.to_s)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
def print_stats
|
|
76
|
+
strong_players, wimpy_players = @players.partition {|player| player.strong?}
|
|
77
|
+
|
|
78
|
+
puts "\name#{total_points} total points from treasure found"
|
|
79
|
+
|
|
80
|
+
@players.sort.each do |player|
|
|
81
|
+
puts "\n#{player.name}'s point totals:"
|
|
82
|
+
player.each_found_treasure {|treasure| puts "#{treasure.points} total #{treasure.name} points"}
|
|
83
|
+
puts "#{player.points} grand total points"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
puts "\n#{strong_players.count} strong players:"
|
|
87
|
+
strong_players.each do |player|
|
|
88
|
+
puts "#{player.name} (#{player.health})"
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
puts "#{wimpy_players.count} wimpy players:"
|
|
92
|
+
wimpy_players.each do |player|
|
|
93
|
+
puts "#{player.name} (#{player.health})"
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
@players.sort.each do |player|
|
|
97
|
+
print_name_and_health(player)
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
end
|
|
104
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require_relative 'die'
|
|
2
|
+
require_relative 'player'
|
|
3
|
+
require_relative 'treasure_trove'
|
|
4
|
+
|
|
5
|
+
module GameTurn
|
|
6
|
+
|
|
7
|
+
def self.take_turn(player)
|
|
8
|
+
|
|
9
|
+
die = StudioGame::Die.new
|
|
10
|
+
|
|
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
|
+
|
|
20
|
+
treasure = StudioGame::TreasureTrove.random
|
|
21
|
+
|
|
22
|
+
player.found_treasure(treasure)
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
puts "#{player.name} found a #{treasure.name} worth #{treasure.points} points"
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
require_relative 'treasure_trove'
|
|
2
|
+
require_relative 'playable'
|
|
3
|
+
|
|
4
|
+
module StudioGame
|
|
5
|
+
class Player
|
|
6
|
+
|
|
7
|
+
include Playable
|
|
8
|
+
|
|
9
|
+
attr_accessor :name, :health
|
|
10
|
+
attr_reader :found_treasures
|
|
11
|
+
|
|
12
|
+
def initialize(name, health=100)
|
|
13
|
+
@name = name.capitalize
|
|
14
|
+
@health = health
|
|
15
|
+
@found_treasures = Hash.new(0)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def found_treasure(treasure)
|
|
19
|
+
@found_treasures[treasure.name] += treasure.points
|
|
20
|
+
puts "#{@name} found a #{treasure.name} worth #{treasure.points} points"
|
|
21
|
+
puts "#{@name}'s treasures: #{@found_treasures}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def each_found_treasure
|
|
25
|
+
@found_treasures.each do |treasure, points|
|
|
26
|
+
yield StudioGame::Treasure.new(treasure, points)
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.from_csv(line)
|
|
32
|
+
name, health = line.split(",")
|
|
33
|
+
StudioGame::Player.new(name, Integer(health))
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def points
|
|
37
|
+
@found_treasures.values.reduce(0, :+)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def name=(new_name)
|
|
41
|
+
@name = new_name.capitalize
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def to_s()
|
|
45
|
+
"I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}."
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def score()
|
|
49
|
+
@health + points
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def <=>(other_player)
|
|
53
|
+
other_player.score <=> score
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
if __FILE__ == $0
|
|
59
|
+
player = StudioGame::Player.new("moe")
|
|
60
|
+
puts player.name
|
|
61
|
+
puts player.health
|
|
62
|
+
player.w00t
|
|
63
|
+
puts player.health
|
|
64
|
+
player.blam
|
|
65
|
+
puts player.health
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
|
|
2
|
+
module StudioGame
|
|
3
|
+
|
|
4
|
+
Treasure = Struct.new(:name, :points)
|
|
5
|
+
|
|
6
|
+
module TreasureTrove
|
|
7
|
+
TREASURES = [
|
|
8
|
+
Treasure.new(:pie, 5),
|
|
9
|
+
Treasure.new(:bottle, 25),
|
|
10
|
+
Treasure.new(:hammer, 50),
|
|
11
|
+
Treasure.new(:skillet, 100),
|
|
12
|
+
Treasure.new(:broomstick, 200),
|
|
13
|
+
Treasure.new(:crowbar, 400)]
|
|
14
|
+
|
|
15
|
+
def self.random
|
|
16
|
+
TREASURES[rand(TREASURES.count)]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
require 'studio_game/game'
|
|
2
|
+
|
|
3
|
+
module StudioGame
|
|
4
|
+
|
|
5
|
+
describe Game do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@game = StudioGame::Game.new("Knuckleheads")
|
|
9
|
+
|
|
10
|
+
@initial_health = 100
|
|
11
|
+
@player = StudioGame::Player.new("moe", @initial_health)
|
|
12
|
+
|
|
13
|
+
@game.add_player(@player)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it 'player w00ts when high number is rolled' do
|
|
17
|
+
StudioGame::Die.any_instance.stub(:roll).and_return(5)
|
|
18
|
+
@game.play(2)
|
|
19
|
+
@player.health.should == @initial_health + (15 * 2)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it 'player skips when medium number is rolled' do
|
|
23
|
+
StudioGame::Die.any_instance.stub(:roll).and_return(3)
|
|
24
|
+
@game.play(2)
|
|
25
|
+
@player.health.should == @initial_health
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
it 'player blams when lower number is rolled' do
|
|
29
|
+
StudioGame::Die.any_instance.stub(:roll).and_return(1)
|
|
30
|
+
@game.play(2)
|
|
31
|
+
@player.health.should == @initial_health - (10 * 2)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
it "assigns a treasure for points during a player's turn" do
|
|
35
|
+
game = StudioGame::Game.new("Knuckleheads")
|
|
36
|
+
player = StudioGame::Player.new("moe")
|
|
37
|
+
|
|
38
|
+
game.add_player(player)
|
|
39
|
+
|
|
40
|
+
game.play(1)
|
|
41
|
+
|
|
42
|
+
player.points.should_not be_zero
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
it "computes total points as the sum of all player points" do
|
|
47
|
+
game = StudioGame::Game.new("Knuckleheads")
|
|
48
|
+
|
|
49
|
+
player1 = StudioGame::Player.new("moe")
|
|
50
|
+
player2 = StudioGame::Player.new("larry")
|
|
51
|
+
|
|
52
|
+
game.add_player(player1)
|
|
53
|
+
game.add_player(player2)
|
|
54
|
+
|
|
55
|
+
player1.found_treasure(StudioGame::Treasure.new(:hammer, 50))
|
|
56
|
+
player1.found_treasure(StudioGame::Treasure.new(:hammer, 50))
|
|
57
|
+
player2.found_treasure(StudioGame::Treasure.new(:crowbar, 400))
|
|
58
|
+
|
|
59
|
+
game.total_points.should == 500
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
require 'studio_game/player'
|
|
2
|
+
require 'studio_game/treasure_trove'
|
|
3
|
+
|
|
4
|
+
module StudioGame
|
|
5
|
+
describe Player do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@inital_health = 150
|
|
9
|
+
@player = StudioGame::Player.new("larry", @inital_health)
|
|
10
|
+
$stdout = StringIO.new
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it "has a capitalized name" do
|
|
15
|
+
@player.name.should == "Larry"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "yields each found treasure and its total points" do
|
|
19
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
|
20
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
|
21
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
22
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
|
23
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
|
24
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
|
25
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
|
26
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
|
27
|
+
|
|
28
|
+
yielded = []
|
|
29
|
+
@player.each_found_treasure do |treasure|
|
|
30
|
+
yielded << treasure
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
yielded.should == [
|
|
34
|
+
Treasure.new(:skillet, 200),
|
|
35
|
+
Treasure.new(:hammer, 50),
|
|
36
|
+
Treasure.new(:bottle, 25)
|
|
37
|
+
]
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
it "has an initial health" do
|
|
41
|
+
@player.health.should == 150
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "has a string representation" do
|
|
45
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
46
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
47
|
+
@player.to_s.should == "I'm Larry with health = 150, points = 100, and score = 250."
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "computes a score as the sum of its health and points" do
|
|
51
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
52
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
53
|
+
@player.score.should == 250
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
it "increases health by 15 when w00ted" do
|
|
57
|
+
@player.w00t
|
|
58
|
+
@player.health.should == @inital_health + 15
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
it "decreases health by 10 when blammed" do
|
|
62
|
+
@player.blam
|
|
63
|
+
@player.health.should == @inital_health - 10
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "computes points as the sum of all treasure points" do
|
|
67
|
+
@player.points.should == 0
|
|
68
|
+
|
|
69
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
70
|
+
|
|
71
|
+
@player.points.should == 50
|
|
72
|
+
|
|
73
|
+
@player.found_treasure(Treasure.new(:crowbar, 400))
|
|
74
|
+
|
|
75
|
+
@player.points.should == 450
|
|
76
|
+
|
|
77
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
78
|
+
|
|
79
|
+
@player.points.should == 500
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "can be created from a CSV string" do
|
|
83
|
+
player = Player.from_csv("larry,150")
|
|
84
|
+
player.name.should == "Larry"
|
|
85
|
+
player.health.should == 150
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
context 'with health greater than 150' do
|
|
89
|
+
before do
|
|
90
|
+
@inital_health = 175
|
|
91
|
+
@player = Player.new("larry", @inital_health)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
it 'player is strong' do
|
|
95
|
+
@player.should be_strong
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
context 'with health less than 100' do
|
|
101
|
+
before do
|
|
102
|
+
@inital_health = 90
|
|
103
|
+
@player = Player.new("larry", @inital_health)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
it 'player is weak' do
|
|
107
|
+
@player.should_not be_strong
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
context "in a collection of players" do
|
|
113
|
+
before do
|
|
114
|
+
@player1 = Player.new("moe", 100)
|
|
115
|
+
@player2 = Player.new("larry", 200)
|
|
116
|
+
@player3 = Player.new("curly", 300)
|
|
117
|
+
|
|
118
|
+
@players = [@player1, @player2, @player3]
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "is sorted by decreasing score" do
|
|
122
|
+
@players.sort.should == [@player3, @player2, @player1]
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
end
|
|
130
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require 'studio_game/treasure_trove'
|
|
2
|
+
|
|
3
|
+
module StudioGame
|
|
4
|
+
|
|
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
|
+
describe TreasureTrove do
|
|
22
|
+
|
|
23
|
+
it "has six treasures" do
|
|
24
|
+
TreasureTrove::TREASURES.size.should == 6
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "has a pie worth 5 points" do
|
|
28
|
+
TreasureTrove::TREASURES[0].should == Treasure.new(:pie, 5)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "has a bottle worth 25 points" do
|
|
32
|
+
TreasureTrove::TREASURES[1].should == Treasure.new(:bottle, 25)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "has a hammer worth 50 points" do
|
|
36
|
+
TreasureTrove::TREASURES[2].should == Treasure.new(:hammer, 50)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "has a skillet worth 100 points" do
|
|
40
|
+
TreasureTrove::TREASURES[3].should == Treasure.new(:skillet, 100)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "has a broomstick worth 200 points" do
|
|
44
|
+
TreasureTrove::TREASURES[4].should == Treasure.new(:broomstick, 200)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "has a crowbar worth 400 points" do
|
|
48
|
+
TreasureTrove::TREASURES[5].should == Treasure.new(:crowbar, 400)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "returns a random treasure" do
|
|
52
|
+
treasure = TreasureTrove.random
|
|
53
|
+
|
|
54
|
+
TreasureTrove::TREASURES.should include(treasure)
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
end
|
|
59
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: studio_game_edward
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: '1.0'
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Edward Butler
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2016-07-08 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
|
+
# studio_game
|
|
29
|
+
A text-based Ruby game as part of the Pragmatic Studio Course
|
|
30
|
+
email: eddieozzie@gmail.com
|
|
31
|
+
executables:
|
|
32
|
+
- studio_game
|
|
33
|
+
extensions: []
|
|
34
|
+
extra_rdoc_files: []
|
|
35
|
+
files:
|
|
36
|
+
- LICENSE.md
|
|
37
|
+
- README.md
|
|
38
|
+
- bin/favorite_players.csv
|
|
39
|
+
- bin/studio_game
|
|
40
|
+
- lib/studio_game/auditable.rb
|
|
41
|
+
- lib/studio_game/berserk_player.rb
|
|
42
|
+
- lib/studio_game/clumsy_player.rb
|
|
43
|
+
- lib/studio_game/die.rb
|
|
44
|
+
- lib/studio_game/game.rb
|
|
45
|
+
- lib/studio_game/game_turn.rb
|
|
46
|
+
- lib/studio_game/loaded_die.rb
|
|
47
|
+
- lib/studio_game/playable.rb
|
|
48
|
+
- lib/studio_game/player.rb
|
|
49
|
+
- lib/studio_game/players.csv
|
|
50
|
+
- lib/studio_game/treasure_trove.rb
|
|
51
|
+
- spec/studio_game/game_spec.rb
|
|
52
|
+
- spec/studio_game/player_spec.rb
|
|
53
|
+
- spec/studio_game/treasure_trove_spec.rb
|
|
54
|
+
homepage: http://www.coppellappdevelopment.com
|
|
55
|
+
licenses:
|
|
56
|
+
- MIT
|
|
57
|
+
metadata: {}
|
|
58
|
+
post_install_message:
|
|
59
|
+
rdoc_options: []
|
|
60
|
+
require_paths:
|
|
61
|
+
- lib
|
|
62
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
63
|
+
requirements:
|
|
64
|
+
- - ">="
|
|
65
|
+
- !ruby/object:Gem::Version
|
|
66
|
+
version: '1.9'
|
|
67
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
68
|
+
requirements:
|
|
69
|
+
- - ">="
|
|
70
|
+
- !ruby/object:Gem::Version
|
|
71
|
+
version: '0'
|
|
72
|
+
requirements: []
|
|
73
|
+
rubyforge_project:
|
|
74
|
+
rubygems_version: 2.5.1
|
|
75
|
+
signing_key:
|
|
76
|
+
specification_version: 4
|
|
77
|
+
summary: This is a game I developed as part of the Pragmatic Studio class.
|
|
78
|
+
test_files:
|
|
79
|
+
- spec/studio_game/game_spec.rb
|
|
80
|
+
- spec/studio_game/player_spec.rb
|
|
81
|
+
- spec/studio_game/treasure_trove_spec.rb
|