pleiro_game 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.
- checksums.yaml +7 -0
- data/LICENSE +1 -0
- data/README +1 -0
- data/bin/players.csv +3 -0
- data/bin/pleiro_game +32 -0
- data/lib/pleiro_game/auditable.rb +10 -0
- data/lib/pleiro_game/berserk_player.rb +38 -0
- data/lib/pleiro_game/clumsy_player.rb +42 -0
- data/lib/pleiro_game/die.rb +21 -0
- data/lib/pleiro_game/game.rb +124 -0
- data/lib/pleiro_game/game_turn.rb +24 -0
- data/lib/pleiro_game/loaded_die.rb +18 -0
- data/lib/pleiro_game/playable.rb +20 -0
- data/lib/pleiro_game/player.rb +61 -0
- data/lib/pleiro_game/treasure_trove.rb +22 -0
- data/spec/pleiro_game/berserk_player_spec.rb +27 -0
- data/spec/pleiro_game/clumsy_player_spec.rb +54 -0
- data/spec/pleiro_game/game_spec.rb +73 -0
- data/spec/pleiro_game/player_spec.rb +129 -0
- data/spec/pleiro_game/treasure_trove_spec.rb +58 -0
- metadata +81 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b8a1a37e0ec161374f7e151ad6cc248986297895
|
4
|
+
data.tar.gz: 0432dfaa31898411aabd929847c287aa82b7c7e2
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a89adc79f10ed851b163e4ee71834020c5dcf3184bf39721b71f7ab2a70994a6945e520ad092c487ed460f6aa3385eb8bf9624998740819714624306860c0d52
|
7
|
+
data.tar.gz: 01e2c602be822f62d34d8c07b4728a01de9aa5a6afd1da9b7d5450c6b59e7301d8875f4f032e357e4386592069ba6de172c2e6a3d64da5d3462ce14d6f4f72a8
|
data/LICENSE
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
By downloading GEM, you are entitled to use it, but not distribute as your own work. Jesus sees all. Enjoy!
|
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Game. Easy. Run game running 'pleiro_game' from command line. Enjoy.
|
data/bin/players.csv
ADDED
data/bin/pleiro_game
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative '../lib/pleiro_game/player'
|
4
|
+
require_relative '../lib/pleiro_game/clumsy_player'
|
5
|
+
require_relative '../lib/pleiro_game/berserk_player'
|
6
|
+
require_relative '../lib/pleiro_game/game'
|
7
|
+
require_relative '../lib/pleiro_game/die'
|
8
|
+
|
9
|
+
game1 = PleiroGame::Game.new("scavenger")
|
10
|
+
default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
|
11
|
+
game1.load_players(ARGV.shift || default_player_file)
|
12
|
+
player4 = PleiroGame::ClumsyPlayer.new('klutz', 105)
|
13
|
+
player5 = PleiroGame::BerserkPlayer.new('brent', 50)
|
14
|
+
game1.add_player(player4)
|
15
|
+
game1.add_player(player5)
|
16
|
+
|
17
|
+
loop do
|
18
|
+
puts "\nHow many game rounds? ('quit' to exit)"
|
19
|
+
answer = gets.chomp.downcase
|
20
|
+
case answer
|
21
|
+
when /^\d+$/
|
22
|
+
game1.play(answer.to_i)
|
23
|
+
when 'quit', 'exit'
|
24
|
+
puts game1.players
|
25
|
+
game1.print_stats
|
26
|
+
break
|
27
|
+
else
|
28
|
+
"Please enter an integer or type 'quit' to exit."
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
game1.save_high_scores
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
|
3
|
+
module PleiroGame
|
4
|
+
|
5
|
+
class BerserkPlayer < Player
|
6
|
+
|
7
|
+
def initialize(name, health=100)
|
8
|
+
super(name, health)
|
9
|
+
@increased_health_count = 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def berserk?
|
13
|
+
@increased_health_count > 5
|
14
|
+
end
|
15
|
+
|
16
|
+
def increase_health
|
17
|
+
super
|
18
|
+
@increased_health_count += 1
|
19
|
+
puts "#{@name} is berserk!" if berserk?
|
20
|
+
end
|
21
|
+
|
22
|
+
def decrease_health
|
23
|
+
if berserk?
|
24
|
+
increase_health
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
if __FILE__ == $0
|
32
|
+
sean = BerserkPlayer.new("sean", 50)
|
33
|
+
6.times { sean.increase_health }
|
34
|
+
2.times { sean.decrease_health }
|
35
|
+
puts sean.health
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
|
3
|
+
module PleiroGame
|
4
|
+
|
5
|
+
class ClumsyPlayer < Player
|
6
|
+
attr_reader :boost
|
7
|
+
|
8
|
+
def initialize(name, health, boost=1)
|
9
|
+
super(name, health)
|
10
|
+
@boost = boost
|
11
|
+
end
|
12
|
+
|
13
|
+
def increase_health
|
14
|
+
@boost.times { super }
|
15
|
+
end
|
16
|
+
|
17
|
+
def found_treasure(treasure)
|
18
|
+
damaged_treasure = Treasure.new(treasure.name, treasure.points / 2.0)
|
19
|
+
super(damaged_treasure)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if __FILE__ == $0
|
24
|
+
clumsy = ClumsyPlayer.new("sean", 105,)
|
25
|
+
|
26
|
+
hammer = Treasure.new(:hammer, 50)
|
27
|
+
clumsy.found_treasure(hammer)
|
28
|
+
clumsy.found_treasure(hammer)
|
29
|
+
clumsy.found_treasure(hammer)
|
30
|
+
|
31
|
+
crowbar = Treasure.new(:crowbar, 400)
|
32
|
+
clumsy.found_treasure(crowbar)
|
33
|
+
|
34
|
+
clumsy.each_found_treasure do |treasure|
|
35
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
36
|
+
end
|
37
|
+
puts "#{clumsy.points} grand total points"
|
38
|
+
clumsy.increase_health
|
39
|
+
puts clumsy.health
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
require_relative 'game_turn'
|
3
|
+
require_relative 'treasure_trove'
|
4
|
+
require 'csv'
|
5
|
+
|
6
|
+
module PleiroGame
|
7
|
+
|
8
|
+
class Game
|
9
|
+
attr_reader :title
|
10
|
+
attr_reader :players
|
11
|
+
|
12
|
+
def initialize(title)
|
13
|
+
@title = title.capitalize
|
14
|
+
@players = Array.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_players(file_name)
|
18
|
+
CSV.foreach(file_name) do |row|
|
19
|
+
player = Player.new(row[0], row[1].to_i)
|
20
|
+
add_player(player)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def save_high_scores(to_file="high_scores.txt")
|
25
|
+
File.open(to_file, "w") do |file|
|
26
|
+
file.puts "#{@title} High Scores:"
|
27
|
+
@players.sort.each do |player|
|
28
|
+
formated_name = player.name.ljust(20, ".")
|
29
|
+
file.puts high_score_entry(player)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def add_player(player)
|
35
|
+
@player = player
|
36
|
+
@players.push(@player)
|
37
|
+
puts "#{@player.name} has been added for #{@title}!\n"
|
38
|
+
end
|
39
|
+
|
40
|
+
def play(rounds)
|
41
|
+
puts "\nThere are #{@players.length} players in #{@title}!\n\n"
|
42
|
+
|
43
|
+
1.upto(rounds) do |rounds|
|
44
|
+
if block_given?
|
45
|
+
break if yield
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
@players.each do |player|
|
50
|
+
puts player
|
51
|
+
end
|
52
|
+
|
53
|
+
treasures = TreasureTrove::TREASURES
|
54
|
+
puts "\nThere are #{treasures.count} treasures to be found:"
|
55
|
+
|
56
|
+
treasures.each do |treasure|
|
57
|
+
puts "A #{treasure.name} is worth #{treasure.points} points"
|
58
|
+
end
|
59
|
+
|
60
|
+
1.upto(rounds) do |round|
|
61
|
+
puts "\nRound #{round}:"
|
62
|
+
@players.each do |player|
|
63
|
+
GameTurn.take_turn(player)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
puts "\n"
|
67
|
+
end
|
68
|
+
|
69
|
+
def print_name_and_health(player)
|
70
|
+
puts "#{player.name} (#{player.health})"
|
71
|
+
end
|
72
|
+
|
73
|
+
def print_stats
|
74
|
+
strong_players, wimpy_players = @players.partition { |player| player.strong? }
|
75
|
+
|
76
|
+
puts "\n#{@title}'s Statistics:\n\n"
|
77
|
+
puts "#{strong_players.length} strong players:"
|
78
|
+
strong_players.each do |player|
|
79
|
+
print_name_and_health(player)
|
80
|
+
end
|
81
|
+
|
82
|
+
puts "\n\n#{wimpy_players.length} wimpy players:"
|
83
|
+
wimpy_players.each do |player|
|
84
|
+
print_name_and_health(player)
|
85
|
+
end
|
86
|
+
|
87
|
+
@players.each do |player|
|
88
|
+
puts "\n#{player.name}'s point total:"
|
89
|
+
puts "#{player.points} grand total points"
|
90
|
+
end
|
91
|
+
|
92
|
+
puts "\n#{@title}'s High Scores:"
|
93
|
+
@players.sort.each do |player|
|
94
|
+
puts high_score_entry(player)
|
95
|
+
end
|
96
|
+
|
97
|
+
puts "\n#{total_points} total points from treasures found."
|
98
|
+
|
99
|
+
@players.sort.each do |player|
|
100
|
+
puts "\n#{player.name}'s points totals:"
|
101
|
+
player.each_found_treasure do |treasure|
|
102
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
103
|
+
end
|
104
|
+
puts "#{player.points} grand total points"
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
108
|
+
|
109
|
+
def high_score_entry(player)
|
110
|
+
formatted_name = player.name.ljust(20, '.')
|
111
|
+
"#{formatted_name} #{player.score}"
|
112
|
+
end
|
113
|
+
|
114
|
+
def total_points
|
115
|
+
@players.reduce(0) { |sum, player| sum + player.points }
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
if __FILE__ == $0
|
120
|
+
game1 = Game.new("basketball")
|
121
|
+
puts game1.title
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
require_relative 'die'
|
3
|
+
require_relative 'loaded_die'
|
4
|
+
|
5
|
+
module PleiroGame
|
6
|
+
|
7
|
+
module GameTurn
|
8
|
+
def self.take_turn(player)
|
9
|
+
die = Die.new
|
10
|
+
case die.roll
|
11
|
+
when 1..2
|
12
|
+
player.decrease_health
|
13
|
+
when 3..4
|
14
|
+
puts "#{player.name} has been skipped!"
|
15
|
+
else
|
16
|
+
player.increase_health
|
17
|
+
end
|
18
|
+
|
19
|
+
treasure = TreasureTrove.random
|
20
|
+
player.found_treasure(treasure)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module PleiroGame
|
2
|
+
|
3
|
+
module Playable
|
4
|
+
|
5
|
+
def increase_health
|
6
|
+
self.health += 10
|
7
|
+
puts "#{name} picked up health!"
|
8
|
+
end
|
9
|
+
|
10
|
+
def decrease_health
|
11
|
+
self.health -= 5
|
12
|
+
puts "#{name} is losing health!"
|
13
|
+
end
|
14
|
+
|
15
|
+
def strong?
|
16
|
+
health >= 100
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative 'treasure_trove'
|
2
|
+
require_relative 'playable'
|
3
|
+
|
4
|
+
module PleiroGame
|
5
|
+
|
6
|
+
class Player
|
7
|
+
include Playable
|
8
|
+
|
9
|
+
attr_accessor :health
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
|
13
|
+
def initialize(name, health=100)
|
14
|
+
@name = name.capitalize
|
15
|
+
@health = health
|
16
|
+
@found_treasures = Hash.new(0)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.from_csv(string)
|
20
|
+
name, health = string.split(',')
|
21
|
+
player = Player.new(name, Integer(health))
|
22
|
+
end
|
23
|
+
|
24
|
+
def found_treasure(treasure)
|
25
|
+
@found_treasures[treasure.name] += treasure.points
|
26
|
+
puts "#{@name} found a #{treasure.name} worth #{treasure.points} points."
|
27
|
+
puts "#{@name}'s treasures: #{@found_treasures}"
|
28
|
+
end
|
29
|
+
|
30
|
+
def each_found_treasure
|
31
|
+
@found_treasures.each do |name, points|
|
32
|
+
yield Treasure.new(name, points)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def points
|
37
|
+
@found_treasures.values.reduce(0, :+)
|
38
|
+
end
|
39
|
+
|
40
|
+
def score
|
41
|
+
@health + points
|
42
|
+
end
|
43
|
+
|
44
|
+
def <=>(other)
|
45
|
+
other.score <=> score
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_s
|
49
|
+
"I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}."
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
if __FILE__ == $0
|
54
|
+
|
55
|
+
player1 = Player.new("sean", 150)
|
56
|
+
puts player1
|
57
|
+
puts player1.name
|
58
|
+
puts player1.health
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module PleiroGame
|
2
|
+
|
3
|
+
Treasure = Struct.new(:name, :points)
|
4
|
+
|
5
|
+
|
6
|
+
module TreasureTrove
|
7
|
+
|
8
|
+
TREASURES = [
|
9
|
+
Treasure.new(:pie, 5),
|
10
|
+
Treasure.new(:bottle, 25),
|
11
|
+
Treasure.new(:hammer, 50),
|
12
|
+
Treasure.new(:skillet, 100),
|
13
|
+
Treasure.new(:broomstick, 200),
|
14
|
+
Treasure.new(:crowbar, 400)
|
15
|
+
]
|
16
|
+
|
17
|
+
def self.random
|
18
|
+
TREASURES.sample
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'pleiro_game/berserk_player'
|
2
|
+
|
3
|
+
module PleiroGame
|
4
|
+
|
5
|
+
describe BerserkPlayer do
|
6
|
+
|
7
|
+
before do
|
8
|
+
$stdout = StringIO.new
|
9
|
+
@initial_health = 50
|
10
|
+
@player = BerserkPlayer.new("sean", @initial_health)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "does not go berserk when increased health up to 5 times" do
|
14
|
+
1.upto(5) {@player.increase_health}
|
15
|
+
|
16
|
+
@player.berserk?.should be_false
|
17
|
+
end
|
18
|
+
|
19
|
+
it "goes berserk when incraesed health more than 5 times" do
|
20
|
+
1.upto(6) {@player.increase_health}
|
21
|
+
1.upto(2) {@player.decrease_health}
|
22
|
+
|
23
|
+
@player.health.should == @initial_health + (10 * 8)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'pleiro_game/clumsy_player'
|
2
|
+
|
3
|
+
module PleiroGame
|
4
|
+
|
5
|
+
describe ClumsyPlayer do
|
6
|
+
before do
|
7
|
+
$stdout = StringIO.new
|
8
|
+
@player = ClumsyPlayer.new("sean", 105, 2)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "only gets half the point value for each treasure" do
|
12
|
+
@player.points.should == 0
|
13
|
+
|
14
|
+
hammer = Treasure.new(:hammer, 50)
|
15
|
+
@player.found_treasure(hammer)
|
16
|
+
@player.found_treasure(hammer)
|
17
|
+
@player.found_treasure(hammer)
|
18
|
+
|
19
|
+
@player.points.should == 75
|
20
|
+
|
21
|
+
crowbar = Treasure.new(:crowbar, 400)
|
22
|
+
@player.found_treasure(crowbar)
|
23
|
+
|
24
|
+
@player.points.should == 275
|
25
|
+
|
26
|
+
yielded = []
|
27
|
+
@player.each_found_treasure do |treasure|
|
28
|
+
yielded << treasure
|
29
|
+
end
|
30
|
+
|
31
|
+
yielded.should == [Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)]
|
32
|
+
end
|
33
|
+
|
34
|
+
context "with a boost factor" do
|
35
|
+
before do
|
36
|
+
@initial_health = 100
|
37
|
+
@boost = 5
|
38
|
+
@player = ClumsyPlayer.new("sean", @initial_health, @boost)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "has a boost factor" do
|
42
|
+
@player.boost.should == 5
|
43
|
+
end
|
44
|
+
|
45
|
+
it "gets boost factor number of increased health when health is increased" do
|
46
|
+
@player.increase_health
|
47
|
+
|
48
|
+
@player.health.should == @initial_health + (10 * @boost)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'pleiro_game/game'
|
2
|
+
require 'pleiro_game/die'
|
3
|
+
|
4
|
+
module PleiroGame
|
5
|
+
|
6
|
+
describe Game do
|
7
|
+
|
8
|
+
before do
|
9
|
+
$stdout = StringIO.new
|
10
|
+
@game = Game.new("basketball")
|
11
|
+
|
12
|
+
@initial_health = 100
|
13
|
+
@player = Player.new("sean", @initial_health)
|
14
|
+
|
15
|
+
@game.add_player(@player)
|
16
|
+
end
|
17
|
+
|
18
|
+
it "increaes the player's health" do
|
19
|
+
Die.any_instance.stub(:roll).and_return(5)
|
20
|
+
|
21
|
+
@game.play(2)
|
22
|
+
|
23
|
+
@player.health.should == @initial_health + (10 * 2)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "skips the player's health" do
|
27
|
+
Die.any_instance.stub(:roll).and_return(3)
|
28
|
+
|
29
|
+
@game.play(2)
|
30
|
+
|
31
|
+
@player.health.should == @initial_health
|
32
|
+
end
|
33
|
+
|
34
|
+
it "decreases the player's health" do
|
35
|
+
Die.any_instance.stub(:roll).and_return(1)
|
36
|
+
|
37
|
+
@game.play(2)
|
38
|
+
|
39
|
+
@player.health.should == @initial_health - (5 * 2)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "assigns a treasure for poitns during a player's turn" do
|
43
|
+
game = Game.new("scavenger")
|
44
|
+
player = Player.new("sean")
|
45
|
+
|
46
|
+
game.add_player(player)
|
47
|
+
|
48
|
+
game.play(1)
|
49
|
+
|
50
|
+
player.points.should_not be_zero
|
51
|
+
end
|
52
|
+
|
53
|
+
it "computes total points as the sum of all player points" do
|
54
|
+
game = Game.new("scavenger")
|
55
|
+
|
56
|
+
player1 = Player.new("sean")
|
57
|
+
player2 = Player.new("stephon")
|
58
|
+
|
59
|
+
game.add_player(player1)
|
60
|
+
game.add_player(player2)
|
61
|
+
|
62
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
63
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
64
|
+
player2.found_treasure(Treasure.new(:crowbar, 400))
|
65
|
+
|
66
|
+
game.total_points.should == 500
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
end
|
71
|
+
|
72
|
+
|
73
|
+
|
@@ -0,0 +1,129 @@
|
|
1
|
+
require 'pleiro_game/player'
|
2
|
+
require 'pleiro_game/treasure_trove'
|
3
|
+
|
4
|
+
module PleiroGame
|
5
|
+
|
6
|
+
describe Player do
|
7
|
+
before do
|
8
|
+
$stdout = StringIO.new
|
9
|
+
@initial_health = 150
|
10
|
+
@player = Player.new("sean", @initial_health)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "has a capitalized name" do
|
14
|
+
@player.name.should == "Sean"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "has an initial health" do
|
18
|
+
|
19
|
+
@player.health.should == @initial_health
|
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 Sean with health = 150, points = 100, and score = 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 10 when health is increased" do
|
37
|
+
@player.increase_health
|
38
|
+
|
39
|
+
@player.health.should == @initial_health + 10
|
40
|
+
end
|
41
|
+
|
42
|
+
it "decreases health by 5 when health is decreased" do
|
43
|
+
@player.decrease_health
|
44
|
+
|
45
|
+
@player.health.should == @initial_health - 5
|
46
|
+
end
|
47
|
+
|
48
|
+
context "this player is strong" do
|
49
|
+
before do
|
50
|
+
@player = Player.new("sean", 150)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "has to be a strong player" do
|
54
|
+
|
55
|
+
@player.should be_strong
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
it "computes points as the sum of all treasure points" do
|
60
|
+
@player.points.should == 0
|
61
|
+
|
62
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
63
|
+
|
64
|
+
@player.points.should == 50
|
65
|
+
|
66
|
+
@player.found_treasure(Treasure.new(:crowbar, 400))
|
67
|
+
|
68
|
+
@player.points.should == 450
|
69
|
+
|
70
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
71
|
+
|
72
|
+
@player.points.should == 500
|
73
|
+
end
|
74
|
+
|
75
|
+
it "yields each found treasure and its total poitns" do
|
76
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
77
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
78
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
79
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
80
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
81
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
82
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
83
|
+
@player.found_treasure(Treasure.new(:bottle,5))
|
84
|
+
|
85
|
+
yielded = []
|
86
|
+
@player.each_found_treasure do |treasure|
|
87
|
+
yielded << treasure
|
88
|
+
end
|
89
|
+
|
90
|
+
yielded.should == [
|
91
|
+
Treasure.new(:skillet, 200),
|
92
|
+
Treasure.new(:hammer, 50),
|
93
|
+
Treasure.new(:bottle, 25)
|
94
|
+
]
|
95
|
+
end
|
96
|
+
|
97
|
+
it "can be created from a CSV string" do
|
98
|
+
player = Player.from_csv("sean,150")
|
99
|
+
|
100
|
+
player.name.should == "Sean"
|
101
|
+
player.health.should == 150
|
102
|
+
end
|
103
|
+
|
104
|
+
context "this player is wimpy" do
|
105
|
+
before do
|
106
|
+
@player = Player.new("sean", 99)
|
107
|
+
end
|
108
|
+
|
109
|
+
it "has to be a wimpy player" do
|
110
|
+
@player.should_not be_strong
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context "in a collection of players" do
|
115
|
+
before do
|
116
|
+
@player1 = Player.new("sean", 100)
|
117
|
+
@player2 = Player.new("stephon", 200)
|
118
|
+
@player3 = Player.new("cory", 300)
|
119
|
+
|
120
|
+
@players = [@player1, @player2, @player3]
|
121
|
+
end
|
122
|
+
|
123
|
+
it "is sorted by decreasing score" do
|
124
|
+
@players.sort.should == [@player3, @player2, @player1]
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'pleiro_game/treasure_trove'
|
2
|
+
|
3
|
+
module PleiroGame
|
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
|
+
end
|
19
|
+
|
20
|
+
describe TreasureTrove do
|
21
|
+
|
22
|
+
it "has six treasures" do
|
23
|
+
TreasureTrove::TREASURES.count.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
|
+
|
58
|
+
end
|
metadata
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: pleiro_game
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Sean Livingston
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-01-21 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: Game. Easy. Run game running 'pleiro_game' from command line. Enjoy.
|
28
|
+
email: sean.d.livingston@gmail.com
|
29
|
+
executables:
|
30
|
+
- pleiro_game
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- LICENSE
|
35
|
+
- README
|
36
|
+
- bin/players.csv
|
37
|
+
- bin/pleiro_game
|
38
|
+
- lib/pleiro_game/auditable.rb
|
39
|
+
- lib/pleiro_game/berserk_player.rb
|
40
|
+
- lib/pleiro_game/clumsy_player.rb
|
41
|
+
- lib/pleiro_game/die.rb
|
42
|
+
- lib/pleiro_game/game.rb
|
43
|
+
- lib/pleiro_game/game_turn.rb
|
44
|
+
- lib/pleiro_game/loaded_die.rb
|
45
|
+
- lib/pleiro_game/playable.rb
|
46
|
+
- lib/pleiro_game/player.rb
|
47
|
+
- lib/pleiro_game/treasure_trove.rb
|
48
|
+
- spec/pleiro_game/berserk_player_spec.rb
|
49
|
+
- spec/pleiro_game/clumsy_player_spec.rb
|
50
|
+
- spec/pleiro_game/game_spec.rb
|
51
|
+
- spec/pleiro_game/player_spec.rb
|
52
|
+
- spec/pleiro_game/treasure_trove_spec.rb
|
53
|
+
homepage: http://gospelofjesusglory.com
|
54
|
+
licenses: []
|
55
|
+
metadata: {}
|
56
|
+
post_install_message:
|
57
|
+
rdoc_options: []
|
58
|
+
require_paths:
|
59
|
+
- lib
|
60
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
61
|
+
requirements:
|
62
|
+
- - ">="
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '1.9'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - ">="
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
requirements: []
|
71
|
+
rubyforge_project:
|
72
|
+
rubygems_version: 2.2.1
|
73
|
+
signing_key:
|
74
|
+
specification_version: 4
|
75
|
+
summary: Short Text Game With Treasures
|
76
|
+
test_files:
|
77
|
+
- spec/pleiro_game/clumsy_player_spec.rb
|
78
|
+
- spec/pleiro_game/player_spec.rb
|
79
|
+
- spec/pleiro_game/treasure_trove_spec.rb
|
80
|
+
- spec/pleiro_game/game_spec.rb
|
81
|
+
- spec/pleiro_game/berserk_player_spec.rb
|