studio_game_constantine 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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ff52bbfd02e1a466071eb80a0b92463e8da5acde
4
+ data.tar.gz: 21fdd844da1786eaef2dd48d49785777cccb4535
5
+ SHA512:
6
+ metadata.gz: 96adc1fa2038a08286ac4676979e30d97156f5242a2426c403a20f61b6b1a448e4a2f448ac9d58ab8cfb757697b72d38352ebb492a71a18884389fd41c696998
7
+ data.tar.gz: 81c42b2a1c6c2a0edd8974d5642a4c82509d83c40b040eb91f251e94c62cd38f4f340de9405671e78925f3e3b6018a816721a730ed186c043cc50388657db5ca
data/LICENSE ADDED
File without changes
data/README ADDED
@@ -0,0 +1 @@
1
+ Thank you Mike and Nicole on your awesome tutorial on ruby!
@@ -0,0 +1,6 @@
1
+ Knuckleheads High Scores:
2
+ Alvin............... 310
3
+ Simon............... 885
4
+ Theo................ 1125
5
+ Klutz............... 361
6
+ Berserker........... 1655
@@ -0,0 +1,3 @@
1
+ Grace,120
2
+ Anna,70
3
+ Maxwell,100
@@ -0,0 +1,3 @@
1
+ Alvin,100
2
+ Simon,60
3
+ Theo,125
@@ -0,0 +1,49 @@
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
+ klutz = StudioGame::ClumsyPlayer.new("klutz",105)
8
+ berserker = StudioGame::BerserkPlayer.new("berserker",50)
9
+
10
+ knuckleheads = StudioGame::Game.new("knuckleheads")
11
+ default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
12
+ knuckleheads.load_players(ARGV.shift || default_player_file)
13
+ knuckleheads.add_players(klutz)
14
+ knuckleheads.add_players(berserker)
15
+
16
+
17
+ puts "How many game rounds? ( 'quit'to exit )"
18
+ loop do
19
+
20
+ answer = gets.chomp
21
+
22
+ case answer
23
+ when /^\d+$/
24
+ knuckleheads.play(answer.to_i)
25
+ puts "How many game rounds? ( 'quit'to exit )"
26
+ when 'quit'
27
+ puts "\n"
28
+ puts "Exiting the game..."
29
+ knuckleheads.print_stats
30
+ knuckleheads.save_high_score
31
+ break
32
+ else
33
+ puts "Please enter a valid number to indicate rounds of game (Type 'quit' to exit)"
34
+ end
35
+
36
+ end
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
45
+
46
+ #puts "There are #{players.size} players as of #{Time.new.strftime("%A, %b %e %Y at %I:%M %p")}"
47
+
48
+
49
+
@@ -0,0 +1,5 @@
1
+ module Auditable
2
+ def audit
3
+ puts "Rolled a #{self.number} (#{self.class}) "
4
+ end
5
+ end
@@ -0,0 +1,38 @@
1
+ require_relative "player"
2
+
3
+ module StudioGame
4
+ class BerserkPlayer < Player
5
+ def initialize(name,health)
6
+ super(name,health)
7
+ @woot_count = 0
8
+ end
9
+
10
+ def woot
11
+ super()
12
+ @woot_count += 1
13
+
14
+ puts "#{@name} is in berserker mode!" if berserk?
15
+
16
+ end
17
+
18
+ def blam
19
+ berserk? ? woot : super
20
+ end
21
+
22
+ def berserk?
23
+ if @woot_count > 5
24
+ return true
25
+ else
26
+ return false
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ if __FILE__ == $0
33
+ berserker = BerserkPlayer.new("berserker", 50)
34
+ 6.times { berserker.woot }
35
+ 2.times { berserker.blam }
36
+ puts berserker.health
37
+ end
38
+
@@ -0,0 +1,30 @@
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)
9
+ super(damaged_treasure)
10
+ end
11
+
12
+ end
13
+
14
+ if __FILE__ == $0
15
+ clumsy = ClumsyPlayer.new("klutz")
16
+
17
+ hammer = Treasure.new(:hammer, 50)
18
+ clumsy.found_treasure(hammer)
19
+ clumsy.found_treasure(hammer)
20
+ clumsy.found_treasure(hammer)
21
+
22
+ crowbar = Treasure.new(:crowbar, 400)
23
+ clumsy.found_treasure(crowbar)
24
+
25
+ clumsy.each_treasure do |treasure|
26
+ puts "#{treasure.points} total #{treasure.name} points"
27
+ end
28
+ puts "#{clumsy.points} grand total points"
29
+ end
30
+ end
@@ -0,0 +1,10 @@
1
+ require_relative "auditable"
2
+ class Die
3
+ include Auditable
4
+ attr_reader :number
5
+
6
+ def roll
7
+ @number = rand(1..6)
8
+ audit
9
+ end
10
+ end
@@ -0,0 +1,96 @@
1
+ require_relative "player"
2
+ require_relative "die"
3
+ require_relative "game_turn"
4
+ require_relative "treasure_trove"
5
+
6
+ module StudioGame
7
+ class Game
8
+
9
+ def initialize(name)
10
+ @name = name.capitalize
11
+ @players = []
12
+ end
13
+
14
+ def add_players(players)
15
+ @players.push(players)
16
+ end
17
+
18
+ def load_players(from_file)
19
+ File.readlines(from_file).each do |line|
20
+ name,health = line.split(',')
21
+ player = Player.new(name,Integer(health))
22
+ add_players(player)
23
+ end
24
+ end
25
+
26
+ def save_high_score(to_file = "high_scores.txt")
27
+ File.open(to_file, "w") do |file|
28
+ puts "Saving high score to file to #{to_file}"
29
+ file.puts "#{@name} High Scores: "
30
+ @players.each do |player|
31
+ formatted_name = player.name.ljust(20,'.')
32
+ file.puts "#{formatted_name} #{player.score}"
33
+ end
34
+ end
35
+ end
36
+
37
+ def play(rounds)
38
+ treasures = TreasureTrove::TREASURES
39
+ puts "There are #{treasures.size} treasures to be found:"
40
+ treasures.each do |treasure|
41
+ puts "Treasure: #{treasure.name}\t Points: #{treasure.points}"
42
+ end
43
+ 1.upto(rounds) do |round|
44
+ puts "\n"
45
+ puts "Round: #{round}"
46
+ @players.each do |player|
47
+ GameTurn.take_turn(player)
48
+ end
49
+ end
50
+ end
51
+
52
+ def print_name_and_health(player)
53
+ puts "Player: #{player.name}\t Health:#{player.health}"
54
+ end
55
+
56
+ def print_stats
57
+
58
+ strong_players, weak_players = @players.partition {|p| p.strong?}
59
+ #weak_players = @players.reject {|p| p.strong?}
60
+
61
+ puts "\n"
62
+ puts "Strong Players:"
63
+ strong_players.each do |player|
64
+ print_name_and_health(player)
65
+ end
66
+
67
+
68
+ puts "\n"
69
+ puts "Weak Players"
70
+ weak_players.each do |player|
71
+ print_name_and_health(player)
72
+ end
73
+
74
+ sorted_players = @players.sort
75
+
76
+ puts "Knuckleheads High Score:"
77
+ sorted_players.each do |player|
78
+ puts "#{player.name}....................#{player.score} "
79
+ end
80
+
81
+ puts "\n"
82
+
83
+ @players.each do |player|
84
+
85
+ player.each_treasure do |treasure|
86
+ puts "#{treasure.points} total #{treasure.name} points"
87
+ end
88
+
89
+ puts "#{player.name}'s grand total points: #{player.points}"
90
+ puts "\n"
91
+
92
+ end
93
+
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,25 @@
1
+ require_relative "die"
2
+ require_relative "loaded_die"
3
+ require_relative "player"
4
+ require_relative "treasure_trove"
5
+
6
+ module StudioGame
7
+ module GameTurn
8
+ def self.take_turn(player)
9
+ die = Die.new
10
+ case die.roll
11
+ when 3..4
12
+ puts "Player: #{player.name.capitalize} was skipped"
13
+ when 1..2
14
+ player.blam
15
+ puts player
16
+ when 5..6
17
+ player.woot
18
+ puts player
19
+ end
20
+ treasure = TreasureTrove.random
21
+ player.found_treasure(treasure)
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ require_relative "auditable"
2
+
3
+ class LoadedDie
4
+ include Auditable
5
+ attr_reader :number
6
+
7
+ def roll
8
+ numbers = [1,1,2,5,6,6]
9
+ @numbers = numbers.sample
10
+ audit
11
+ #@number
12
+ end
13
+
14
+ end
@@ -0,0 +1,15 @@
1
+ module Playable
2
+ def woot
3
+ self.health +=15
4
+ puts "#{name.capitalize} got w00ted!"
5
+ end
6
+
7
+ def blam
8
+ self.health -= 10
9
+ puts "#{name.capitalize} got blammed!"
10
+ end
11
+
12
+ def strong?
13
+ return true if self.health > 100
14
+ end
15
+ end
@@ -0,0 +1,57 @@
1
+ require_relative "treasure_trove"
2
+ require_relative "playable"
3
+
4
+ module StudioGame
5
+ class Player
6
+ include Playable
7
+ attr_reader :name
8
+ attr_accessor :health
9
+
10
+ def initialize(name, health=100)
11
+ @name = name.capitalize
12
+ @health = health
13
+ @found_treasures = Hash.new(0)
14
+ end
15
+
16
+ def name=(name)
17
+ @name = name.capitalize
18
+ end
19
+
20
+ def <=>(other)
21
+ other.score <=> score
22
+ end
23
+
24
+ def to_s
25
+ "I am #{@name.capitalize} with health of #{@health} and a score of #{score}"
26
+ end
27
+
28
+ def found_treasure(treasure)
29
+ @found_treasures[treasure.name] += treasure.points
30
+ puts "#{@name} found a #{treasure.name} worth #{treasure.points}"
31
+ puts "#{@name}'s Treasure: #{@found_treasures}"
32
+ end
33
+
34
+ def each_treasure
35
+ @found_treasures.each do |name,points|
36
+ yield Treasure.new(name,points)
37
+ end
38
+ end
39
+
40
+ def points
41
+ @found_treasures.values.reduce(0, :+)
42
+ end
43
+
44
+ def score
45
+ @score = @health + points
46
+ end
47
+ end
48
+
49
+
50
+ end
51
+
52
+
53
+ if __FILE__ == $0
54
+ player1 = Player.new("sandy")
55
+ puts player1
56
+ player1.woot
57
+ end
@@ -0,0 +1,21 @@
1
+ module StudioGame
2
+
3
+ Treasure = Struct.new(:name,:points)
4
+
5
+ module TreasureTrove
6
+ pie = Treasure.new(:pie,5)
7
+ bottle = Treasure.new(:bottle,25)
8
+ hammer = Treasure.new(:hammer,50)
9
+ skillet = Treasure.new(:skillet,100)
10
+ broomstick = Treasure.new(:broomstick,200)
11
+ crowbar = Treasure.new(:crowbar,400)
12
+
13
+ TREASURES = [pie,bottle,hammer,skillet,broomstick,crowbar]
14
+
15
+ def self.random
16
+ TREASURES.sample
17
+ end
18
+
19
+ end
20
+ end
21
+
@@ -0,0 +1,29 @@
1
+ require "studio_game/berserk_player"
2
+
3
+ module StudioGame
4
+ describe BerserkPlayer do
5
+
6
+ before do
7
+ @initial_health = 50
8
+ @player = BerserkPlayer.new("berserker", @initial_health)
9
+ end
10
+
11
+ it "does not go to berserk when woot up to 5" do
12
+ 1.upto(5) { @player.woot}
13
+ expect(@player.berserk?).to eq(false)
14
+ end
15
+
16
+ it "goes into berserk mode when woot more than 5" do
17
+ 1.upto(6) {@player.woot}
18
+ expect(@player.berserk?).to eq(true)
19
+ end
20
+
21
+ it "gets wooted instead of blam when woot is more than 5" do
22
+ 1.upto(6) {@player.woot}
23
+ 1.upto(2) {@player.blam}
24
+
25
+ expect(@player.health).to eq(@initial_health + 8*15)
26
+ end
27
+
28
+ end
29
+ end
@@ -0,0 +1,36 @@
1
+ require "studio_game/clumsy_player"
2
+
3
+ module StudioGame
4
+
5
+ describe ClumsyPlayer do
6
+ before do
7
+ @player = ClumsyPlayer.new("klutz")
8
+ end
9
+
10
+ it "only gets half points for each treasure it obtains" do
11
+ expect(@player.points).to eq(0)
12
+
13
+ hammer = Treasure.new(:hammer,50)
14
+ @player.found_treasure(hammer)
15
+ @player.found_treasure(hammer)
16
+ @player.found_treasure(hammer)
17
+
18
+ expect(@player.points).to eq(75)
19
+
20
+ crowbar = Treasure.new(:crowbar,400)
21
+ @player.found_treasure(crowbar)
22
+
23
+ expect(@player.points).to eq(275)
24
+
25
+ yielded = []
26
+
27
+ @player.each_treasure do |treasure|
28
+ yielded << treasure
29
+ end
30
+
31
+ yielded.should == [Treasure.new(:hammer,75),Treasure.new(:crowbar,200)]
32
+
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,43 @@
1
+ require "studio_game/game"
2
+
3
+ module StudioGame
4
+ describe Game do
5
+
6
+ before do
7
+ @game = Game.new("knuckleheads")
8
+ @initial_health = 100
9
+ @player = Player.new("moe",@initial_health)
10
+ @game.add_players(@player)
11
+ end
12
+
13
+ it "w00t the player when high number is rolled" do
14
+ allow_any_instance_of(Die).to receive(:roll).and_return(5)
15
+ @game.play(2)
16
+ expect(@player.health).to eq(@initial_health + 30)
17
+ end
18
+
19
+ it "skips the player when medium number is rolled" do
20
+ allow_any_instance_of(Die).to receive(:roll).and_return(3)
21
+ @game.play(2)
22
+ expect(@player.health).to eq(@initial_health)
23
+ end
24
+
25
+ it "blams the player when low number is rolled" do
26
+ allow_any_instance_of(Die).to receive(:roll).and_return(2)
27
+ @game.play(2)
28
+ expect(@player.health).to eq(@initial_health - 20)
29
+ end
30
+
31
+ it "assigns a treasure for points during a player's turn" do
32
+ game = Game.new("Knuckleheads")
33
+ player = Player.new("moe")
34
+
35
+ game.add_players(player)
36
+
37
+ game.play(1)
38
+
39
+ expect(player.points).not_to be_zero
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,97 @@
1
+ require "studio_game/player"
2
+
3
+ module StudioGame
4
+ describe Player do
5
+
6
+ before do
7
+ @initial_health = 150
8
+ @player = Player.new("larry",@initial_health)
9
+ end
10
+
11
+ it "has a capitalize name" do
12
+
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("I am Larry with health of 150 and a score of 150")
22
+ end
23
+ it "computes a score of the sum of the health and length of the name" do
24
+ @player.found_treasure(Treasure.new(:hammer,50))
25
+ @player.found_treasure(Treasure.new(:hammer,50))
26
+ expect(@player.to_s).to eq("I am Larry with health of 150 and a score of 250")
27
+ end
28
+ it "increases health by 15 when woot" do
29
+ @player.woot
30
+ expect(@player.health).to eq(165)
31
+ end
32
+ it "decreaes health by 10 when blam" do
33
+ @player.blam
34
+ expect(@player.health).to eq(140)
35
+ end
36
+
37
+ it "computes points as the sum of all treasure points" do
38
+ expect(@player.points).to eq(0)
39
+
40
+ @player.found_treasure(Treasure.new(:hammer,50))
41
+ expect(@player.points).to eq(50)
42
+
43
+ @player.found_treasure(Treasure.new(:crowbar,400))
44
+ expect(@player.points).to eq(450)
45
+
46
+ @player.found_treasure(Treasure.new(:hammer,50))
47
+ expect(@player.points).to eq(500)
48
+ end
49
+
50
+ it "yields each treasure found and it's total points" do
51
+
52
+ @player.found_treasure(Treasure.new(:hammer,50))
53
+ @player.found_treasure(Treasure.new(:crowbar,400))
54
+ @player.found_treasure(Treasure.new(:bow,100))
55
+ @player.found_treasure(Treasure.new(:crowbar,400))
56
+ @player.found_treasure(Treasure.new(:crowbar,400))
57
+ @player.found_treasure(Treasure.new(:bow,100))
58
+
59
+ yielded = []
60
+ @player.each_treasure do |treasure|
61
+ yielded << treasure
62
+ end
63
+
64
+ yielded.should == [
65
+ Treasure.new(:hammer, 50),
66
+ Treasure.new(:crowbar, 1200),
67
+ Treasure.new(:bow, 200)
68
+ ]
69
+
70
+ end
71
+
72
+
73
+ context "Player has a health above 150" do
74
+
75
+ before do
76
+ @player = Player.new("moe",150)
77
+ end
78
+
79
+ it "player is strong when health is 150" do
80
+ expect(@player).to be_strong
81
+ end
82
+
83
+ end
84
+
85
+ context "Player has a health above 100" do
86
+
87
+ before do
88
+ @player = Player.new("moe",100)
89
+ end
90
+
91
+ it "player is not strong when health is below 100" do
92
+ expect(@player).to_not be_strong
93
+ end
94
+
95
+ end
96
+ end
97
+ 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 "should have a name attribute" do
11
+ expect(@treasure.name).to eq(:hammer)
12
+ end
13
+
14
+ it "should have points attribute" do
15
+ expect(@treasure.points).to eq(50)
16
+ end
17
+
18
+ end
19
+
20
+ describe TreasureTrove do
21
+
22
+ it "has six trophies" do
23
+ expect(TreasureTrove::TREASURES.size).to eq(6)
24
+ end
25
+
26
+ it "has a pie worth 5 points" do
27
+ expect(TreasureTrove::TREASURES[0]).to eq(Treasure.new(:pie,5))
28
+ end
29
+
30
+ it "has a bottle worth 25 points" do
31
+ expect(TreasureTrove::TREASURES[1]).to eq(Treasure.new(:bottle,25))
32
+ end
33
+
34
+ it "has a hammer worth 50 points" do
35
+ expect(TreasureTrove::TREASURES[2]).to eq(Treasure.new(:hammer,50))
36
+ end
37
+
38
+ it "has a skillet worth 100 points"do
39
+ expect(TreasureTrove::TREASURES[3]).to eq(Treasure.new(:skillet,100))
40
+ end
41
+
42
+ it "has a broomstick worth 200 points"do
43
+ expect(TreasureTrove::TREASURES[4]).to eq(Treasure.new(:broomstick,200))
44
+ end
45
+
46
+ it "has a crowbar worth 400 points" do
47
+ expect(TreasureTrove::TREASURES[5]).to eq(Treasure.new(:crowbar,400))
48
+ end
49
+
50
+ it "returns a random treasure" do
51
+ treasure = TreasureTrove.random
52
+ expect(TreasureTrove::TREASURES).to include(treasure)
53
+ end
54
+
55
+ end
56
+ end
metadata ADDED
@@ -0,0 +1,84 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game_constantine
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Gabriel Su Mi Ren
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-01-30 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: Thank you Mike and Nicole on your awesome tutorial on ruby!
28
+ email: constantine92@example.com
29
+ executables:
30
+ - studio_game
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - LICENSE
35
+ - README
36
+ - bin/high_scores.txt
37
+ - bin/my_favourite_players.csv
38
+ - bin/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/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: https://www.youtube.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.5.1
76
+ signing_key:
77
+ specification_version: 4
78
+ summary: Simple ruby game tutorial from Pragmatic Studio
79
+ test_files:
80
+ - spec/studio_game/player_spec.rb
81
+ - spec/studio_game/berserk_player_spec.rb
82
+ - spec/studio_game/treasure_trove_spec.rb
83
+ - spec/studio_game/game_spec.rb
84
+ - spec/studio_game/clumsy_player_spec.rb