studio_game_edward 1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 81ae3595e03f25434bb04b948882b544289b55de
4
+ data.tar.gz: 94f409dc02217a8e09d1099bb058a73309b5f202
5
+ SHA512:
6
+ metadata.gz: 0fc2bd9b547263edf2121dd03a3f265733986e16befb56c986672b83c33d85fa94eb8edb8eb5db72c1eaa0d9493322bb8fb835132047873745a90b164f69dec9
7
+ data.tar.gz: b3cbe7796b5fde25103b7030672091613e636ba45e0f8274509827c8df8f04c74c11c2fb1bac08e387d36c279d217620436ee92dc997de4d493448fb3667ddf2
data/LICENSE.md ADDED
@@ -0,0 +1 @@
1
+ #Program License
data/README.md ADDED
@@ -0,0 +1,2 @@
1
+ # studio_game
2
+ A text-based Ruby game as part of the Pragmatic Studio Course
@@ -0,0 +1,3 @@
1
+ Michael,9
2
+ James,2
3
+ Scott,3
data/bin/studio_game ADDED
@@ -0,0 +1,36 @@
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
+ player1 = StudioGame::Player.new("bob")
8
+ player2 = StudioGame::Player.new("larry", 60)
9
+ player3 = StudioGame::Player.new("curly", 125)
10
+ player4 = StudioGame::ClumsyPlayer.new("klutz", 105)
11
+ player5 = StudioGame::BerserkPlayer.new("berzerker", 50)
12
+
13
+ knuckleheads = StudioGame::Game.new("Knuckleheads")
14
+ default_path = File.join(File.dirname(__FILE__), "favorite_players.csv")
15
+ knuckleheads.load_players(ARGV.shift || default_path)
16
+ knuckleheads.add_player(player4)
17
+ knuckleheads.add_player(player5)
18
+
19
+ loop do
20
+ puts "\nHow many rounds would you like to play?"
21
+ answer = gets.chomp.downcase
22
+
23
+ case answer
24
+ when /^\d+$/
25
+ knuckleheads.play(answer.to_i)
26
+ when "exit", "quit"
27
+ knuckleheads.print_stats
28
+ knuckleheads.save_scores
29
+ break
30
+ else
31
+ puts "Please enter a number or quit"
32
+ end
33
+
34
+ end
35
+
36
+
@@ -0,0 +1,7 @@
1
+ module Auditable
2
+
3
+ def audit
4
+ puts "Rolled a #{self.number}(#{self.class})"
5
+ end
6
+
7
+ end
@@ -0,0 +1,40 @@
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 w00t
17
+ super
18
+ @woot_count += 1
19
+ puts "#{@name} is berserk!" if berserk?
20
+ end
21
+
22
+ def blam
23
+ if berserk?
24
+ w00t
25
+ else
26
+ super
27
+ end
28
+ end
29
+
30
+
31
+ end
32
+ end
33
+
34
+
35
+ if __FILE__ == $0
36
+ berserker = StudioGame::BerserkPlayer.new("berserker", 50)
37
+ 6.times { berserker.w00t }
38
+ 2.times { berserker.blam }
39
+ puts berserker.health
40
+ end
@@ -0,0 +1,29 @@
1
+ require_relative 'player'
2
+ require_relative 'treasure_trove'
3
+
4
+ module StudioGame
5
+
6
+ class ClumsyPlayer < Player
7
+
8
+ def found_treasure(treasure)
9
+ super(StudioGame::Treasure.new(treasure.name, treasure.points/2.0))
10
+ end
11
+
12
+ end
13
+ end
14
+ if __FILE__ == $0
15
+ clumsy = StudioGame::ClumsyPlayer.new("klutz")
16
+
17
+ hammer = StudioGame::Treasure.new(:hammer, 50)
18
+ clumsy.found_treasure(hammer)
19
+ clumsy.found_treasure(hammer)
20
+ clumsy.found_treasure(hammer)
21
+
22
+ crowbar = StudioGame::Treasure.new(:crowbar, 400)
23
+ clumsy.found_treasure(crowbar)
24
+
25
+ clumsy.each_found_treasure do |treasure|
26
+ puts "#{treasure.points} total #{treasure.name} points"
27
+ end
28
+ puts "#{clumsy.points} grand total points"
29
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'auditable'
2
+
3
+ module StudioGame
4
+ class Die
5
+
6
+ include Auditable
7
+ attr_reader :number
8
+
9
+ def initialize
10
+ roll
11
+ end
12
+
13
+ def roll
14
+ @number = rand(1..6)
15
+ audit
16
+ @number
17
+ end
18
+
19
+ end
20
+
21
+ end
@@ -0,0 +1,104 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'game_turn'
4
+ require_relative 'treasure_trove'
5
+
6
+ module StudioGame
7
+
8
+ class Game
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.push(player)
19
+ @players << player
20
+ end
21
+
22
+ def total_points
23
+ @players.reduce(0) {|sum, player| sum + player.points}
24
+
25
+ end
26
+
27
+ def load_players(file)
28
+ File.readlines(file).each do |line|
29
+ add_player(Player.from_csv(line))
30
+ end
31
+ end
32
+
33
+ def save_scores(file="high_scores.txt")
34
+ File.open(file, 'w') do |file|
35
+ @players.each do |player|
36
+ file.puts create_high_score_entry(player)
37
+ end
38
+ end
39
+ end
40
+
41
+ def create_high_score_entry(player)
42
+ formatted_score = player.name.ljust(30, ".")
43
+ "#{formatted_score}#{player.score}"
44
+ end
45
+
46
+ def play(rounds)
47
+
48
+ treasures = TreasureTrove::TREASURES
49
+ puts "There are #{treasures.count} treasures to be found."
50
+ treasures.each do |treasure|
51
+ puts "A #{treasure.name} is worth #{treasure.points} points."
52
+ end
53
+
54
+ puts "\nThere are #{@players.size} players in #{@title}: "
55
+
56
+ @players.each do |player|
57
+ puts player
58
+ end
59
+
60
+ 1.upto(rounds) do |turn|
61
+
62
+ puts "\nRound: #{turn}"
63
+
64
+ @players.each do |player|
65
+ GameTurn.take_turn(player)
66
+ puts player
67
+ end
68
+ end
69
+ end
70
+
71
+ def print_name_and_health(player)
72
+ puts player.name.ljust(30, ".").concat(player.score.to_s)
73
+ end
74
+
75
+ def print_stats
76
+ strong_players, wimpy_players = @players.partition {|player| player.strong?}
77
+
78
+ puts "\name#{total_points} total points from treasure found"
79
+
80
+ @players.sort.each do |player|
81
+ puts "\n#{player.name}'s point totals:"
82
+ player.each_found_treasure {|treasure| puts "#{treasure.points} total #{treasure.name} points"}
83
+ puts "#{player.points} grand total points"
84
+ end
85
+
86
+ puts "\n#{strong_players.count} strong players:"
87
+ strong_players.each do |player|
88
+ puts "#{player.name} (#{player.health})"
89
+ end
90
+
91
+ puts "#{wimpy_players.count} wimpy players:"
92
+ wimpy_players.each do |player|
93
+ puts "#{player.name} (#{player.health})"
94
+ end
95
+
96
+ @players.sort.each do |player|
97
+ print_name_and_health(player)
98
+ end
99
+
100
+ end
101
+
102
+
103
+ end
104
+ end
@@ -0,0 +1,29 @@
1
+ require_relative 'die'
2
+ require_relative 'player'
3
+ require_relative 'treasure_trove'
4
+
5
+ module GameTurn
6
+
7
+ def self.take_turn(player)
8
+
9
+ die = StudioGame::Die.new
10
+
11
+ case die.roll
12
+ when 1..2
13
+ player.blam
14
+ when 3..4
15
+ puts "#{player.name} was skipped"
16
+ else
17
+ player.w00t
18
+ end
19
+
20
+ treasure = StudioGame::TreasureTrove.random
21
+
22
+ player.found_treasure(treasure)
23
+
24
+
25
+ puts "#{player.name} found a #{treasure.name} worth #{treasure.points} points"
26
+
27
+ end
28
+
29
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'auditable'
2
+
3
+ module StudioGame
4
+ class LoadedDie
5
+
6
+ include Auditable
7
+
8
+ attr_reader :number
9
+
10
+ def roll
11
+ numbers = [1,2,3,4,5,6]
12
+ @number = numbers.sample
13
+ audit
14
+ @number
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,17 @@
1
+ module Playable
2
+
3
+ def blam()
4
+ self.health -=10
5
+ puts "#{name} just got blammed!"
6
+ end
7
+
8
+ def w00t()
9
+ self.health +=15
10
+ puts "#{name} just got w00ted!"
11
+ end
12
+
13
+ def strong?
14
+ self.health > 100
15
+ end
16
+
17
+ end
@@ -0,0 +1,69 @@
1
+ require_relative 'treasure_trove'
2
+ require_relative 'playable'
3
+
4
+ module StudioGame
5
+ class Player
6
+
7
+ include Playable
8
+
9
+ attr_accessor :name, :health
10
+ attr_reader :found_treasures
11
+
12
+ def initialize(name, health=100)
13
+ @name = name.capitalize
14
+ @health = health
15
+ @found_treasures = Hash.new(0)
16
+ end
17
+
18
+ def found_treasure(treasure)
19
+ @found_treasures[treasure.name] += treasure.points
20
+ puts "#{@name} found a #{treasure.name} worth #{treasure.points} points"
21
+ puts "#{@name}'s treasures: #{@found_treasures}"
22
+ end
23
+
24
+ def each_found_treasure
25
+ @found_treasures.each do |treasure, points|
26
+ yield StudioGame::Treasure.new(treasure, points)
27
+
28
+ end
29
+ end
30
+
31
+ def self.from_csv(line)
32
+ name, health = line.split(",")
33
+ StudioGame::Player.new(name, Integer(health))
34
+ end
35
+
36
+ def points
37
+ @found_treasures.values.reduce(0, :+)
38
+ end
39
+
40
+ def name=(new_name)
41
+ @name = new_name.capitalize
42
+ end
43
+
44
+ def to_s()
45
+ "I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}."
46
+ end
47
+
48
+ def score()
49
+ @health + points
50
+ end
51
+
52
+ def <=>(other_player)
53
+ other_player.score <=> score
54
+ end
55
+ end
56
+ end
57
+
58
+ if __FILE__ == $0
59
+ player = StudioGame::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
67
+
68
+
69
+
@@ -0,0 +1,3 @@
1
+ Vince,10
2
+ Colt,12
3
+ Andrew,12
@@ -0,0 +1,20 @@
1
+
2
+ module StudioGame
3
+
4
+ Treasure = Struct.new(:name, :points)
5
+
6
+ module TreasureTrove
7
+ TREASURES = [
8
+ Treasure.new(:pie, 5),
9
+ Treasure.new(:bottle, 25),
10
+ Treasure.new(:hammer, 50),
11
+ Treasure.new(:skillet, 100),
12
+ Treasure.new(:broomstick, 200),
13
+ Treasure.new(:crowbar, 400)]
14
+
15
+ def self.random
16
+ TREASURES[rand(TREASURES.count)]
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,63 @@
1
+ require 'studio_game/game'
2
+
3
+ module StudioGame
4
+
5
+ describe Game do
6
+
7
+ before do
8
+ @game = StudioGame::Game.new("Knuckleheads")
9
+
10
+ @initial_health = 100
11
+ @player = StudioGame::Player.new("moe", @initial_health)
12
+
13
+ @game.add_player(@player)
14
+ end
15
+
16
+ it 'player w00ts when high number is rolled' do
17
+ StudioGame::Die.any_instance.stub(:roll).and_return(5)
18
+ @game.play(2)
19
+ @player.health.should == @initial_health + (15 * 2)
20
+ end
21
+
22
+ it 'player skips when medium number is rolled' do
23
+ StudioGame::Die.any_instance.stub(:roll).and_return(3)
24
+ @game.play(2)
25
+ @player.health.should == @initial_health
26
+ end
27
+
28
+ it 'player blams when lower number is rolled' do
29
+ StudioGame::Die.any_instance.stub(:roll).and_return(1)
30
+ @game.play(2)
31
+ @player.health.should == @initial_health - (10 * 2)
32
+ end
33
+
34
+ it "assigns a treasure for points during a player's turn" do
35
+ game = StudioGame::Game.new("Knuckleheads")
36
+ player = StudioGame::Player.new("moe")
37
+
38
+ game.add_player(player)
39
+
40
+ game.play(1)
41
+
42
+ player.points.should_not be_zero
43
+
44
+ end
45
+
46
+ it "computes total points as the sum of all player points" do
47
+ game = StudioGame::Game.new("Knuckleheads")
48
+
49
+ player1 = StudioGame::Player.new("moe")
50
+ player2 = StudioGame::Player.new("larry")
51
+
52
+ game.add_player(player1)
53
+ game.add_player(player2)
54
+
55
+ player1.found_treasure(StudioGame::Treasure.new(:hammer, 50))
56
+ player1.found_treasure(StudioGame::Treasure.new(:hammer, 50))
57
+ player2.found_treasure(StudioGame::Treasure.new(:crowbar, 400))
58
+
59
+ game.total_points.should == 500
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,130 @@
1
+ require 'studio_game/player'
2
+ require 'studio_game/treasure_trove'
3
+
4
+ module StudioGame
5
+ describe Player do
6
+
7
+ before do
8
+ @inital_health = 150
9
+ @player = StudioGame::Player.new("larry", @inital_health)
10
+ $stdout = StringIO.new
11
+
12
+ end
13
+
14
+ it "has a capitalized name" do
15
+ @player.name.should == "Larry"
16
+ end
17
+
18
+ it "yields each found treasure and its total points" do
19
+ @player.found_treasure(Treasure.new(:skillet, 100))
20
+ @player.found_treasure(Treasure.new(:skillet, 100))
21
+ @player.found_treasure(Treasure.new(:hammer, 50))
22
+ @player.found_treasure(Treasure.new(:bottle, 5))
23
+ @player.found_treasure(Treasure.new(:bottle, 5))
24
+ @player.found_treasure(Treasure.new(:bottle, 5))
25
+ @player.found_treasure(Treasure.new(:bottle, 5))
26
+ @player.found_treasure(Treasure.new(:bottle, 5))
27
+
28
+ yielded = []
29
+ @player.each_found_treasure do |treasure|
30
+ yielded << treasure
31
+ end
32
+
33
+ yielded.should == [
34
+ Treasure.new(:skillet, 200),
35
+ Treasure.new(:hammer, 50),
36
+ Treasure.new(:bottle, 25)
37
+ ]
38
+ end
39
+
40
+ it "has an initial health" do
41
+ @player.health.should == 150
42
+ end
43
+
44
+ it "has a string representation" do
45
+ @player.found_treasure(Treasure.new(:hammer, 50))
46
+ @player.found_treasure(Treasure.new(:hammer, 50))
47
+ @player.to_s.should == "I'm Larry with health = 150, points = 100, and score = 250."
48
+ end
49
+
50
+ it "computes a score as the sum of its health and points" do
51
+ @player.found_treasure(Treasure.new(:hammer, 50))
52
+ @player.found_treasure(Treasure.new(:hammer, 50))
53
+ @player.score.should == 250
54
+ end
55
+
56
+ it "increases health by 15 when w00ted" do
57
+ @player.w00t
58
+ @player.health.should == @inital_health + 15
59
+ end
60
+
61
+ it "decreases health by 10 when blammed" do
62
+ @player.blam
63
+ @player.health.should == @inital_health - 10
64
+ end
65
+
66
+ it "computes points as the sum of all treasure points" do
67
+ @player.points.should == 0
68
+
69
+ @player.found_treasure(Treasure.new(:hammer, 50))
70
+
71
+ @player.points.should == 50
72
+
73
+ @player.found_treasure(Treasure.new(:crowbar, 400))
74
+
75
+ @player.points.should == 450
76
+
77
+ @player.found_treasure(Treasure.new(:hammer, 50))
78
+
79
+ @player.points.should == 500
80
+ end
81
+
82
+ it "can be created from a CSV string" do
83
+ player = Player.from_csv("larry,150")
84
+ player.name.should == "Larry"
85
+ player.health.should == 150
86
+ end
87
+
88
+ context 'with health greater than 150' do
89
+ before do
90
+ @inital_health = 175
91
+ @player = Player.new("larry", @inital_health)
92
+ end
93
+
94
+ it 'player is strong' do
95
+ @player.should be_strong
96
+ end
97
+
98
+ end
99
+
100
+ context 'with health less than 100' do
101
+ before do
102
+ @inital_health = 90
103
+ @player = Player.new("larry", @inital_health)
104
+ end
105
+
106
+ it 'player is weak' do
107
+ @player.should_not be_strong
108
+ end
109
+
110
+ end
111
+
112
+ context "in a collection of players" do
113
+ before do
114
+ @player1 = Player.new("moe", 100)
115
+ @player2 = Player.new("larry", 200)
116
+ @player3 = Player.new("curly", 300)
117
+
118
+ @players = [@player1, @player2, @player3]
119
+ end
120
+
121
+ it "is sorted by decreasing score" do
122
+ @players.sort.should == [@player3, @player2, @player1]
123
+ end
124
+ end
125
+
126
+
127
+
128
+
129
+ end
130
+ end
@@ -0,0 +1,59 @@
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
+ @treasure.name.should == :hammer
13
+ end
14
+
15
+ it "has a points attribute" do
16
+ @treasure.points.should == 50
17
+ end
18
+
19
+ end
20
+
21
+ describe TreasureTrove do
22
+
23
+ it "has six treasures" do
24
+ TreasureTrove::TREASURES.size.should == 6
25
+ end
26
+
27
+ it "has a pie worth 5 points" do
28
+ TreasureTrove::TREASURES[0].should == Treasure.new(:pie, 5)
29
+ end
30
+
31
+ it "has a bottle worth 25 points" do
32
+ TreasureTrove::TREASURES[1].should == Treasure.new(:bottle, 25)
33
+ end
34
+
35
+ it "has a hammer worth 50 points" do
36
+ TreasureTrove::TREASURES[2].should == Treasure.new(:hammer, 50)
37
+ end
38
+
39
+ it "has a skillet worth 100 points" do
40
+ TreasureTrove::TREASURES[3].should == Treasure.new(:skillet, 100)
41
+ end
42
+
43
+ it "has a broomstick worth 200 points" do
44
+ TreasureTrove::TREASURES[4].should == Treasure.new(:broomstick, 200)
45
+ end
46
+
47
+ it "has a crowbar worth 400 points" do
48
+ TreasureTrove::TREASURES[5].should == Treasure.new(:crowbar, 400)
49
+ end
50
+
51
+ it "returns a random treasure" do
52
+ treasure = TreasureTrove.random
53
+
54
+ TreasureTrove::TREASURES.should include(treasure)
55
+
56
+ end
57
+
58
+ end
59
+ end
metadata ADDED
@@ -0,0 +1,81 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game_edward
3
+ version: !ruby/object:Gem::Version
4
+ version: '1.0'
5
+ platform: ruby
6
+ authors:
7
+ - Edward Butler
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-07-08 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: |
28
+ # studio_game
29
+ A text-based Ruby game as part of the Pragmatic Studio Course
30
+ email: eddieozzie@gmail.com
31
+ executables:
32
+ - studio_game
33
+ extensions: []
34
+ extra_rdoc_files: []
35
+ files:
36
+ - LICENSE.md
37
+ - README.md
38
+ - bin/favorite_players.csv
39
+ - bin/studio_game
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/players.csv
50
+ - lib/studio_game/treasure_trove.rb
51
+ - spec/studio_game/game_spec.rb
52
+ - spec/studio_game/player_spec.rb
53
+ - spec/studio_game/treasure_trove_spec.rb
54
+ homepage: http://www.coppellappdevelopment.com
55
+ licenses:
56
+ - MIT
57
+ metadata: {}
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '1.9'
67
+ required_rubygems_version: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: '0'
72
+ requirements: []
73
+ rubyforge_project:
74
+ rubygems_version: 2.5.1
75
+ signing_key:
76
+ specification_version: 4
77
+ summary: This is a game I developed as part of the Pragmatic Studio class.
78
+ test_files:
79
+ - spec/studio_game/game_spec.rb
80
+ - spec/studio_game/player_spec.rb
81
+ - spec/studio_game/treasure_trove_spec.rb