studio_game_secor 1.0.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 +3 -0
- data/README +1 -0
- data/bin/players.csv +3 -0
- data/bin/studio_game_secor +44 -0
- data/lib/studio_game_secor/auditable.rb +7 -0
- data/lib/studio_game_secor/berserk_player.rb +35 -0
- data/lib/studio_game_secor/clumsy_player.rb +36 -0
- data/lib/studio_game_secor/die.rb +19 -0
- data/lib/studio_game_secor/game.rb +86 -0
- data/lib/studio_game_secor/game_turn.rb +24 -0
- data/lib/studio_game_secor/loaded_die.rb +15 -0
- data/lib/studio_game_secor/playable.rb +17 -0
- data/lib/studio_game_secor/player.rb +64 -0
- data/lib/studio_game_secor/treasure_trove.rb +21 -0
- data/spec/studio_game_secor/berserk_player_spec.rb +37 -0
- data/spec/studio_game_secor/clumsy_player_spec.rb +43 -0
- data/spec/studio_game_secor/game_spec.rb +59 -0
- data/spec/studio_game_secor/player_spec.rb +143 -0
- data/spec/studio_game_secor/treasure_trove_spec.rb +56 -0
- metadata +83 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 462b5dc487f674c4d8b377c824a25ccff9e1f450
|
4
|
+
data.tar.gz: f0325f4da32c3eb475d011c16c1d7c0187ef8bca
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b4e9b57fa43ca1df2f433c53333fbc4e9b2168d530b9130c13ec5baf7e6a5edff02e148592c6c9c6ea71841c7f1afef5c2f33b1c7d5ab7d8cd27135d83de669b
|
7
|
+
data.tar.gz: b0b9c2dd0acc55ba94b1fe5dbb601042457d287e4eec9c43e4ab252a3545d92a76830c957b021dcc2f7482c341befcb3cc8864935ca2edc2f22e40a488ba0467
|
data/LICENSE
ADDED
@@ -0,0 +1,3 @@
|
|
1
|
+
All course material, including videos, slides, and source code, is copyrighted and licensed for individual use only. You may make copies for your own personal use (e.g. on your laptop, on your iPad, on your backup drive). However, you may not transfer ownership or share the material with other people. We make no guarantees that the source code is fit for any purpose. Course material may not be used to create training material, courses, books, and the like. Please support us and our instructors by encouraging others to purchase their own copies. Thank you!
|
2
|
+
|
3
|
+
Copyright © 2005–2015, The Pragmatic Studio. All Rights Reserved.
|
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
I took an online course from Pragmatic Studio and built this game that takes multiple players and they randomly get w00ted or blammed and randomly accumulate treasure.
|
data/bin/players.csv
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/studio_game_secor/player'
|
4
|
+
require_relative '../lib/studio_game_secor/game'
|
5
|
+
require_relative '../lib/studio_game_secor/clumsy_player'
|
6
|
+
require_relative '../lib/studio_game_secor/berserk_player'
|
7
|
+
|
8
|
+
# player1 = Player.new("moe")
|
9
|
+
# player2 = Player.new("larry", 60)
|
10
|
+
# player3 = Player.new("curly", 125)
|
11
|
+
|
12
|
+
knuckleheads = StudioGame::Game.new("Knuckleheads")
|
13
|
+
default_player_file = File.join(File.dirname(__FILE__), "players.csv")
|
14
|
+
knuckleheads.load_players(ARGV.shift || default_player_file)
|
15
|
+
|
16
|
+
# knuckleheads.add_player(player1)
|
17
|
+
# knuckleheads.add_player(player2)
|
18
|
+
# knuckleheads.add_player(player3)
|
19
|
+
|
20
|
+
# knuckleheads.play(10) do
|
21
|
+
# knuckleheads.total_points >= 2000
|
22
|
+
# end
|
23
|
+
|
24
|
+
klutz = StudioGame::ClumsyPlayer.new("klutz", 105)
|
25
|
+
knuckleheads.add_player(klutz)
|
26
|
+
|
27
|
+
berserker = StudioGame::BerserkPlayer.new("berserker", 50)
|
28
|
+
knuckleheads.add_player(berserker)
|
29
|
+
|
30
|
+
loop do
|
31
|
+
puts "\nHow many game rounds? ('quit' to exit)"
|
32
|
+
answer = gets.chomp.downcase
|
33
|
+
case answer
|
34
|
+
when /^\d+$/
|
35
|
+
knuckleheads.play(Integer(answer))
|
36
|
+
when 'quit', 'exit'
|
37
|
+
knuckleheads.print_stats
|
38
|
+
break
|
39
|
+
else
|
40
|
+
puts "Please enter a number or 'quit'."
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
knuckleheads.save_high_scores
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
|
3
|
+
module StudioGame
|
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
|
+
if berserk?
|
22
|
+
w00t
|
23
|
+
else
|
24
|
+
super
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
if __FILE__ == $0
|
30
|
+
berserker = BerserkPlayer.new("berserker", 50)
|
31
|
+
6.times { berserker.w00t }
|
32
|
+
2.times { berserker.blam }
|
33
|
+
puts berserker.health
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
class ClumsyPlayer < Player
|
5
|
+
attr_reader :boost_factor
|
6
|
+
def initialize(name, health=100, boost_factor=1)
|
7
|
+
super(name, health)
|
8
|
+
@boost_factor = boost_factor
|
9
|
+
end
|
10
|
+
|
11
|
+
def found_treasure(treasure)
|
12
|
+
super(Treasure.new(treasure.name, treasure.points / 2.0))
|
13
|
+
end
|
14
|
+
|
15
|
+
def w00t
|
16
|
+
@boost_factor.times { super }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
if __FILE__ == $0
|
21
|
+
clumsy = ClumsyPlayer.new("klutz")
|
22
|
+
|
23
|
+
hammer = Treasure.new(:hammer, 50)
|
24
|
+
clumsy.found_treasure(hammer)
|
25
|
+
clumsy.found_treasure(hammer)
|
26
|
+
clumsy.found_treasure(hammer)
|
27
|
+
|
28
|
+
crowbar = Treasure.new(:crowbar, 400)
|
29
|
+
clumsy.found_treasure(crowbar)
|
30
|
+
|
31
|
+
clumsy.each_found_treasure do |treasure|
|
32
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
33
|
+
end
|
34
|
+
puts "#{clumsy.points} grand total points"
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require_relative 'game_turn'
|
2
|
+
require_relative 'treasure_trove'
|
3
|
+
require_relative 'player'
|
4
|
+
|
5
|
+
module StudioGame
|
6
|
+
class Game
|
7
|
+
attr_reader :title
|
8
|
+
def initialize(title)
|
9
|
+
@title = title
|
10
|
+
@players = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def load_players(from_file)
|
14
|
+
File.readlines(from_file).each do |line|
|
15
|
+
add_player(Player.from_csv(line))
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def add_player(player)
|
20
|
+
@players.push(player)
|
21
|
+
end
|
22
|
+
|
23
|
+
def play(rounds)
|
24
|
+
puts "There are #{@players.size} players in #{@title}: "
|
25
|
+
puts @players
|
26
|
+
|
27
|
+
treasures = TreasureTrove::TREASURES
|
28
|
+
puts "\nThere are #{treasures.size} treasures to be found:"
|
29
|
+
treasures.each do |t|
|
30
|
+
puts "A #{t.name} is worth #{t.points} points."
|
31
|
+
end
|
32
|
+
|
33
|
+
1.upto(rounds) do |round|
|
34
|
+
if block_given?
|
35
|
+
break if yield
|
36
|
+
end
|
37
|
+
puts "\nRound #{round}:"
|
38
|
+
@players.each do |player|
|
39
|
+
GameTurn.take_turn(player)
|
40
|
+
# puts player
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def print_name_and_health(player)
|
46
|
+
puts "#{player.name} (#{player.health})"
|
47
|
+
end
|
48
|
+
|
49
|
+
def total_points
|
50
|
+
@players.reduce(0) { |sum, player| sum + player.points }
|
51
|
+
end
|
52
|
+
|
53
|
+
def high_scores_entry(player)
|
54
|
+
"#{player.name.ljust(20,'.')} #{player.score}"
|
55
|
+
end
|
56
|
+
|
57
|
+
def print_stats
|
58
|
+
puts "\n#{@title} Statistics:"
|
59
|
+
strong, wimpy = @players.partition { |p| p.strong? }
|
60
|
+
puts "\n#{strong.length} strong players:"
|
61
|
+
strong.each { |p| print_name_and_health(p)}
|
62
|
+
puts "\n#{wimpy.length} wimpy players:"
|
63
|
+
wimpy.each { |p| print_name_and_health(p)}
|
64
|
+
puts "\n#{@title} High Scores:"
|
65
|
+
# sorted_players = @players.sort { |a, b| b.score <=> a.score }
|
66
|
+
@players.sort.each { |p| puts high_scores_entry(p)}
|
67
|
+
|
68
|
+
@players.each do |p|
|
69
|
+
puts "\n#{p.name}'s point totals:"
|
70
|
+
p.each_found_treasure do |treasure|
|
71
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
72
|
+
end
|
73
|
+
puts "#{p.points} grand total points"
|
74
|
+
end
|
75
|
+
|
76
|
+
puts "\nTotal treasure points found: #{total_points}"
|
77
|
+
end
|
78
|
+
|
79
|
+
def save_high_scores(to_file="high_scores.txt")
|
80
|
+
File.open(to_file, 'w') do |file|
|
81
|
+
file.puts "\n#{@title} High Scores:"
|
82
|
+
@players.sort.each { |p| file.puts high_scores_entry(p)}
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'die'
|
2
|
+
require_relative 'loaded_die'
|
3
|
+
require_relative 'treasure_trove'
|
4
|
+
|
5
|
+
module StudioGame
|
6
|
+
module GameTurn
|
7
|
+
def self.take_turn(player)
|
8
|
+
die = Die.new
|
9
|
+
case die.roll
|
10
|
+
when 1..2
|
11
|
+
player.blam
|
12
|
+
when 3..4
|
13
|
+
puts "#{player.name} was skipped."
|
14
|
+
else
|
15
|
+
player.w00t
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
prize = TreasureTrove.random
|
20
|
+
player.found_treasure(prize)
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,64 @@
|
|
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 found_treasure(treasure)
|
17
|
+
@found_treasures[treasure.name] += treasure.points
|
18
|
+
puts "#{@name} found a #{treasure.name} worth #{treasure.points} points!"
|
19
|
+
puts "#{@name}'s treasures: #{@found_treasures}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def points
|
23
|
+
@found_treasures.values.reduce(0, :+)
|
24
|
+
end
|
25
|
+
|
26
|
+
def score # virtual attribute
|
27
|
+
@health + points
|
28
|
+
end
|
29
|
+
|
30
|
+
def name=(new_name)
|
31
|
+
@name = new_name.capitalize
|
32
|
+
end
|
33
|
+
|
34
|
+
def each_found_treasure
|
35
|
+
@found_treasures.each do |name, points|
|
36
|
+
yield Treasure.new(name, points)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
"I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}."
|
42
|
+
end
|
43
|
+
|
44
|
+
def <=>(other)
|
45
|
+
other.score <=> score
|
46
|
+
end
|
47
|
+
|
48
|
+
def self.from_csv(line)
|
49
|
+
name, health = line.split(',')
|
50
|
+
player = Player.new(name, Integer(health))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
if __FILE__ == $0 # or $PROGRAM_NAME
|
55
|
+
# will only run the following code if you run the actual player.rb file
|
56
|
+
player = Player.new("moe")
|
57
|
+
puts player.name
|
58
|
+
puts player.health
|
59
|
+
player.w00t
|
60
|
+
puts player.health
|
61
|
+
player.blam
|
62
|
+
puts player.health
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module StudioGame
|
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.sample
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
# puts TreasureTrove::TREASURES
|
20
|
+
# prize = TreasureTrove.random
|
21
|
+
# puts "You found a #{prize.name} for #{prize.points} points!"
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'studio_game_secor/berserk_player'
|
2
|
+
|
3
|
+
module StudioGame
|
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
|
+
expect(@player.berserk?).to be_falsey
|
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
|
+
expect(@player.berserk?).to be_truthy
|
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
|
+
expect(@player.health).to eq(@initial_health + (8 * 15))
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'studio_game_secor/clumsy_player'
|
2
|
+
|
3
|
+
module StudioGame
|
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
|
+
expect(@player.points).to eq(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
|
+
expect(@player.points).to eq(75)
|
18
|
+
|
19
|
+
crowbar = Treasure.new(:crowbar, 400)
|
20
|
+
@player.found_treasure(crowbar)
|
21
|
+
|
22
|
+
expect(@player.points).to eq(275)
|
23
|
+
|
24
|
+
yielded = []
|
25
|
+
@player.each_found_treasure do |treasure|
|
26
|
+
yielded << treasure
|
27
|
+
end
|
28
|
+
|
29
|
+
expect(yielded).to eq([Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)])
|
30
|
+
end
|
31
|
+
|
32
|
+
context "define clumsy player with a boost factor" do
|
33
|
+
it "gets a boost in w00ts" do
|
34
|
+
boost = 5
|
35
|
+
initial_health = 100
|
36
|
+
player = ClumsyPlayer.new("klutz",initial_health, boost)
|
37
|
+
player.w00t
|
38
|
+
expect(player.health).to eq(initial_health + (15 * boost))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'studio_game_secor/game'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
describe Game do
|
5
|
+
|
6
|
+
before do
|
7
|
+
$stdout = StringIO.new
|
8
|
+
@game = Game.new("Knuckleheads")
|
9
|
+
|
10
|
+
@initial_health = 100
|
11
|
+
@player = Player.new("moe", @initial_health)
|
12
|
+
|
13
|
+
@game.add_player(@player)
|
14
|
+
end
|
15
|
+
|
16
|
+
it "high roll" do
|
17
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(5)
|
18
|
+
@game.play(2)
|
19
|
+
expect(@player.health).to eq(@initial_health + (15*2))
|
20
|
+
end
|
21
|
+
|
22
|
+
it "medium roll" do
|
23
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(3)
|
24
|
+
@game.play(2)
|
25
|
+
expect(@player.health).to eq(@initial_health)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "low roll" do
|
29
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(1)
|
30
|
+
@game.play(2)
|
31
|
+
expect(@player.health).to eq(@initial_health - (10*2))
|
32
|
+
end
|
33
|
+
|
34
|
+
it "assigns a treasure for points during a player's turn" do
|
35
|
+
game = Game.new("Knuckleheads")
|
36
|
+
player = Player.new("moe")
|
37
|
+
game.add_player(player)
|
38
|
+
game.play(1)
|
39
|
+
expect(player.points).not_to be_zero
|
40
|
+
end
|
41
|
+
|
42
|
+
it "computes total points as the sum of all player points" do
|
43
|
+
game = Game.new("Knuckleheads")
|
44
|
+
|
45
|
+
player1 = Player.new("moe")
|
46
|
+
player2 = Player.new("larry")
|
47
|
+
|
48
|
+
game.add_player(player1)
|
49
|
+
game.add_player(player2)
|
50
|
+
|
51
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
52
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
53
|
+
player2.found_treasure(Treasure.new(:crowbar, 400))
|
54
|
+
|
55
|
+
expect(game.total_points).to eq(500)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,143 @@
|
|
1
|
+
# to run: rspec player_spec.rb --color --format doc
|
2
|
+
|
3
|
+
require 'studio_game_secor/player'
|
4
|
+
|
5
|
+
module StudioGame
|
6
|
+
describe Player do
|
7
|
+
|
8
|
+
before do
|
9
|
+
$stdout = StringIO.new # any output generated by example code will not to to the console
|
10
|
+
@initial_health = 150
|
11
|
+
@player = Player.new("larry", @initial_health)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "capitalizes the name" do
|
15
|
+
#player.name.should == "Larry"
|
16
|
+
expect(@player.name).to eq("Larry")
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has an initial health" do
|
20
|
+
expect(@player.health).to eq(@initial_health)
|
21
|
+
end
|
22
|
+
|
23
|
+
# it "score is health plus number of letters in player's name" do
|
24
|
+
# expect(@player.score).to eq(@initial_health + @player.name.length)
|
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
|
+
expect(@player.score).to eq(250)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "w00t adds 15 points to health" do
|
35
|
+
@player.w00t
|
36
|
+
expect(@player.health).to eq(@initial_health + 15)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "blam subtracts 10 points from health" do
|
40
|
+
@player.blam
|
41
|
+
expect(@player.health).to eq(@initial_health - 10)
|
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
|
+
expect(@player.to_s).to eq("I'm Larry with health = 150, points = 100, and score = 250.")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "computes points as the sum of all treasure points" do
|
51
|
+
expect(@player.points).to eq(0)
|
52
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
53
|
+
expect(@player.points).to eq(50)
|
54
|
+
@player.found_treasure(Treasure.new(:crowbar, 400))
|
55
|
+
expect(@player.points).to eq(450)
|
56
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
57
|
+
expect(@player.points).to eq(500)
|
58
|
+
end
|
59
|
+
|
60
|
+
it "yields each found treasure and its total points" do
|
61
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
62
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
63
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
64
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
65
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
66
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
67
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
68
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
69
|
+
|
70
|
+
yielded = []
|
71
|
+
@player.each_found_treasure do |treasure|
|
72
|
+
yielded << treasure
|
73
|
+
end
|
74
|
+
|
75
|
+
expect(yielded).to eq([
|
76
|
+
Treasure.new(:skillet, 200),
|
77
|
+
Treasure.new(:hammer, 50),
|
78
|
+
Treasure.new(:bottle, 25)
|
79
|
+
])
|
80
|
+
end
|
81
|
+
|
82
|
+
it "has a line and creates a new player" do
|
83
|
+
player = Player.from_csv("larry,150")
|
84
|
+
expect(player.name).to eq("Larry")
|
85
|
+
expect(player.health).to eq(150)
|
86
|
+
end
|
87
|
+
|
88
|
+
context "created with a default health" do
|
89
|
+
before do
|
90
|
+
@player = Player.new("larry")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "has a health of 100" do
|
94
|
+
expect(@player.health).to eq(100)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context "created to change the name" do
|
99
|
+
before do
|
100
|
+
@player = Player.new("larry")
|
101
|
+
end
|
102
|
+
it "assign a new name and capitalizes it" do
|
103
|
+
@player.name = "moe"
|
104
|
+
expect(@player.name).to eq("Moe")
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
context "Health is 150" do
|
109
|
+
before do
|
110
|
+
@player = Player.new("larry",150)
|
111
|
+
end
|
112
|
+
|
113
|
+
it "is player strong?" do
|
114
|
+
expect(@player).to be_strong
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
context "Health is 100" do
|
119
|
+
before do
|
120
|
+
@player = Player.new("larry",100)
|
121
|
+
end
|
122
|
+
|
123
|
+
it "is player strong?" do
|
124
|
+
expect(@player).not_to be_strong
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
context "in a collection of players" do
|
129
|
+
before do
|
130
|
+
@player1 = Player.new("moe", 100)
|
131
|
+
@player2 = Player.new("larry", 200)
|
132
|
+
@player3 = Player.new("curly", 300)
|
133
|
+
|
134
|
+
@players = [@player1, @player2, @player3]
|
135
|
+
end
|
136
|
+
|
137
|
+
it "is sorted by decreasing score" do
|
138
|
+
expect(@players.sort).to eq([@player3, @player2, @player1])
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
end
|
143
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'studio_game_secor/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
|
+
expect(@treasure.name).to eq(:hammer)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a points attribute" do
|
15
|
+
expect(@treasure.points).to eq(50)
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe TreasureTrove do
|
21
|
+
|
22
|
+
it "has six treasures" do
|
23
|
+
expect(TreasureTrove::TREASURES.size).to eq(6)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "has a pie worth 5 points" do
|
27
|
+
expect(TreasureTrove::TREASURES[0]).to eq(Treasure.new(:pie, 5))
|
28
|
+
end
|
29
|
+
|
30
|
+
it "has a bottle worth 25 points" do
|
31
|
+
expect(TreasureTrove::TREASURES[1]).to eq(Treasure.new(:bottle, 25))
|
32
|
+
end
|
33
|
+
|
34
|
+
it "has a hammer worth 50 points" do
|
35
|
+
expect(TreasureTrove::TREASURES[2]).to eq(Treasure.new(:hammer, 50))
|
36
|
+
end
|
37
|
+
|
38
|
+
it "has a skillet worth 100 points" do
|
39
|
+
expect(TreasureTrove::TREASURES[3]).to eq(Treasure.new(:skillet, 100))
|
40
|
+
end
|
41
|
+
|
42
|
+
it "has a broomstick worth 200 points" do
|
43
|
+
expect(TreasureTrove::TREASURES[4]).to eq(Treasure.new(:broomstick, 200))
|
44
|
+
end
|
45
|
+
|
46
|
+
it "has a crowbar worth 400 points" do
|
47
|
+
expect(TreasureTrove::TREASURES[5]).to eq(Treasure.new(:crowbar, 400))
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns a random treasure" do
|
51
|
+
treasure = TreasureTrove.random
|
52
|
+
expect(TreasureTrove::TREASURES).to include(treasure)
|
53
|
+
end
|
54
|
+
|
55
|
+
end
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: studio_game_secor
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Beth Secor
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2015-09-23 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: 3.3.2
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - '='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.3.2
|
27
|
+
description: |
|
28
|
+
I took an online course from Pragmatic Studio and built this game that takes multiple players and they randomly get w00ted or blammed and randomly accumulate treasure.
|
29
|
+
email: elizabeth.a.secor@gmail.com
|
30
|
+
executables:
|
31
|
+
- studio_game_secor
|
32
|
+
extensions: []
|
33
|
+
extra_rdoc_files: []
|
34
|
+
files:
|
35
|
+
- LICENSE
|
36
|
+
- README
|
37
|
+
- bin/players.csv
|
38
|
+
- bin/studio_game_secor
|
39
|
+
- lib/studio_game_secor/auditable.rb
|
40
|
+
- lib/studio_game_secor/berserk_player.rb
|
41
|
+
- lib/studio_game_secor/clumsy_player.rb
|
42
|
+
- lib/studio_game_secor/die.rb
|
43
|
+
- lib/studio_game_secor/game.rb
|
44
|
+
- lib/studio_game_secor/game_turn.rb
|
45
|
+
- lib/studio_game_secor/loaded_die.rb
|
46
|
+
- lib/studio_game_secor/playable.rb
|
47
|
+
- lib/studio_game_secor/player.rb
|
48
|
+
- lib/studio_game_secor/treasure_trove.rb
|
49
|
+
- spec/studio_game_secor/berserk_player_spec.rb
|
50
|
+
- spec/studio_game_secor/clumsy_player_spec.rb
|
51
|
+
- spec/studio_game_secor/game_spec.rb
|
52
|
+
- spec/studio_game_secor/player_spec.rb
|
53
|
+
- spec/studio_game_secor/treasure_trove_spec.rb
|
54
|
+
homepage: https://pragmaticstudio.com/ruby
|
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: '2.0'
|
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.4.6
|
75
|
+
signing_key:
|
76
|
+
specification_version: 4
|
77
|
+
summary: Game built from a Pragmatic Studio course
|
78
|
+
test_files:
|
79
|
+
- spec/studio_game_secor/berserk_player_spec.rb
|
80
|
+
- spec/studio_game_secor/clumsy_player_spec.rb
|
81
|
+
- spec/studio_game_secor/game_spec.rb
|
82
|
+
- spec/studio_game_secor/player_spec.rb
|
83
|
+
- spec/studio_game_secor/treasure_trove_spec.rb
|