ad_studio_game 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENSE +8 -0
- data/README +3 -0
- data/bin/high_scores.txt +6 -0
- data/bin/players.csv +3 -0
- data/bin/studio_game +34 -0
- data/lib/studio_game/auditable.rb +7 -0
- data/lib/studio_game/berserk_player.rb +31 -0
- data/lib/studio_game/clumsy_player.rb +38 -0
- data/lib/studio_game/die.rb +19 -0
- data/lib/studio_game/game.rb +117 -0
- data/lib/studio_game/game_turn.rb +20 -0
- data/lib/studio_game/loaded_die.rb +16 -0
- data/lib/studio_game/playable.rb +17 -0
- data/lib/studio_game/player.rb +64 -0
- data/lib/studio_game/treasure_trove.rb +18 -0
- data/spec/studio_game/berserk_player_spec.rb +28 -0
- data/spec/studio_game/clumsy_player_spec.rb +46 -0
- data/spec/studio_game/game_spec.rb +64 -0
- data/spec/studio_game/player_spec.rb +124 -0
- data/spec/studio_game/treasure_trove_spec.rb +54 -0
- metadata +87 -0
data/LICENSE
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
Copyright (C) 2013 Austin David
|
2
|
+
|
3
|
+
|
4
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
5
|
+
|
6
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
7
|
+
|
8
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README
ADDED
@@ -0,0 +1,3 @@
|
|
1
|
+
# Pragmatic Studio Game
|
2
|
+
|
3
|
+
An text-based game written in Ruby that is based on The Pragmatic Studio's online introductory course "Ruby Programming" by Mike and Nicole Clark. This is the exercise app that was given to students as a challenge to test their knowledge of the concepts taught in the course.
|
data/bin/high_scores.txt
ADDED
data/bin/players.csv
ADDED
data/bin/studio_game
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require_relative "../lib/studio_game/game"
|
4
|
+
require_relative "../lib/studio_game/clumsy_player"
|
5
|
+
require_relative "../lib/studio_game/berserk_player"
|
6
|
+
|
7
|
+
module PragStudioGame
|
8
|
+
warriors = PragStudioGame::Game.new("Warriors")
|
9
|
+
default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
|
10
|
+
warriors.load_players(ARGV.shift || default_player_file)
|
11
|
+
|
12
|
+
ditzy = ClumsyPlayer.new("ditzy",105, 5)
|
13
|
+
warriors.add_player(ditzy)
|
14
|
+
|
15
|
+
nutty = BerserkPlayer.new("nutty",50)
|
16
|
+
warriors.add_player(nutty)
|
17
|
+
|
18
|
+
loop do
|
19
|
+
puts "\nHow many game rounds? ('quit' to exit)"
|
20
|
+
answer = gets.downcase.chomp
|
21
|
+
|
22
|
+
case answer
|
23
|
+
when /^\d+$/
|
24
|
+
warriors.play(answer.to_i) { warriors.total_points >= 200000 }
|
25
|
+
when 'quit', 'exit'
|
26
|
+
warriors.print_stats
|
27
|
+
break
|
28
|
+
else
|
29
|
+
puts "Please enter a number or 'quit'"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
warriors.save_high_scores
|
34
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative "player"
|
2
|
+
|
3
|
+
module PragStudioGame
|
4
|
+
class BerserkPlayer < Player
|
5
|
+
def initialize(name, health=100)
|
6
|
+
super(name,health)
|
7
|
+
@heal_count = 0
|
8
|
+
end
|
9
|
+
|
10
|
+
def heal
|
11
|
+
super
|
12
|
+
@heal_count += 1
|
13
|
+
puts "#{@name} is berserk!" if berserk?
|
14
|
+
end
|
15
|
+
|
16
|
+
def smash
|
17
|
+
berserk? ? heal : super
|
18
|
+
end
|
19
|
+
|
20
|
+
def berserk?
|
21
|
+
@heal_count > 5
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if __FILE__ == $0
|
26
|
+
berserker = BerserkPlayer.new("berserker", 50)
|
27
|
+
6.times { berserker.heal }
|
28
|
+
2.times { berserker.smash }
|
29
|
+
puts berserker.health
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative "player"
|
2
|
+
|
3
|
+
module PragStudioGame
|
4
|
+
class ClumsyPlayer < Player
|
5
|
+
attr_reader :boost
|
6
|
+
|
7
|
+
def initialize(name, health=100, boost=1)
|
8
|
+
super(name, health)
|
9
|
+
@boost = boost
|
10
|
+
end
|
11
|
+
|
12
|
+
def heal
|
13
|
+
@boost.times { super }
|
14
|
+
end
|
15
|
+
|
16
|
+
def found_treasure(treasure)
|
17
|
+
damaged_treasure = Treasure.new(treasure.name, treasure.points / 2.0)
|
18
|
+
super(damaged_treasure)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
if __FILE__ == $0
|
23
|
+
clumsy = ClumsyPlayer.new("klutz", 105, 5)
|
24
|
+
|
25
|
+
hammer = Treasure.new(:hammer, 25)
|
26
|
+
clumsy.found_treasure(hammer)
|
27
|
+
clumsy.found_treasure(hammer)
|
28
|
+
clumsy.found_treasure(hammer)
|
29
|
+
|
30
|
+
crowbar = Treasure.new(:crowbar, 400)
|
31
|
+
clumsy.found_treasure(crowbar)
|
32
|
+
|
33
|
+
clumsy.each_found_treasure do |treasure|
|
34
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
35
|
+
end
|
36
|
+
puts "#{clumsy.points} grand total points"
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require "csv"
|
2
|
+
require_relative "die"
|
3
|
+
require_relative "game_turn"
|
4
|
+
require_relative "treasure_trove"
|
5
|
+
|
6
|
+
module PragStudioGame
|
7
|
+
class Game
|
8
|
+
require_relative "player"
|
9
|
+
|
10
|
+
attr_reader :title
|
11
|
+
|
12
|
+
def initialize(title)
|
13
|
+
@title = title
|
14
|
+
@players = []
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_player(player)
|
18
|
+
@players << player
|
19
|
+
end
|
20
|
+
|
21
|
+
def play(rounds)
|
22
|
+
puts "\nThere are #{@players.size} players in #{@title}: \n\n"
|
23
|
+
@players.each do |player|
|
24
|
+
puts player
|
25
|
+
end
|
26
|
+
|
27
|
+
1.upto(rounds) do |round|
|
28
|
+
if block_given?
|
29
|
+
break if yield
|
30
|
+
end
|
31
|
+
puts "\nRound #{round}:"
|
32
|
+
@players.each do |player|
|
33
|
+
GameTurn.take_turn(player)
|
34
|
+
puts player
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
treasures = TreasureTrove::TREASURES
|
39
|
+
puts "\nThere are #{treasures.size} treasures in the game."
|
40
|
+
treasures.each do |treasure|
|
41
|
+
puts "A #{treasure.name} is worth #{treasure.points} points"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def print_stats
|
46
|
+
puts "\n#{@title} Statistics:\n"
|
47
|
+
strong_players, weak_players = @players.partition { |player| player.strong? }
|
48
|
+
|
49
|
+
puts "#{strong_players.size} strong players:"
|
50
|
+
strong_players.each { |player| print_name_and_health(player) }
|
51
|
+
puts "\n#{weak_players.size} weak players:"
|
52
|
+
weak_players.each { |player| print_name_and_health(player) }
|
53
|
+
|
54
|
+
puts "\n#{@title} High Scores:"
|
55
|
+
@players.sort.each do |player|
|
56
|
+
puts high_score_entry(player)
|
57
|
+
end
|
58
|
+
|
59
|
+
@players.each do |player|
|
60
|
+
puts "\n#{player.name}'s point totals:"
|
61
|
+
puts "#{player.points} grand total points"
|
62
|
+
end
|
63
|
+
|
64
|
+
puts "\n#{total_points} total treasure points found"
|
65
|
+
|
66
|
+
@players.sort.each do |player|
|
67
|
+
puts "\n#{player.name}'s point totals:"
|
68
|
+
player.each_found_treasure do |treasure|
|
69
|
+
puts "#{treasure.points} total #{treasure.name} points"
|
70
|
+
end
|
71
|
+
puts "#{player.points} grand total points"
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def print_name_and_health(player)
|
76
|
+
puts "#{player.name} (#{player.health})"
|
77
|
+
end
|
78
|
+
|
79
|
+
def total_points
|
80
|
+
@players.reduce(0) { |sum, player| sum + player.points }
|
81
|
+
end
|
82
|
+
|
83
|
+
def load_players(from_file)
|
84
|
+
CSV.foreach(from_file) do |row|
|
85
|
+
player = Player.new(row[0], row[1].to_i)
|
86
|
+
add_player(player)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def save_high_scores(to_file="high_scores.txt")
|
91
|
+
File.open(to_file, "w") do |file|
|
92
|
+
file.puts "#{@title} High Scores:"
|
93
|
+
@players.sort.each do |player|
|
94
|
+
file.puts high_score_entry(player)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def high_score_entry(player)
|
100
|
+
"#{player.name.ljust(30, ".")} #{player.score}"
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
# Example code below only runs when game.rb is executed from the command line
|
105
|
+
|
106
|
+
if __FILE__ == $0
|
107
|
+
player1 = Player.new("player1", 50)
|
108
|
+
player2 = Player.new("player2", 75)
|
109
|
+
player3 = Player.new("player3")
|
110
|
+
|
111
|
+
game = Game.new("Game")
|
112
|
+
game.add_player(player1)
|
113
|
+
game.add_player(player2)
|
114
|
+
game.add_player(player3)
|
115
|
+
game.play
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative "treasure_trove"
|
2
|
+
require_relative "loaded_die"
|
3
|
+
|
4
|
+
module PragStudioGame
|
5
|
+
module GameTurn
|
6
|
+
def self.take_turn(player)
|
7
|
+
die = Die.new
|
8
|
+
case die.roll_die
|
9
|
+
when 1..2
|
10
|
+
player.smash
|
11
|
+
when 3..4
|
12
|
+
puts "#{player.name} was skipped."
|
13
|
+
else
|
14
|
+
player.heal
|
15
|
+
end
|
16
|
+
treasure = TreasureTrove.random
|
17
|
+
player.found_treasure(treasure)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require_relative "treasure_trove"
|
2
|
+
require_relative "playable"
|
3
|
+
|
4
|
+
module PragStudioGame
|
5
|
+
class Player
|
6
|
+
include Playable
|
7
|
+
|
8
|
+
attr_accessor :health
|
9
|
+
attr_accessor :name
|
10
|
+
|
11
|
+
def initialize(name, health=100)
|
12
|
+
@name = name.capitalize
|
13
|
+
@health = health
|
14
|
+
@found_treasures = Hash.new(0)
|
15
|
+
end
|
16
|
+
|
17
|
+
def name=(name_change)
|
18
|
+
@name = name_change.capitalize
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
"#{@name} has #{@health} health and #{points} points for a score of #{score}."
|
23
|
+
end
|
24
|
+
|
25
|
+
def score
|
26
|
+
@health + points
|
27
|
+
end
|
28
|
+
|
29
|
+
def <=>(other)
|
30
|
+
other.score <=> score
|
31
|
+
end
|
32
|
+
|
33
|
+
def found_treasure(treasure)
|
34
|
+
@found_treasures[treasure.name] += treasure.points
|
35
|
+
puts "#{name} found a #{treasure.name} worth #{treasure.points}"
|
36
|
+
puts "#{name}'s treasures: #{@found_treasures}"
|
37
|
+
end
|
38
|
+
|
39
|
+
def points
|
40
|
+
@found_treasures.values.reduce(0, :+)
|
41
|
+
end
|
42
|
+
|
43
|
+
def each_found_treasure
|
44
|
+
@found_treasures.each do |name, points|
|
45
|
+
yield Treasure.new(name, points)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def self.from_csv(string)
|
50
|
+
name, health = string.split(',')
|
51
|
+
player = Player.new(name, Integer(health))
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
# Example code below only runs when player.rb is executed from the command line
|
56
|
+
|
57
|
+
if __FILE__ == $0
|
58
|
+
player1 = Player.new("player1")
|
59
|
+
player1.name
|
60
|
+
player1.smash
|
61
|
+
player1.heal
|
62
|
+
puts player1
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module PragStudioGame
|
2
|
+
Treasure = Struct.new(:name, :points)
|
3
|
+
|
4
|
+
module TreasureTrove
|
5
|
+
TREASURES = [
|
6
|
+
Treasure.new(:knife, 5),
|
7
|
+
Treasure.new(:hammer, 25),
|
8
|
+
Treasure.new(:spear, 50),
|
9
|
+
Treasure.new(:sickle, 100),
|
10
|
+
Treasure.new(:axe, 200),
|
11
|
+
Treasure.new(:sword, 400)
|
12
|
+
]
|
13
|
+
|
14
|
+
def self.random
|
15
|
+
TREASURES.sample
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'studio_game/berserk_player'
|
2
|
+
|
3
|
+
module PragStudioGame
|
4
|
+
describe BerserkPlayer do
|
5
|
+
|
6
|
+
let(:initial_health) { 50 }
|
7
|
+
let(:player) { BerserkPlayer.new("berserker", initial_health) }
|
8
|
+
|
9
|
+
it "does not go berserk when healed up to 5 times" do
|
10
|
+
1.upto(5) { player.heal }
|
11
|
+
|
12
|
+
player.berserk?.should be_false
|
13
|
+
end
|
14
|
+
|
15
|
+
it "goes berserk when healed more than 5 times" do
|
16
|
+
1.upto(6) { player.heal }
|
17
|
+
|
18
|
+
player.berserk?.should be_true
|
19
|
+
end
|
20
|
+
|
21
|
+
it "gets w00ted instead of smashed when it's gone berserk" do
|
22
|
+
1.upto(6) { player.heal }
|
23
|
+
1.upto(2) { player.smash }
|
24
|
+
|
25
|
+
player.health.should == initial_health + (8 * 10)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'studio_game/clumsy_player'
|
2
|
+
|
3
|
+
module PragStudioGame
|
4
|
+
describe ClumsyPlayer do
|
5
|
+
let(:player) { ClumsyPlayer.new("klutz") }
|
6
|
+
|
7
|
+
it "only gets half the point value for each treasure" do
|
8
|
+
player.points.should == 0
|
9
|
+
|
10
|
+
hammer = Treasure.new(:hammer, 25)
|
11
|
+
player.found_treasure(hammer)
|
12
|
+
player.found_treasure(hammer)
|
13
|
+
player.found_treasure(hammer)
|
14
|
+
|
15
|
+
player.points.should == 37.5
|
16
|
+
|
17
|
+
sword = Treasure.new(:sword, 400)
|
18
|
+
player.found_treasure(sword)
|
19
|
+
|
20
|
+
player.points.should == 237.5
|
21
|
+
|
22
|
+
yielded = []
|
23
|
+
player.each_found_treasure do |treasure|
|
24
|
+
yielded << treasure
|
25
|
+
end
|
26
|
+
|
27
|
+
yielded.should == [Treasure.new(:hammer, 37.5), Treasure.new(:sword, 200)]
|
28
|
+
end
|
29
|
+
|
30
|
+
context "with a boost factor" do
|
31
|
+
let(:initial_health) { 100 }
|
32
|
+
let(:boost) { 5 }
|
33
|
+
let(:player) { ClumsyPlayer.new("klutz", initial_health, boost) }
|
34
|
+
|
35
|
+
it "has a boost factor" do
|
36
|
+
player.boost.should == 5
|
37
|
+
end
|
38
|
+
|
39
|
+
it "gets boost factor number of heals when healed" do
|
40
|
+
player.heal
|
41
|
+
|
42
|
+
player.health.should == initial_health + (10 * boost)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require "studio_game/game"
|
2
|
+
|
3
|
+
module PragStudioGame
|
4
|
+
describe Game do
|
5
|
+
let(:game) { Game.new("Game") }
|
6
|
+
let(:initial_health) { 100 }
|
7
|
+
let(:player) { Player.new("player", initial_health) }
|
8
|
+
let(:player1) { Player.new("player1") }
|
9
|
+
let(:player2) { Player.new("player2") }
|
10
|
+
|
11
|
+
|
12
|
+
before do
|
13
|
+
$stdout = StringIO.new
|
14
|
+
game.add_player(player)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "heals the player if a a high number is rolled" do
|
18
|
+
Die.any_instance.stub(:roll_die).and_return(6)
|
19
|
+
|
20
|
+
game.play(2)
|
21
|
+
|
22
|
+
player.health.should == initial_health + (10 * 2)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "skips the player if a a medium number is rolled" do
|
26
|
+
Die.any_instance.stub(:roll_die).and_return(4)
|
27
|
+
|
28
|
+
game.play(2)
|
29
|
+
|
30
|
+
player.health.should == initial_health
|
31
|
+
end
|
32
|
+
|
33
|
+
it "smashes the player if a a low number is rolled" do
|
34
|
+
Die.any_instance.stub(:roll_die).and_return(2)
|
35
|
+
|
36
|
+
game.play(2)
|
37
|
+
|
38
|
+
player.health.should == initial_health - (5 * 2)
|
39
|
+
end
|
40
|
+
|
41
|
+
it "assigns a treasure for points during a player's turn" do
|
42
|
+
game = Game.new("Team")
|
43
|
+
player = Player.new("moe")
|
44
|
+
|
45
|
+
game.add_player(player)
|
46
|
+
|
47
|
+
game.play(1)
|
48
|
+
|
49
|
+
player.points.should_not be_zero
|
50
|
+
end
|
51
|
+
|
52
|
+
it "computes total points as the sum of all player points" do
|
53
|
+
|
54
|
+
game.add_player(player1)
|
55
|
+
game.add_player(player2)
|
56
|
+
|
57
|
+
player1.found_treasure(Treasure.new(:hammer, 25))
|
58
|
+
player1.found_treasure(Treasure.new(:hammer, 25))
|
59
|
+
player2.found_treasure(Treasure.new(:sword, 400))
|
60
|
+
|
61
|
+
game.total_points.should == 450
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
require "studio_game/player"
|
2
|
+
require "studio_game/treasure_trove"
|
3
|
+
|
4
|
+
module PragStudioGame
|
5
|
+
describe Player do
|
6
|
+
before do
|
7
|
+
$stdout = StringIO.new
|
8
|
+
end
|
9
|
+
|
10
|
+
let(:initial_health) { 50 }
|
11
|
+
let(:player) { Player.new("player", initial_health) }
|
12
|
+
|
13
|
+
it "has a capitialized name" do
|
14
|
+
|
15
|
+
player.name.should == "Player"
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has an initial health" do
|
20
|
+
|
21
|
+
player.health.should == initial_health
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
it "has a string representation" do
|
26
|
+
|
27
|
+
player.found_treasure(Treasure.new(:hammer, 25))
|
28
|
+
player.found_treasure(Treasure.new(:hammer, 25))
|
29
|
+
|
30
|
+
player.to_s.should == "Player has 50 health and 50 points for a score of 100."
|
31
|
+
|
32
|
+
end
|
33
|
+
|
34
|
+
it "computes a score as the sum of its health and length of name" do
|
35
|
+
|
36
|
+
player.found_treasure(Treasure.new(:hammer, 25))
|
37
|
+
player.found_treasure(Treasure.new(:hammer, 25))
|
38
|
+
|
39
|
+
player.score.should == 100
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
it "increases health by 10 when healed" do
|
44
|
+
player.heal
|
45
|
+
player.health.should == 50 + 10
|
46
|
+
end
|
47
|
+
|
48
|
+
it "decreases health by 5 when smashed" do
|
49
|
+
player.smash
|
50
|
+
player.health.should == (50 - 5)
|
51
|
+
end
|
52
|
+
|
53
|
+
context "with a health greater than 150" do
|
54
|
+
let(:player) { Player.new("player", 150) }
|
55
|
+
|
56
|
+
it "is strong" do
|
57
|
+
player.should be_strong
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
context "with a health less than or equal to 100" do
|
62
|
+
let(:player) { Player.new("player", 100) }
|
63
|
+
|
64
|
+
it "is weak" do
|
65
|
+
player.should_not be_strong
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
context "in a collection of players" do
|
70
|
+
let(:player1) { Player.new("player1", 100) }
|
71
|
+
let(:player2) { Player.new("player2", 200) }
|
72
|
+
let(:player3) { Player.new("player3", 300) }
|
73
|
+
let(:players) { [player1, player2, player3] }
|
74
|
+
|
75
|
+
it "is sorted by decreasing score" do
|
76
|
+
players.sort.should == [player3, player2, player1]
|
77
|
+
end
|
78
|
+
|
79
|
+
it "computes points as the sum of all treasure points" do
|
80
|
+
player1.points.should == 0
|
81
|
+
|
82
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
83
|
+
|
84
|
+
player1.points.should == 50
|
85
|
+
|
86
|
+
player1.found_treasure(Treasure.new(:sword, 400))
|
87
|
+
|
88
|
+
player1.points.should == 450
|
89
|
+
|
90
|
+
player1.found_treasure(Treasure.new(:hammer, 50))
|
91
|
+
|
92
|
+
player1.points.should == 500
|
93
|
+
end
|
94
|
+
|
95
|
+
it "yields each found treasure and its total points" do
|
96
|
+
player1.found_treasure(Treasure.new(:sickle, 100))
|
97
|
+
player1.found_treasure(Treasure.new(:sickle, 100))
|
98
|
+
player1.found_treasure(Treasure.new(:spear, 50))
|
99
|
+
player1.found_treasure(Treasure.new(:knife, 5))
|
100
|
+
player1.found_treasure(Treasure.new(:knife, 5))
|
101
|
+
player1.found_treasure(Treasure.new(:knife, 5))
|
102
|
+
player1.found_treasure(Treasure.new(:knife, 5))
|
103
|
+
player1.found_treasure(Treasure.new(:knife, 5))
|
104
|
+
|
105
|
+
yielded = []
|
106
|
+
player1.each_found_treasure do |treasure|
|
107
|
+
yielded << treasure
|
108
|
+
end
|
109
|
+
|
110
|
+
yielded.should == [
|
111
|
+
Treasure.new(:sickle, 200),
|
112
|
+
Treasure.new(:spear, 50),
|
113
|
+
Treasure.new(:knife, 25)
|
114
|
+
]
|
115
|
+
end
|
116
|
+
it "can be created from a CSV string" do
|
117
|
+
player1 = Player.from_csv("player1,100")
|
118
|
+
|
119
|
+
player1.name.should == "Player1"
|
120
|
+
player1.health.should == 100
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'studio_game/treasure_trove'
|
2
|
+
|
3
|
+
module PragStudioGame
|
4
|
+
describe Treasure do
|
5
|
+
|
6
|
+
let(:treasure) { Treasure.new(:hammer, 50) }
|
7
|
+
|
8
|
+
it "has a name attribute" do
|
9
|
+
treasure.name.should == :hammer
|
10
|
+
end
|
11
|
+
|
12
|
+
it "has a points attribute" do
|
13
|
+
treasure.points.should == 50
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
describe TreasureTrove do
|
19
|
+
|
20
|
+
it "has six treasures" do
|
21
|
+
TreasureTrove::TREASURES.size.should == 6
|
22
|
+
end
|
23
|
+
|
24
|
+
it "has a knife worth 5 points" do
|
25
|
+
TreasureTrove::TREASURES[0].should == Treasure.new(:knife, 5)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "has a hammer worth 25 points" do
|
29
|
+
TreasureTrove::TREASURES[1].should == Treasure.new(:hammer, 25)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "has a spear worth 50 points" do
|
33
|
+
TreasureTrove::TREASURES[2].should == Treasure.new(:spear, 50)
|
34
|
+
end
|
35
|
+
|
36
|
+
it "has a sickle worth 100 points" do
|
37
|
+
TreasureTrove::TREASURES[3].should == Treasure.new(:sickle, 100)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "has a axe worth 200 points" do
|
41
|
+
TreasureTrove::TREASURES[4].should == Treasure.new(:axe, 200)
|
42
|
+
end
|
43
|
+
|
44
|
+
it "has a sword worth 400 points" do
|
45
|
+
TreasureTrove::TREASURES[5].should == Treasure.new(:sword, 400)
|
46
|
+
end
|
47
|
+
|
48
|
+
it "returns a random treasure" do
|
49
|
+
treasure = TreasureTrove.random
|
50
|
+
|
51
|
+
TreasureTrove::TREASURES.should include(treasure)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: ad_studio_game
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Austin David
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-12-28 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rspec
|
16
|
+
requirement: &27280512 !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: *27280512
|
25
|
+
description: ! '# Pragmatic Studio Game
|
26
|
+
|
27
|
+
|
28
|
+
An text-based game written in Ruby that is based on The Pragmatic Studio''s online
|
29
|
+
introductory course "Ruby Programming" by Mike and Nicole Clark. This is the exercise
|
30
|
+
app that was given to students as a challenge to test their knowledge of the concepts
|
31
|
+
taught in the course.'
|
32
|
+
email: adavidphx@gmail.com
|
33
|
+
executables:
|
34
|
+
- studio_game
|
35
|
+
extensions: []
|
36
|
+
extra_rdoc_files: []
|
37
|
+
files:
|
38
|
+
- bin/high_scores.txt
|
39
|
+
- bin/players.csv
|
40
|
+
- bin/studio_game
|
41
|
+
- lib/studio_game/auditable.rb
|
42
|
+
- lib/studio_game/berserk_player.rb
|
43
|
+
- lib/studio_game/clumsy_player.rb
|
44
|
+
- lib/studio_game/die.rb
|
45
|
+
- lib/studio_game/game.rb
|
46
|
+
- lib/studio_game/game_turn.rb
|
47
|
+
- lib/studio_game/loaded_die.rb
|
48
|
+
- lib/studio_game/playable.rb
|
49
|
+
- lib/studio_game/player.rb
|
50
|
+
- lib/studio_game/treasure_trove.rb
|
51
|
+
- spec/studio_game/berserk_player_spec.rb
|
52
|
+
- spec/studio_game/clumsy_player_spec.rb
|
53
|
+
- spec/studio_game/game_spec.rb
|
54
|
+
- spec/studio_game/player_spec.rb
|
55
|
+
- spec/studio_game/treasure_trove_spec.rb
|
56
|
+
- LICENSE
|
57
|
+
- README
|
58
|
+
homepage: https://github.com/austindavid/studio_game
|
59
|
+
licenses: []
|
60
|
+
post_install_message:
|
61
|
+
rdoc_options: []
|
62
|
+
require_paths:
|
63
|
+
- lib
|
64
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '1.9'
|
70
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
requirements: []
|
77
|
+
rubyforge_project:
|
78
|
+
rubygems_version: 1.8.16
|
79
|
+
signing_key:
|
80
|
+
specification_version: 3
|
81
|
+
summary: Collect points for finding treasures
|
82
|
+
test_files:
|
83
|
+
- spec/studio_game/berserk_player_spec.rb
|
84
|
+
- spec/studio_game/clumsy_player_spec.rb
|
85
|
+
- spec/studio_game/game_spec.rb
|
86
|
+
- spec/studio_game/player_spec.rb
|
87
|
+
- spec/studio_game/treasure_trove_spec.rb
|