sharts_studio_game 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.
- data/LICENSE +1 -0
- data/README +1 -0
- data/bin/studio_game +99 -0
- data/bin/villians.csv +4 -0
- data/bin/wrestlers.csv +4 -0
- data/lib/studio_game/Auditable.rb +7 -0
- data/lib/studio_game/Clumsy_player.rb +60 -0
- data/lib/studio_game/Die.rb +15 -0
- data/lib/studio_game/Game.rb +121 -0
- data/lib/studio_game/Game_turn.rb +23 -0
- data/lib/studio_game/Playable.rb +18 -0
- data/lib/studio_game/Player.rb +69 -0
- data/lib/studio_game/berserk_player.rb +41 -0
- data/lib/studio_game/loaded_die.rb +16 -0
- data/lib/studio_game/sorting.rb +10 -0
- data/lib/studio_game/treasure_trove.rb +19 -0
- data/spec/studio_game/Game_spec.rb +65 -0
- data/spec/studio_game/Player_spec.rb +137 -0
- data/spec/studio_game/berserker_spec.rb +32 -0
- data/spec/studio_game/clumsy_player_spec.rb +53 -0
- data/spec/studio_game/treasure_trove_spec.rb +56 -0
- metadata +82 -0
data/LICENSE
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Have at it, ladies and gentleman.
|
data/README
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
A game that was created to practice Ruby.
|
data/bin/studio_game
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# name1 = 'larry'
|
4
|
+
# health1 = 60
|
5
|
+
# name2 = 'curly'
|
6
|
+
# health2 = 125
|
7
|
+
# name3 = 'moe'
|
8
|
+
# health3 = '100'
|
9
|
+
# name4 = 'shemp'
|
10
|
+
# health4 = 90
|
11
|
+
|
12
|
+
|
13
|
+
# puts "#{name1.capitalize} has a health of #{health1}"
|
14
|
+
# puts "#{name2.upcase} has a health of #{health2}"
|
15
|
+
|
16
|
+
# health2 = health1
|
17
|
+
# puts "#{name2.upcase} has a health of #{health2}"
|
18
|
+
|
19
|
+
# health1 = 30
|
20
|
+
# puts "#{name1.capitalize} has a health of #{health1}"
|
21
|
+
# puts "#{name2.upcase} has a health of #{health2}"
|
22
|
+
|
23
|
+
# puts "#{name3.capitalize} has a health of #{health3}".center(60, '*')
|
24
|
+
|
25
|
+
# text = "#{name3.capitalize} has a health of #{health3}"
|
26
|
+
# puts text.center(60, '*')
|
27
|
+
|
28
|
+
|
29
|
+
# puts "#{name4.capitalize.ljust(20, '.')} #{health4} health"
|
30
|
+
|
31
|
+
# text = name4.capitalize.ljust(20, '.')
|
32
|
+
# puts "#{text} #{health4} health"
|
33
|
+
|
34
|
+
# current_time = Time.new
|
35
|
+
# formatted_time = current_time.strftime("%A %m/%d/%y at %I:%M")
|
36
|
+
# puts "The game started on #{formatted_time}"
|
37
|
+
|
38
|
+
# METHODS
|
39
|
+
|
40
|
+
# def time
|
41
|
+
# current_time = Time.new
|
42
|
+
# current_time.strftime("%l:%M:%S")
|
43
|
+
# end
|
44
|
+
|
45
|
+
# def say_hello(name, health=100)
|
46
|
+
# "I'm #{name.capitalize} with a health of #{health} as of #{time}."
|
47
|
+
# end
|
48
|
+
|
49
|
+
# puts say_hello("larry", 60)
|
50
|
+
# puts say_hello("curly", 125)
|
51
|
+
# puts say_hello("moe")
|
52
|
+
# puts say_hello("shemp", 90)
|
53
|
+
|
54
|
+
require_relative '../lib/studio_game/Player'
|
55
|
+
require_relative '../lib/studio_game/Game'
|
56
|
+
require_relative '../lib/studio_game/Clumsy_player'
|
57
|
+
require_relative '../lib/studio_game/berserk_player'
|
58
|
+
|
59
|
+
# player1 = Player.new("Jon", 30)
|
60
|
+
# player2 = Player.new("Chris", 40)
|
61
|
+
# player3 = Player.new("rick", 50)
|
62
|
+
# player4 = Player.new("skeletor", 55)
|
63
|
+
|
64
|
+
game1 = StudioGame::Game.new("'Sharting: The Game'")
|
65
|
+
|
66
|
+
default_player_file = File.join(File.dirname(__FILE__),'villians.csv')
|
67
|
+
game1.load_players(ARGV.shift || default_player_file)
|
68
|
+
|
69
|
+
clumsyplayer1 = StudioGame::ClumsyPlayer.new("Ferguson", 105, 1)
|
70
|
+
berserkplayer1 = StudioGame::BerserkPlayer.new("Balrog", 100)
|
71
|
+
# game1.add_player(clumsyplayer1)
|
72
|
+
# game1.add_player(berserkplayer1)
|
73
|
+
|
74
|
+
loop do
|
75
|
+
puts "\nHow many rounds shall we play? (to exit, enter 'quit')"
|
76
|
+
answer = gets.chomp.downcase
|
77
|
+
case answer
|
78
|
+
when /^\d+$/
|
79
|
+
puts "#{answer} rounds comin' right up!"
|
80
|
+
game1.play(answer.to_i)
|
81
|
+
when 'quit', 'exit'
|
82
|
+
game1.print_stats
|
83
|
+
# loop do
|
84
|
+
# puts "Would you like to save this game? (yes, no)"
|
85
|
+
# case gets
|
86
|
+
# when 'yes'
|
87
|
+
# puts 'You got it.'
|
88
|
+
# game1.save_high_scores
|
89
|
+
# when 'no'
|
90
|
+
# puts 'Bye bye.'
|
91
|
+
# end
|
92
|
+
# end
|
93
|
+
break
|
94
|
+
else
|
95
|
+
puts "Wrong answer. Enter a number or 'quit'"
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
game1.save_high_scores
|
data/bin/villians.csv
ADDED
data/bin/wrestlers.csv
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
require_relative 'player'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
class ClumsyPlayer < Player
|
5
|
+
|
6
|
+
attr_reader :boost
|
7
|
+
|
8
|
+
def found_treasure(treasure)
|
9
|
+
# points = treasure.points / 2
|
10
|
+
# @found_treasures[treasure.name] += points
|
11
|
+
# puts "#{@name} found a #{treasure.name} worth #{points} points."
|
12
|
+
# puts "#{@name}'s treasures: #{@found_treasures}"
|
13
|
+
damaged_treasure = Treasure.new(treasure.name, treasure.points/2)
|
14
|
+
super(damaged_treasure)
|
15
|
+
end
|
16
|
+
|
17
|
+
def initialize (name, health=100, boost=1)
|
18
|
+
super(name, health)
|
19
|
+
@boost = boost
|
20
|
+
@times_sharted = 0
|
21
|
+
end
|
22
|
+
|
23
|
+
def high_five
|
24
|
+
@boost.times{super}
|
25
|
+
end
|
26
|
+
|
27
|
+
def rage?
|
28
|
+
@times_sharted > 5
|
29
|
+
end
|
30
|
+
|
31
|
+
def shart
|
32
|
+
@times_sharted += 1
|
33
|
+
if rage?
|
34
|
+
puts "#{@name} is raging!"
|
35
|
+
high_five
|
36
|
+
else
|
37
|
+
super
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
if __FILE__ == $0
|
44
|
+
clumsy = ClumsyPlayer.new("klutz",80,2)
|
45
|
+
|
46
|
+
hammer = Treasure.new(:hammer, 50)
|
47
|
+
clumsy.found_treasure(hammer)
|
48
|
+
clumsy.found_treasure(hammer)
|
49
|
+
clumsy.found_treasure(hammer)
|
50
|
+
|
51
|
+
crowbar = Treasure.new(:crowbar, 400)
|
52
|
+
clumsy.found_treasure(crowbar)
|
53
|
+
puts clumsy.health
|
54
|
+
clumsy.high_five
|
55
|
+
puts clumsy.health
|
56
|
+
clumsy.each_treasure_found do |treasure|
|
57
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
58
|
+
end
|
59
|
+
puts "#{clumsy.points} grand total points"
|
60
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
require_relative 'Player'
|
2
|
+
require_relative 'Die'
|
3
|
+
require_relative 'game_turn'
|
4
|
+
require_relative 'treasure_trove'
|
5
|
+
require 'csv'
|
6
|
+
|
7
|
+
module StudioGame
|
8
|
+
class Game
|
9
|
+
|
10
|
+
attr_reader :title
|
11
|
+
|
12
|
+
def initialize(title)
|
13
|
+
@title = title
|
14
|
+
@players = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def load_players(from_file="bin/villians.csv")
|
18
|
+
CSV.foreach(ARGV.shift || from_file) do |row|
|
19
|
+
player = Player.new(row[0], row[1].to_i)
|
20
|
+
add_player(player)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def add_player (a_player)
|
25
|
+
@players.push(a_player)
|
26
|
+
end
|
27
|
+
|
28
|
+
def play(rounds)
|
29
|
+
1.upto(rounds) do |round|
|
30
|
+
puts "\nROUND #{round}"
|
31
|
+
puts "\nThere are #{@players.count} lactose-intolerant players in #{@title}. \nLet's drink some milk!"
|
32
|
+
@players.each do |b|
|
33
|
+
puts b
|
34
|
+
end
|
35
|
+
|
36
|
+
treasures = TreasureTrove::TREASURES
|
37
|
+
puts "\nThere are #{treasures.size} treasures to be found:"
|
38
|
+
treasures.each do |t|
|
39
|
+
puts "A #{t.name} is worth #{t.points} points."
|
40
|
+
end
|
41
|
+
|
42
|
+
puts "\n"
|
43
|
+
@players.each do |b|
|
44
|
+
GameTurn.take_turn(b)
|
45
|
+
puts b.follow_up
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def print_name_and_health(player)
|
52
|
+
puts "#{player.name} (#{player.health})"
|
53
|
+
end
|
54
|
+
|
55
|
+
def high_score_entry(player)
|
56
|
+
formatted_name = player.name.ljust(25,'.')
|
57
|
+
"#{formatted_name}#{player.score}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def save_high_scores(to_file="high_scores.txt")
|
61
|
+
File.open(to_file, "w") do |file|
|
62
|
+
file.puts "#{@title} - High Scores:"
|
63
|
+
@players.sort.each do |b|
|
64
|
+
file.puts high_score_entry(b)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def print_stats
|
70
|
+
puts "\n#{@title} Statistics:"
|
71
|
+
puts "\n"
|
72
|
+
strong, wimpy = @players.partition { |p| p.strong? }
|
73
|
+
|
74
|
+
puts "There are #{strong.size} strong players that don't shart that often:"
|
75
|
+
strong.sort.each do |b|
|
76
|
+
print_name_and_health(b)
|
77
|
+
end
|
78
|
+
|
79
|
+
puts "\nThere are #{wimpy.size} wimpy players that shart on a regular basis:"
|
80
|
+
wimpy.sort.each do |b|
|
81
|
+
print_name_and_health(b)
|
82
|
+
end
|
83
|
+
|
84
|
+
puts "\n#{title} High Scores:"
|
85
|
+
@players.sort.each do |b|
|
86
|
+
high_score_entry(b)
|
87
|
+
end
|
88
|
+
|
89
|
+
@players.each do |b|
|
90
|
+
puts "\n#{b.name}'s point totals:"
|
91
|
+
b.each_treasure_found do |t|
|
92
|
+
puts "#{t.points} total #{t.name} points"
|
93
|
+
end
|
94
|
+
puts "#{b.points} grand total points"
|
95
|
+
end
|
96
|
+
|
97
|
+
puts "\nTotal Points Possible: #{total_points}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def total_points
|
101
|
+
@players.reduce(0) { |sum, player| sum + player.points}
|
102
|
+
# all_points = @players.map { |player| player.points}
|
103
|
+
# @players.map(&:points).inject(&:+)
|
104
|
+
# @players.inject(0) { |sum, player| sum + player.points}
|
105
|
+
#& = Proc.new{}
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
109
|
+
|
110
|
+
if __FILE__ == $0
|
111
|
+
playera = Player.new("Sonic", 80)
|
112
|
+
playerb = Player.new("Tails", 70)
|
113
|
+
playerc = Player.new("Robotnik", 90)
|
114
|
+
|
115
|
+
game1 = Game.new("'Sharting: Sonic and Friends'")
|
116
|
+
game1.add_player(playera)
|
117
|
+
game1.add_player(playerb)
|
118
|
+
game1.add_player(playerc)
|
119
|
+
game1.play(2)
|
120
|
+
game1.print_stats
|
121
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require_relative 'Player'
|
2
|
+
require_relative 'die'
|
3
|
+
require_relative 'treasure_trove'
|
4
|
+
require_relative 'loaded_die'
|
5
|
+
|
6
|
+
module StudioGame
|
7
|
+
module GameTurn
|
8
|
+
def self.take_turn(b)
|
9
|
+
die = Die.new
|
10
|
+
case die.roll
|
11
|
+
when 1..2
|
12
|
+
b.shart
|
13
|
+
when 3..4
|
14
|
+
puts "#{b.name} kept cool and didn't shart."
|
15
|
+
else
|
16
|
+
b.high_five
|
17
|
+
end
|
18
|
+
|
19
|
+
treasure = TreasureTrove.random
|
20
|
+
b.found_treasure(treasure)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module StudioGame
|
2
|
+
module Playable
|
3
|
+
def shart
|
4
|
+
puts "#{name} sharted! How embarassing!"
|
5
|
+
self.health -= 10
|
6
|
+
end
|
7
|
+
|
8
|
+
def high_five
|
9
|
+
puts "#{name} just got a high-five! Awesome!"
|
10
|
+
self.health += 15
|
11
|
+
end
|
12
|
+
|
13
|
+
def strong?
|
14
|
+
health > 100
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
# name was an instance variable (@name) that was changed to name. self.health is necessary because the attribute is assigned a value
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require_relative 'treasure_trove'
|
2
|
+
require_relative 'Playable'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
class Player
|
6
|
+
|
7
|
+
attr_accessor :health, :name
|
8
|
+
|
9
|
+
include Playable
|
10
|
+
|
11
|
+
def score
|
12
|
+
@health + points
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.from_csv(string)
|
16
|
+
name, health = string.split(",")
|
17
|
+
new(name, Integer(health))
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(name, health=100)
|
21
|
+
@name = name.capitalize
|
22
|
+
@health = health
|
23
|
+
@found_treasures = Hash.new(0)
|
24
|
+
end
|
25
|
+
|
26
|
+
def found_treasure(treasure)
|
27
|
+
@found_treasures[treasure.name] += treasure.points
|
28
|
+
puts "#{@name} found a #{treasure.name} worth #{treasure.points} points."
|
29
|
+
puts "#{@name}'s treasures: #{@found_treasures}"
|
30
|
+
end
|
31
|
+
|
32
|
+
def points
|
33
|
+
@found_treasures.values.reduce(0, :+)
|
34
|
+
end
|
35
|
+
|
36
|
+
def to_s
|
37
|
+
"I'm #{@name} with a health of #{@health} and a score of #{score}."
|
38
|
+
end
|
39
|
+
|
40
|
+
def follow_up
|
41
|
+
"(Now #{@name} has a health of #{@health} and a score of #{score}.)"
|
42
|
+
end
|
43
|
+
|
44
|
+
def <=>(other)
|
45
|
+
other.score <=> score
|
46
|
+
end
|
47
|
+
|
48
|
+
def each_treasure_found
|
49
|
+
@found_treasures.each do |name, points|
|
50
|
+
yield Treasure.new(name, points)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
if __FILE__ == $0
|
56
|
+
|
57
|
+
player1 = Player.new("Skeletor",1000)
|
58
|
+
puts player1.name
|
59
|
+
puts player1.health
|
60
|
+
player1.shart
|
61
|
+
player1.high_five
|
62
|
+
player1.high_five
|
63
|
+
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
# def status
|
68
|
+
# hit? ? "Hit" : "Flop"
|
69
|
+
# end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require_relative 'Player'
|
2
|
+
require_relative 'game'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
class BerserkPlayer < Player
|
6
|
+
|
7
|
+
def initialize (name, health=100)
|
8
|
+
super(name, health)
|
9
|
+
@high_fived = 0
|
10
|
+
end
|
11
|
+
|
12
|
+
def berserk?
|
13
|
+
@high_fived > 5
|
14
|
+
end
|
15
|
+
|
16
|
+
def high_five
|
17
|
+
super
|
18
|
+
@high_fived += 1
|
19
|
+
puts "Holy shit! #{@name} is in berserker mode!" if berserk?
|
20
|
+
end
|
21
|
+
|
22
|
+
def shart
|
23
|
+
if berserk?
|
24
|
+
high_five
|
25
|
+
else
|
26
|
+
super
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
|
34
|
+
if __FILE__ == $0
|
35
|
+
player1 = BerserkPlayer.new("Balrog", 100)
|
36
|
+
game1 = Game.new("Practice Game")
|
37
|
+
game1.add_player(player1)
|
38
|
+
6.times {player1.high_five}
|
39
|
+
3.times {player1.shart}
|
40
|
+
puts player1.health
|
41
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module StudioGame
|
2
|
+
Treasure = Struct.new(:name, :points)
|
3
|
+
|
4
|
+
module TreasureTrove
|
5
|
+
TREASURES = [
|
6
|
+
Treasure.new(:sandpaper, 5),
|
7
|
+
Treasure.new(:leaf, 25),
|
8
|
+
Treasure.new("sqaure of TP", 50),
|
9
|
+
Treasure.new(:buttwipe, 100),
|
10
|
+
Treasure.new(:diaper, 200),
|
11
|
+
Treasure.new("clean pair of briefs", 500)
|
12
|
+
]
|
13
|
+
def self.random
|
14
|
+
TREASURES.sample
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
#puts TreasureTrove.random
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'studio_game/Game'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
describe Game do
|
5
|
+
before do
|
6
|
+
$stdout = StringIO.new
|
7
|
+
@game = Game.new("Sharting: Mario Bros. Edition")
|
8
|
+
|
9
|
+
@initial_health = 100
|
10
|
+
@player = Player.new("mario", @initial_health)
|
11
|
+
|
12
|
+
@game.add_player(@player)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "high fives a player if 5 or 6 is rolled" do
|
16
|
+
Die.any_instance.stub(:roll).and_return(5)
|
17
|
+
|
18
|
+
@game.play(2)
|
19
|
+
|
20
|
+
@player.health.should == @initial_health + (15 * 2)
|
21
|
+
end
|
22
|
+
it "skips a player if a 3 or 4 is rolled" do
|
23
|
+
Die.any_instance.stub(:roll).and_return(3)
|
24
|
+
|
25
|
+
@game.play(2)
|
26
|
+
|
27
|
+
@player.health.should == @initial_health
|
28
|
+
end
|
29
|
+
|
30
|
+
it "sharts player if a 1 or 2 is rolled" do
|
31
|
+
Die.any_instance.stub(:roll).and_return(1)
|
32
|
+
|
33
|
+
@game.play(2)
|
34
|
+
|
35
|
+
@player.health.should == @initial_health - (10 * 2)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "assigns a treasure for points during a player's turn" do
|
39
|
+
game = Game.new("Knuckleheads")
|
40
|
+
player = Player.new("moe")
|
41
|
+
|
42
|
+
game.add_player(player)
|
43
|
+
|
44
|
+
game.play(1)
|
45
|
+
|
46
|
+
player.points.should_not be_zero
|
47
|
+
end
|
48
|
+
|
49
|
+
it "computes total points as the sum of all player points" do
|
50
|
+
game = Game.new("Knuckleheads")
|
51
|
+
|
52
|
+
player1 = Player.new("moe")
|
53
|
+
player2 = Player.new("larry")
|
54
|
+
|
55
|
+
game.add_player(player1)
|
56
|
+
game.add_player(player2)
|
57
|
+
|
58
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
59
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
60
|
+
player2.found_treasure(Treasure.new(:crowbar, 400))
|
61
|
+
|
62
|
+
game.total_points.should == 500
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,137 @@
|
|
1
|
+
require 'studio_game/Player'
|
2
|
+
require 'studio_game/treasure_trove'
|
3
|
+
|
4
|
+
module StudioGame
|
5
|
+
describe Player do
|
6
|
+
|
7
|
+
before do
|
8
|
+
@initial_health = 100
|
9
|
+
@player = Player.new("goro", @initial_health)
|
10
|
+
$stdout = StringIO.new
|
11
|
+
end
|
12
|
+
|
13
|
+
|
14
|
+
it "has a capitalized name" do
|
15
|
+
|
16
|
+
@player.name.should == "Goro"
|
17
|
+
end
|
18
|
+
it "has an initial health" do
|
19
|
+
|
20
|
+
@player.health.should == 100
|
21
|
+
end
|
22
|
+
it "has a string representation" do
|
23
|
+
|
24
|
+
@player.to_s.should == "I'm Goro with a health of 100 and a score of 100."
|
25
|
+
end
|
26
|
+
|
27
|
+
it "computes a score by adding health and points" do
|
28
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
29
|
+
|
30
|
+
@player.score.should == 150
|
31
|
+
end
|
32
|
+
|
33
|
+
it "subtracts 10 from health when player sharts" do
|
34
|
+
|
35
|
+
@player.shart
|
36
|
+
|
37
|
+
@player.health.should == @initial_health - 10
|
38
|
+
end
|
39
|
+
|
40
|
+
it "adds 15 to health when player gets high five" do
|
41
|
+
|
42
|
+
@player.high_five
|
43
|
+
|
44
|
+
@player.health.should == @initial_health + 15
|
45
|
+
end
|
46
|
+
|
47
|
+
context "player has health of more than 100" do
|
48
|
+
|
49
|
+
before do
|
50
|
+
@player = Player.new("rick", 150)
|
51
|
+
end
|
52
|
+
|
53
|
+
it "is strong" do
|
54
|
+
|
55
|
+
@player.should be_strong
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
context "player has health less than or equal to 100" do
|
61
|
+
|
62
|
+
before do
|
63
|
+
|
64
|
+
@player = Player.new("rick", 100)
|
65
|
+
end
|
66
|
+
|
67
|
+
it "is wimpy" do
|
68
|
+
|
69
|
+
@player.should_not be_strong
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
context "in a collection of players" do
|
75
|
+
|
76
|
+
before do
|
77
|
+
|
78
|
+
@player1 = Player.new("rick", 100)
|
79
|
+
@player2 = Player.new("chris", 90)
|
80
|
+
@player3 = Player.new("jon", 80)
|
81
|
+
|
82
|
+
@players = [@player1, @player2, @player3]
|
83
|
+
end
|
84
|
+
|
85
|
+
it "is sorted by decreasing order" do
|
86
|
+
|
87
|
+
@players.sort.should == [@player1, @player2, @player3]
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it "computes points as the sum of all treasure points" do
|
92
|
+
@player.points.should == 0
|
93
|
+
|
94
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
95
|
+
|
96
|
+
@player.points.should == 50
|
97
|
+
|
98
|
+
@player.found_treasure(Treasure.new(:crowbar, 400))
|
99
|
+
|
100
|
+
@player.points.should == 450
|
101
|
+
|
102
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
103
|
+
|
104
|
+
@player.points.should == 500
|
105
|
+
end
|
106
|
+
|
107
|
+
it "yields each found treasure and its total points" do
|
108
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
109
|
+
@player.found_treasure(Treasure.new(:skillet, 100))
|
110
|
+
@player.found_treasure(Treasure.new(:hammer, 50))
|
111
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
112
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
113
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
114
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
115
|
+
@player.found_treasure(Treasure.new(:bottle, 5))
|
116
|
+
|
117
|
+
yielded = []
|
118
|
+
@player.each_treasure_found do |treasure|
|
119
|
+
yielded << treasure
|
120
|
+
end
|
121
|
+
|
122
|
+
yielded.should == [
|
123
|
+
Treasure.new(:skillet, 200),
|
124
|
+
Treasure.new(:hammer, 50),
|
125
|
+
Treasure.new(:bottle, 25)
|
126
|
+
]
|
127
|
+
end
|
128
|
+
|
129
|
+
it "can be created from a CSV string" do
|
130
|
+
player = Player.from_csv("larry,150")
|
131
|
+
|
132
|
+
player.name.should == "Larry"
|
133
|
+
player.health.should == 150
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'studio_game/berserk_player'
|
2
|
+
|
3
|
+
$stdout = StringIO.new
|
4
|
+
|
5
|
+
module StudioGame
|
6
|
+
describe BerserkPlayer do
|
7
|
+
|
8
|
+
before do
|
9
|
+
@initial_health = 50
|
10
|
+
@player = BerserkPlayer.new("berserker", @initial_health)
|
11
|
+
end
|
12
|
+
|
13
|
+
it "does not go berserk when high fived up to 5 times" do
|
14
|
+
1.upto(5) { @player.high_five }
|
15
|
+
|
16
|
+
@player.berserk?.should be_false
|
17
|
+
end
|
18
|
+
|
19
|
+
it "goes berserk when high fived more than 5 times" do
|
20
|
+
1.upto(6) { @player.high_five }
|
21
|
+
|
22
|
+
@player.berserk?.should be_true
|
23
|
+
end
|
24
|
+
|
25
|
+
it "gets high fived instead of sharting when it's gone berserk" do
|
26
|
+
1.upto(6) { @player.high_five }
|
27
|
+
1.upto(2) { @player.shart }
|
28
|
+
|
29
|
+
@player.health.should == @initial_health + (8 * 15)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require 'studio_game/clumsy_player'
|
2
|
+
|
3
|
+
module StudioGame
|
4
|
+
describe ClumsyPlayer do
|
5
|
+
|
6
|
+
before do
|
7
|
+
@player = ClumsyPlayer.new("klutz",100,2)
|
8
|
+
$stdout = StringIO.new
|
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_treasure_found do |treasure|
|
28
|
+
yielded << treasure
|
29
|
+
end
|
30
|
+
|
31
|
+
yielded.should == [Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)]
|
32
|
+
end
|
33
|
+
|
34
|
+
it "multiplies the high fives by the boost number" do
|
35
|
+
@player.health.should == 100
|
36
|
+
|
37
|
+
@player.high_five
|
38
|
+
|
39
|
+
@player.health.should == 130
|
40
|
+
end
|
41
|
+
|
42
|
+
it "trades sharts for high fives if player gets more than 5 sharts (rage)" do
|
43
|
+
@player.shart
|
44
|
+
@player.shart
|
45
|
+
@player.shart
|
46
|
+
@player.shart
|
47
|
+
@player.shart
|
48
|
+
@player.shart
|
49
|
+
|
50
|
+
@player.rage?.should be_true
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
require 'studio_game/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
|
+
@treasure.name.should == :hammer
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a points attribute" do
|
15
|
+
@treasure.points.should == 50
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
describe TreasureTrove do
|
21
|
+
|
22
|
+
it "has six treasures" do
|
23
|
+
TreasureTrove::TREASURES.size.should == 6
|
24
|
+
end
|
25
|
+
|
26
|
+
it "has a sandpaper worth 5 points" do
|
27
|
+
TreasureTrove::TREASURES[0].should == Treasure.new(:sandpaper, 5)
|
28
|
+
end
|
29
|
+
|
30
|
+
it "has a leaf worth 25 points" do
|
31
|
+
TreasureTrove::TREASURES[1].should == Treasure.new(:leaf, 25)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "has a TP worth 50 points" do
|
35
|
+
TreasureTrove::TREASURES[2].should == Treasure.new("sqaure of TP", 50)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "has a buttwipe worth 100 points" do
|
39
|
+
TreasureTrove::TREASURES[3].should == Treasure.new(:buttwipe, 100)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "has a diaper worth 200 points" do
|
43
|
+
TreasureTrove::TREASURES[4].should == Treasure.new(:diaper, 200)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "has a Immodium worth 500 points" do
|
47
|
+
TreasureTrove::TREASURES[5].should == Treasure.new("clean pair of briefs", 500)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "returns a random treasure" do
|
51
|
+
treasure = TreasureTrove.random
|
52
|
+
|
53
|
+
TreasureTrove::TREASURES.should include(treasure)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
metadata
ADDED
@@ -0,0 +1,82 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sharts_studio_game
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Rick Rieta
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-12-11 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &26230848 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *26230848
|
25
|
+
description: A game that was created to practice Ruby.
|
26
|
+
email: rrieta@biddingforgood.com
|
27
|
+
executables:
|
28
|
+
- studio_game
|
29
|
+
extensions: []
|
30
|
+
extra_rdoc_files: []
|
31
|
+
files:
|
32
|
+
- bin/studio_game
|
33
|
+
- bin/villians.csv
|
34
|
+
- bin/wrestlers.csv
|
35
|
+
- lib/studio_game/Auditable.rb
|
36
|
+
- lib/studio_game/berserk_player.rb
|
37
|
+
- lib/studio_game/Clumsy_player.rb
|
38
|
+
- lib/studio_game/Die.rb
|
39
|
+
- lib/studio_game/Game.rb
|
40
|
+
- lib/studio_game/Game_turn.rb
|
41
|
+
- lib/studio_game/loaded_die.rb
|
42
|
+
- lib/studio_game/Playable.rb
|
43
|
+
- lib/studio_game/Player.rb
|
44
|
+
- lib/studio_game/sorting.rb
|
45
|
+
- lib/studio_game/treasure_trove.rb
|
46
|
+
- spec/studio_game/berserker_spec.rb
|
47
|
+
- spec/studio_game/clumsy_player_spec.rb
|
48
|
+
- spec/studio_game/Game_spec.rb
|
49
|
+
- spec/studio_game/Player_spec.rb
|
50
|
+
- spec/studio_game/treasure_trove_spec.rb
|
51
|
+
- LICENSE
|
52
|
+
- README
|
53
|
+
homepage: ''
|
54
|
+
licenses: []
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '1.9'
|
65
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
|
+
none: false
|
67
|
+
requirements:
|
68
|
+
- - ! '>='
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
requirements: []
|
72
|
+
rubyforge_project:
|
73
|
+
rubygems_version: 1.8.16
|
74
|
+
signing_key:
|
75
|
+
specification_version: 3
|
76
|
+
summary: Pragmatic Studios Ruby training game
|
77
|
+
test_files:
|
78
|
+
- spec/studio_game/berserker_spec.rb
|
79
|
+
- spec/studio_game/clumsy_player_spec.rb
|
80
|
+
- spec/studio_game/Game_spec.rb
|
81
|
+
- spec/studio_game/Player_spec.rb
|
82
|
+
- spec/studio_game/treasure_trove_spec.rb
|