PRAGMATIC-GEM 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/high_scores_revised.txt +11 -0
- data/bin/livecoding_fun.csv +5 -0
- data/bin/players.csv +5 -0
- data/bin/studio_game.rb +50 -0
- data/lib/studio_game/auditable.rb +10 -0
- data/lib/studio_game/berserk_player.rb +55 -0
- data/lib/studio_game/clumsy_player.rb +32 -0
- data/lib/studio_game/die.rb +22 -0
- data/lib/studio_game/game.rb +135 -0
- data/lib/studio_game/game_turn.rb +32 -0
- data/lib/studio_game/loaded_die.rb +18 -0
- data/lib/studio_game/playable.rb +19 -0
- data/lib/studio_game/player.rb +66 -0
- data/lib/studio_game/treasure_trove.rb +21 -0
- data/spec/studio_game/berserk_player_spec.rb +35 -0
- data/spec/studio_game/clumsy_player_spec.rb +37 -0
- data/spec/studio_game/game_spec.rb +54 -0
- data/spec/studio_game/player_spec.rb +141 -0
- data/spec/studio_game/treasure_trove_spec.rb +53 -0
- metadata +84 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA1:
|
|
3
|
+
metadata.gz: 775cdb5171fdcf191c288bab7744e20265642881
|
|
4
|
+
data.tar.gz: a2ebe72127be3ff3b196d0e50eed78bd2a7b506a
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: c163a9e91fbdb25416e7233d18f59d9e027e97e80664632a34dcdcd7adf341014a44ab4a5343fbb69231d38d7537eaa9388b61a128047c4d165565187f5a7480
|
|
7
|
+
data.tar.gz: 750f2b7365c59920665dcbb53cfe6dc07eda33efdc923f679525c87d9bc2c514906aef10cbb376eb85ee28f6103a20c7ae60a46b710aecb32ccd17764a974040
|
data/LICENSE
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
you have license to be sexylicious
|
data/README
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
hi you are reading me
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
Knuckleheads High Score
|
|
2
|
+
Berzie sanders...... 150
|
|
3
|
+
Curly............... 150
|
|
4
|
+
Larry............... 150
|
|
5
|
+
Moe................. 150
|
|
6
|
+
Linku............... 125
|
|
7
|
+
Livecodingsupport... 113
|
|
8
|
+
Nightfaust.......... 100
|
|
9
|
+
Klumz............... 100
|
|
10
|
+
Richriscunha........ 100
|
|
11
|
+
Kelvin_1............ 60
|
data/bin/players.csv
ADDED
data/bin/studio_game.rb
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
require_relative '../lib/studio_game/game'
|
|
5
|
+
require_relative '../lib/studio_game/player'
|
|
6
|
+
require_relative '../lib/studio_game/clumsy_player'
|
|
7
|
+
require_relative '../lib/studio_game/berserk_player'
|
|
8
|
+
|
|
9
|
+
player1 = StudioGame::Player.new("moe")
|
|
10
|
+
player2 = StudioGame::Player.new("larry")
|
|
11
|
+
player3 = StudioGame::Player.new("curly")
|
|
12
|
+
|
|
13
|
+
knuckleheads = StudioGame::Game.new("Knuckleheads")
|
|
14
|
+
default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
|
|
15
|
+
|
|
16
|
+
knuckleheads.load_players(ARGV.shift || default_player_file)
|
|
17
|
+
|
|
18
|
+
knuckleheads.add_player(player1)
|
|
19
|
+
knuckleheads.add_player(player2)
|
|
20
|
+
knuckleheads.add_player(player3)
|
|
21
|
+
|
|
22
|
+
clumsy_player1 = StudioGame::ClumsyPlayer.new("Klumz", 100)
|
|
23
|
+
knuckleheads.add_player(clumsy_player1)
|
|
24
|
+
|
|
25
|
+
berserk_player1 = StudioGame::BerserkPlayer.new("Berzie Sanders", 150)
|
|
26
|
+
knuckleheads.add_player(berserk_player1)
|
|
27
|
+
|
|
28
|
+
loop do
|
|
29
|
+
|
|
30
|
+
puts "\nHow many rounds would you like to play? ('quit' to exit)"
|
|
31
|
+
answer = gets.chomp.downcase
|
|
32
|
+
|
|
33
|
+
case answer
|
|
34
|
+
when /^\d+$/
|
|
35
|
+
knuckleheads.play(answer.to_i)
|
|
36
|
+
when 'quit', 'exit'
|
|
37
|
+
knuckleheads.print_stats
|
|
38
|
+
knuckleheads.save_high_scores
|
|
39
|
+
break
|
|
40
|
+
else
|
|
41
|
+
puts "Please enter a number or type quit to exit"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
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 woot
|
|
17
|
+
|
|
18
|
+
super
|
|
19
|
+
@woot_count += 1
|
|
20
|
+
|
|
21
|
+
if berserk?
|
|
22
|
+
puts "I'M BERSERK!!!!"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
if @woot_count == 4
|
|
26
|
+
puts "I'm about to go berserk...you won't like me when I'm berserk..."
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def blam
|
|
32
|
+
|
|
33
|
+
if berserk?
|
|
34
|
+
woot
|
|
35
|
+
else
|
|
36
|
+
super
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
if __FILE__ == $0
|
|
49
|
+
berserker = BerserkPlayer.new("berz", 50)
|
|
50
|
+
|
|
51
|
+
6.times {berserker.woot}
|
|
52
|
+
4.times {berserker.blam}
|
|
53
|
+
|
|
54
|
+
puts berserker.health
|
|
55
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require_relative 'player'
|
|
2
|
+
|
|
3
|
+
module StudioGame
|
|
4
|
+
|
|
5
|
+
class ClumsyPlayer < Player
|
|
6
|
+
|
|
7
|
+
def found_treasure(treasure)
|
|
8
|
+
damaged_treasure = Treasure.new(treasure.name, treasure.points / 2.0)
|
|
9
|
+
super(damaged_treasure)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
if __FILE__ == $0
|
|
18
|
+
clumsy = ClumsyPlayer.new("klutz")
|
|
19
|
+
|
|
20
|
+
hammer = Treasure.new(:hammer, 50)
|
|
21
|
+
clumsy.found_treasure(hammer)
|
|
22
|
+
clumsy.found_treasure(hammer)
|
|
23
|
+
clumsy.found_treasure(hammer)
|
|
24
|
+
|
|
25
|
+
crowbar = Treasure.new(:crowbar, 400)
|
|
26
|
+
clumsy.found_treasure(crowbar)
|
|
27
|
+
|
|
28
|
+
clumsy.each_found_treasure do |treasure|
|
|
29
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
|
30
|
+
end
|
|
31
|
+
puts "#{clumsy.points} grand total points"
|
|
32
|
+
end
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
require_relative 'player'
|
|
2
|
+
require_relative 'die'
|
|
3
|
+
require_relative 'game_turn'
|
|
4
|
+
require_relative 'treasure_trove'
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
module StudioGame
|
|
8
|
+
|
|
9
|
+
class Game
|
|
10
|
+
|
|
11
|
+
attr_accessor :title
|
|
12
|
+
|
|
13
|
+
def initialize(title)
|
|
14
|
+
@title = title
|
|
15
|
+
@players = []
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def add_player(player)
|
|
19
|
+
@players.push(player)
|
|
20
|
+
# puts @players
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def play(rounds)
|
|
24
|
+
puts "Let's play Knuckleheads!"
|
|
25
|
+
|
|
26
|
+
puts "\nLooks like we have #{@players.size} players this game:"
|
|
27
|
+
@players.each do |player|
|
|
28
|
+
formatted_name = player.name.ljust(20, '.')
|
|
29
|
+
puts "#{formatted_name} #{player.health} HP"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
treasures = TreasureTrove::TREASURES
|
|
33
|
+
puts "\nThere are #{treasures.count} treasures in the Treasure Trove:"
|
|
34
|
+
|
|
35
|
+
treasures.each do |treasure|
|
|
36
|
+
puts "A #{treasure.name} is worth #{treasure.points} HP"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
1.upto(rounds) do |round|
|
|
40
|
+
puts "\nRound #{round}:"
|
|
41
|
+
|
|
42
|
+
@players.each do |player|
|
|
43
|
+
GameTurn.take_turn(player)
|
|
44
|
+
puts "#{player}"
|
|
45
|
+
puts "\n"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def print_high_scores(player)
|
|
53
|
+
formatted_name = player.name.ljust(20, '.')
|
|
54
|
+
"#{formatted_name} #{player.score}"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def print_stats
|
|
58
|
+
puts "\n*** Knucklehead Statistics ***"
|
|
59
|
+
|
|
60
|
+
strong_players, wimpy_players = @players.partition { |player| player.strong? }
|
|
61
|
+
|
|
62
|
+
puts "\n#{strong_players.count} strong players:"
|
|
63
|
+
|
|
64
|
+
strong_players.each do |player|
|
|
65
|
+
puts "#{player.name} (#{player.health})"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
puts "\n#{wimpy_players.count} wimpy players:"
|
|
69
|
+
|
|
70
|
+
wimpy_players.each do |player|
|
|
71
|
+
puts "#{player.name} (#{player.health})"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
puts "\n#{title} Final Ranking:"
|
|
75
|
+
@players.sort.each do |player|
|
|
76
|
+
puts print_high_scores(player)
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
@players.each do |player|
|
|
80
|
+
puts "\n#{player.name}'s Point Breakdown"
|
|
81
|
+
player.each_found_treasure do |treasure|
|
|
82
|
+
puts "+ #{treasure.points} total #{treasure.name} points"
|
|
83
|
+
end
|
|
84
|
+
puts "= #{player.points} Treasure Points"
|
|
85
|
+
puts "+ #{player.health} HP"
|
|
86
|
+
puts "= #{player.score} Total Game Points"
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def print_name_and_health(player)
|
|
92
|
+
puts "#{player.name} (#{player.health}"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def load_players(file)
|
|
96
|
+
File.readlines(file).each do |line|
|
|
97
|
+
add_player(Player.from_csv(line))
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def save_high_scores(file="high_scores_revised.txt")
|
|
102
|
+
|
|
103
|
+
File.open(file, "w") do |file|
|
|
104
|
+
file.puts "#{@title} High Score"
|
|
105
|
+
|
|
106
|
+
@players.sort.each do |player|
|
|
107
|
+
file.puts print_high_scores(player)
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
end
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require_relative 'player'
|
|
2
|
+
require_relative 'die'
|
|
3
|
+
require_relative 'treasure_trove'
|
|
4
|
+
require_relative 'loaded_die'
|
|
5
|
+
|
|
6
|
+
module StudioGame
|
|
7
|
+
|
|
8
|
+
module GameTurn
|
|
9
|
+
def self.take_turn(player)
|
|
10
|
+
die = Die.new
|
|
11
|
+
|
|
12
|
+
case die.roll
|
|
13
|
+
when 1..2
|
|
14
|
+
player.blam
|
|
15
|
+
when 3..4
|
|
16
|
+
puts "The Great Die chose to ignore #{player.name}..."
|
|
17
|
+
else 5..6
|
|
18
|
+
player.woot
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
treasure = TreasureTrove.random
|
|
24
|
+
|
|
25
|
+
player.found_treasure(treasure)
|
|
26
|
+
# puts "#{player.name} found a #{treasure.name} worth #{treasure.points} points."
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module StudioGame
|
|
2
|
+
|
|
3
|
+
module Playable
|
|
4
|
+
def woot
|
|
5
|
+
@health += 10
|
|
6
|
+
puts "The Great Die wooted #{@name}! #{@name}'s health is now #{@health}! :-)"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def blam
|
|
10
|
+
@health -= 10
|
|
11
|
+
puts "The Great Die blammed #{@name}! #{@name}'s health is now #{@health} :("
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def strong?
|
|
15
|
+
@health > 100
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
require_relative 'treasure_trove'
|
|
2
|
+
require_relative 'playable'
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
module StudioGame
|
|
6
|
+
|
|
7
|
+
class Player
|
|
8
|
+
|
|
9
|
+
include Playable
|
|
10
|
+
|
|
11
|
+
attr_accessor :health, :name
|
|
12
|
+
|
|
13
|
+
def initialize(name, health = 150)
|
|
14
|
+
@name = name.capitalize
|
|
15
|
+
@health = health
|
|
16
|
+
@found_treasures = Hash.new(0)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def to_s
|
|
20
|
+
"#{@name} has #{@health}HP & #{points} Treasure pts for a total of #{score}GP"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def <=>(other)
|
|
24
|
+
other.score <=> score
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def points
|
|
28
|
+
@found_treasures.values.reduce(0, :+)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def score
|
|
32
|
+
@health + points
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def found_treasure(treasure)
|
|
36
|
+
@found_treasures[treasure.name] += treasure.points
|
|
37
|
+
puts "#{@name} then found a #{treasure.name} - that's worth #{treasure.points}pts!"
|
|
38
|
+
puts "#{@name}'s treasure chest (#{@found_treasures}) is now worth #{@found_treasures.values.reduce(:+)}pts"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def each_found_treasure
|
|
42
|
+
@found_treasures.each do |name, points|
|
|
43
|
+
yield Treasure.new(name, points)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def self.from_csv(string)
|
|
48
|
+
name, health = string.split(',')
|
|
49
|
+
player = Player.new(name, Integer(health))
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
if __FILE__ == $0
|
|
59
|
+
player = 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
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module StudioGame
|
|
2
|
+
|
|
3
|
+
Treasure = Struct.new(:name, :points)
|
|
4
|
+
|
|
5
|
+
module TreasureTrove
|
|
6
|
+
TREASURES = [
|
|
7
|
+
Treasure.new(:pie, 5),
|
|
8
|
+
Treasure.new(:bottle, 25),
|
|
9
|
+
Treasure.new(:hammer, 50),
|
|
10
|
+
Treasure.new(:skillet, 100),
|
|
11
|
+
Treasure.new(:broomstick, 200),
|
|
12
|
+
Treasure.new(:crowbar, 400)
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
def self.random
|
|
16
|
+
TREASURES.sample
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'studio_game/berserk_player'
|
|
2
|
+
|
|
3
|
+
module StudioGame
|
|
4
|
+
|
|
5
|
+
describe BerserkPlayer do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@initial_health = 50
|
|
9
|
+
@player = BerserkPlayer.new("berz", @initial_health)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "does not go berserk if wooted 5 or less times" do
|
|
13
|
+
|
|
14
|
+
1.upto(5) {@player.woot}
|
|
15
|
+
|
|
16
|
+
expect(@player.berserk?).to eq(false)
|
|
17
|
+
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "goes berserk if wooted 6+ times" do
|
|
21
|
+
1.upto(6) {@player.woot}
|
|
22
|
+
|
|
23
|
+
expect(@player.berserk?).to eq(true)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "gets wooted insted of blammed when berserk" do
|
|
27
|
+
1.upto(6) {@player.woot}
|
|
28
|
+
1.upto(2) {@player.blam}
|
|
29
|
+
|
|
30
|
+
expect(@player.health).to eq(@initial_health + (8 * 10))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
require 'studio_game/clumsy_player'
|
|
2
|
+
|
|
3
|
+
module StudioGame
|
|
4
|
+
|
|
5
|
+
describe ClumsyPlayer do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@player = ClumsyPlayer.new("klutz")
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
it "only gets half the point value for each treasure" do
|
|
12
|
+
|
|
13
|
+
expect(@player.points).to eq(0)
|
|
14
|
+
|
|
15
|
+
hammer = Treasure.new(:hammer, 50)
|
|
16
|
+
@player.found_treasure(hammer)
|
|
17
|
+
@player.found_treasure(hammer)
|
|
18
|
+
@player.found_treasure(hammer)
|
|
19
|
+
|
|
20
|
+
expect(@player.points).to eq(75)
|
|
21
|
+
|
|
22
|
+
crowbar = Treasure.new(:crowbar, 400)
|
|
23
|
+
@player.found_treasure(crowbar)
|
|
24
|
+
|
|
25
|
+
expect(@player.points).to eq(275)
|
|
26
|
+
|
|
27
|
+
yielded = []
|
|
28
|
+
@player.each_found_treasure do |treasure|
|
|
29
|
+
yielded << treasure
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
expect(yielded).to eq([Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)])
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
require 'studio_game/game'
|
|
2
|
+
# require_relative 'die'
|
|
3
|
+
|
|
4
|
+
module StudioGame
|
|
5
|
+
|
|
6
|
+
describe Game do
|
|
7
|
+
before do
|
|
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 "woots player if 5 or 6 rolled" do
|
|
17
|
+
|
|
18
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(5)
|
|
19
|
+
|
|
20
|
+
@game.play(2)
|
|
21
|
+
|
|
22
|
+
expect(@player.health).to eq(@initial_health + (10*2))
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
it "does nothing if 3 or 4 is rolled" do
|
|
26
|
+
|
|
27
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(3)
|
|
28
|
+
|
|
29
|
+
@game.play(2)
|
|
30
|
+
|
|
31
|
+
expect(@player.health).to eq(@initial_health)
|
|
32
|
+
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "blams player if 1 or 2 is rolled" do
|
|
36
|
+
|
|
37
|
+
allow_any_instance_of(Die).to receive(:roll).and_return(1)
|
|
38
|
+
|
|
39
|
+
@game.play(2)
|
|
40
|
+
|
|
41
|
+
expect(@player.health).to eq(@initial_health - (10*2))
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# its "prints out each treasure a player has" do
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
# If a low number (1 or 2) is rolled, we'll blam the player because low rollers aren't very lucky.
|
|
53
|
+
# If a medium number (3 or 4) is rolled, we'll skip the player—we won't change their health value. Instead, we'll print out something like "Curly was skipped."
|
|
54
|
+
# If a high number (5 or 6) is rolled, we'll w00t the player (high fives for the high rollers!)
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
require 'studio_game/player'
|
|
2
|
+
|
|
3
|
+
module StudioGame
|
|
4
|
+
|
|
5
|
+
describe Player do
|
|
6
|
+
|
|
7
|
+
before do
|
|
8
|
+
@initial_health = 150
|
|
9
|
+
@player = Player.new("larry", @initial_health)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
it "has a capitalized name" do
|
|
13
|
+
expect(@player.name).to eq("Larry")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
it "has an initial health" do
|
|
17
|
+
expect(@player.health).to eq(150)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
it "has a string representation" do
|
|
21
|
+
expect(@player.to_s).to eq("Larry has 150HP & 0 Treasure pts for a total of 150GP")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
it "increases health by 10 when wooted" do
|
|
25
|
+
@player.woot
|
|
26
|
+
@player.health
|
|
27
|
+
|
|
28
|
+
expect(@player.health).to eq(160)
|
|
29
|
+
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
it "decreases health by 10 when blammed" do
|
|
33
|
+
@player.blam
|
|
34
|
+
@player.health
|
|
35
|
+
|
|
36
|
+
expect(@player.health).to eq(140)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
context "with a health greater than 100" do
|
|
40
|
+
before do
|
|
41
|
+
@player = Player.new("larry", 150)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
it "is strong" do
|
|
45
|
+
expect(@player.strong?).to eq(true)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
context "with a health less than or eq to 100" do
|
|
51
|
+
before do
|
|
52
|
+
@player = Player.new("larry", 100)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
it "is wimpy" do
|
|
56
|
+
# expect(@player.strong?).to eq(false)
|
|
57
|
+
expect(@player).not_to be_strong
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
context "in a collection of players" do
|
|
63
|
+
|
|
64
|
+
before do
|
|
65
|
+
@player1 = Player.new("moe", 100)
|
|
66
|
+
@player2 = Player.new("larry", 200)
|
|
67
|
+
@player3 = Player.new("curly", 300)
|
|
68
|
+
|
|
69
|
+
@players = [@player1, @player2, @player3]
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
it "is sorted by decreasing score" do
|
|
74
|
+
expect(@players.sort).to eq([@player3, @player2, @player1])
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
it "computes points as the sum of all treasure and health points" do
|
|
80
|
+
|
|
81
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
82
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
83
|
+
|
|
84
|
+
expect(@player.score).to eq(250)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
it "returns each of players treasure objects" do
|
|
88
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
|
89
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
|
90
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
|
91
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
|
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
|
+
|
|
97
|
+
yielded = []
|
|
98
|
+
@player.each_found_treasure do |treasure|
|
|
99
|
+
yielded << treasure
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
expect(yielded).to eq([
|
|
103
|
+
Treasure.new(:skillet, 200),
|
|
104
|
+
Treasure.new(:hammer, 50),
|
|
105
|
+
Treasure.new(:bottle, 25)
|
|
106
|
+
])
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
it "creates a player from csv" do
|
|
111
|
+
|
|
112
|
+
player = Player.from_csv("larry,150")
|
|
113
|
+
|
|
114
|
+
expect(player.name).to eq("Larry")
|
|
115
|
+
expect(player.health).to eq(150)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
|
|
@@ -0,0 +1,53 @@
|
|
|
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
|
+
expect(@treasure.name).to eq(:hammer)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
it "has a points attribute" do
|
|
16
|
+
expect(@treasure.points).to eq(50)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
describe TreasureTrove do
|
|
22
|
+
|
|
23
|
+
it "has six treasures" do
|
|
24
|
+
expect(TreasureTrove::TREASURES.size).to eq(6)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
it "has a pie worth 5 points" do
|
|
28
|
+
expect(TreasureTrove::TREASURES[0]).to eq(Treasure.new(:pie, 5))
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
it "has a bottle worth 25 points" do
|
|
32
|
+
expect(TreasureTrove::TREASURES[1]).to eq(Treasure.new(:bottle, 25))
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
it "has a hammer worth 50 points" do
|
|
36
|
+
expect(TreasureTrove::TREASURES[2]).to eq(Treasure.new(:hammer, 50))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
it "has a skillet worth 100 points" do
|
|
40
|
+
expect(TreasureTrove::TREASURES[3]).to eq(Treasure.new(:skillet, 100))
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
it "has a broomstick worth 200 points" do
|
|
44
|
+
expect(TreasureTrove::TREASURES[4]).to eq(Treasure.new(:broomstick, 200))
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
it "has a crowbar worth 400 points" do
|
|
48
|
+
expect(TreasureTrove::TREASURES[5]).to eq(Treasure.new(:crowbar, 400))
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: PRAGMATIC-GEM
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: '1'
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- ALEX
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2015-12-19 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: hi you are reading me
|
|
28
|
+
email: alexgpark@gmail.com
|
|
29
|
+
executables:
|
|
30
|
+
- studio_game.rb
|
|
31
|
+
extensions: []
|
|
32
|
+
extra_rdoc_files: []
|
|
33
|
+
files:
|
|
34
|
+
- LICENSE
|
|
35
|
+
- README
|
|
36
|
+
- bin/high_scores_revised.txt
|
|
37
|
+
- bin/livecoding_fun.csv
|
|
38
|
+
- bin/players.csv
|
|
39
|
+
- bin/studio_game.rb
|
|
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/treasure_trove.rb
|
|
50
|
+
- spec/studio_game/berserk_player_spec.rb
|
|
51
|
+
- spec/studio_game/clumsy_player_spec.rb
|
|
52
|
+
- spec/studio_game/game_spec.rb
|
|
53
|
+
- spec/studio_game/player_spec.rb
|
|
54
|
+
- spec/studio_game/treasure_trove_spec.rb
|
|
55
|
+
homepage: http://www.alexgpark.com
|
|
56
|
+
licenses:
|
|
57
|
+
- MIT
|
|
58
|
+
metadata: {}
|
|
59
|
+
post_install_message:
|
|
60
|
+
rdoc_options: []
|
|
61
|
+
require_paths:
|
|
62
|
+
- lib
|
|
63
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '1.9'
|
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
69
|
+
requirements:
|
|
70
|
+
- - ">="
|
|
71
|
+
- !ruby/object:Gem::Version
|
|
72
|
+
version: '0'
|
|
73
|
+
requirements: []
|
|
74
|
+
rubyforge_project:
|
|
75
|
+
rubygems_version: 2.4.8
|
|
76
|
+
signing_key:
|
|
77
|
+
specification_version: 4
|
|
78
|
+
summary: This is the completed game I created for the Pragmatic Course
|
|
79
|
+
test_files:
|
|
80
|
+
- spec/studio_game/berserk_player_spec.rb
|
|
81
|
+
- spec/studio_game/clumsy_player_spec.rb
|
|
82
|
+
- spec/studio_game/game_spec.rb
|
|
83
|
+
- spec/studio_game/player_spec.rb
|
|
84
|
+
- spec/studio_game/treasure_trove_spec.rb
|