knuckleheads1313 1.0.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 560f1dcd4df151142dbb4ba53b74a5d1fe611156
4
+ data.tar.gz: ac1df3502f08f6cfa19b2c320cd075e7c8141ae8
5
+ SHA512:
6
+ metadata.gz: 709ef550f895d423a227df19c5f6d1acc47472ca0328e51e6e15358eece7de92fc2afdeb0bebaf5c442eeb14ad40920f6c68d9841f33b514e9327cef630282e6
7
+ data.tar.gz: cf11113cdb37015f475798c678fc90ec4b7a795517f0918d3262c14582901a0e9639171a9e8fcfc1866eea0bc37d5d7aabab0a107f80eef5347ccdb42b719af7
data/LICENSE ADDED
File without changes
data/README ADDED
File without changes
@@ -0,0 +1,3 @@
1
+ Alvin,100
2
+ Simon,60
3
+ Theo,125
@@ -0,0 +1,27 @@
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
+ knuckleheads = StudioGame::Game.new("Knuckleheads")
8
+ default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
9
+ knuckleheads.load_players(ARGV.shift || default_player_file)
10
+ berserk = StudioGame::BerserkPlayer.new("Berserker", 50)
11
+ klutz = StudioGame::ClumsyPlayer.new("Klutz", 105)
12
+ knuckleheads.add_player(klutz)
13
+ knuckleheads.add_player(berserk)
14
+ loop do
15
+ puts "\nHow many game rounds? ('quit' to exit)"
16
+ answer = gets.chomp.downcase
17
+ case answer
18
+ when /^\d+$/
19
+ knuckleheads.play(answer.to_i)
20
+ when 'quit', 'exit'
21
+ knuckleheads.print_stats
22
+ break
23
+ else
24
+ puts "Please enter a number or 'quit'"
25
+ end
26
+ end
27
+ knuckleheads.save_high_scores
@@ -0,0 +1,7 @@
1
+ module StudioGame
2
+ module Auditable
3
+ def audit
4
+ puts "Rolled a #{self.number} (#{self.class})"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,31 @@
1
+ require_relative 'player'
2
+ module StudioGame
3
+ class BerserkPlayer < Player
4
+ def initialize (name, health=100)
5
+ super(name, health)
6
+ @w00t_count = 0
7
+ end
8
+ def berserk?
9
+ @w00t_count > 5
10
+ end
11
+ def w00t
12
+ super
13
+ @w00t_count += 1
14
+ puts "#{@name} is berserk!" if berserk?
15
+ end
16
+ def blam
17
+ if berserk?
18
+ w00t
19
+ else
20
+ super
21
+ end
22
+ end
23
+ end
24
+ end
25
+
26
+ if __FILE__ == $0
27
+ berserker = BerserkPlayer.new("berserker", 50)
28
+ 6.times { berserker.w00t }
29
+ 2.times { berserker.blam }
30
+ puts berserker.health
31
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+ class ClumsyPlayer < Player
5
+ def found_treasure(treasure)
6
+ damaged_treasure = Treasure.new(treasure.name, treasure.points / 2.0)
7
+ super(damaged_treasure)
8
+ end
9
+ end
10
+ end
11
+
12
+ if __FILE__ == $0
13
+ clumsy = ClumsyPlayer.new("klutz")
14
+
15
+ hammer = Treasure.new(:hammer, 50)
16
+ clumsy.found_treasure(hammer)
17
+ clumsy.found_treasure(hammer)
18
+ clumsy.found_treasure(hammer)
19
+ crowbar = Treasure.new(:crowbar, 400)
20
+ clumsy.found_treasure(crowbar)
21
+
22
+ clumsy.each_found_treasure do |treasure|
23
+ puts "#{treasure.points} total #{treasure.name} points"
24
+ end
25
+ puts "#{clumsy.points} grand total points"
26
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'auditable'
2
+
3
+ module StudioGame
4
+ class Die
5
+ include Auditable
6
+
7
+ attr_reader :number
8
+
9
+ def roll
10
+ @number = rand (1..6)
11
+ audit
12
+ @number
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,86 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'game_turn'
4
+
5
+ module StudioGame
6
+ class Game
7
+ attr_reader :title
8
+
9
+ def initialize(title)
10
+ @title = title
11
+ @players = []
12
+ end
13
+
14
+ def load_players(from_file)
15
+ File.readlines(from_file).each do |line|
16
+ name, health = line.split(',')
17
+ player = Player.new(name, Integer(health))
18
+ add_player(player)
19
+ end
20
+ end
21
+
22
+ def add_player(a_player)
23
+ @players.push(a_player)
24
+ end
25
+
26
+ def play(rounds)
27
+ puts "There are #{@players.size} players in #{@title}: "
28
+ @players.each do |player|
29
+ puts player
30
+ end
31
+
32
+ treasures = TreasureTrove::TREASURES
33
+ puts "\nThere are #{treasures.size} treasures to be found:"
34
+ treasures.each do |treasures|
35
+ puts "A #{treasures.name} is worth #{treasures.points} points."
36
+ end
37
+
38
+ 1.upto(rounds) do |round|
39
+ puts "\nRound #{round}:"
40
+ @players.each do |player|
41
+ GameTurn.take_turn(player)
42
+ puts player
43
+ end
44
+ def print_stats
45
+ strong_players = @players.select { |player| player.strong? }
46
+ wimpy_players = @players.reject { |player| player.strong? }
47
+ sorted_players = @players.sort { |a, b| b.score <=> a.score }
48
+ puts "\n#{@title} Statistics:"
49
+ puts "\n#{strong_players.size} strong players:"
50
+ strong_players.each do |player|
51
+ puts "#{player.name} (#{player.health})"
52
+ end
53
+ puts "\n#{wimpy_players.size} wimpy players:"
54
+ wimpy_players.each do |player|
55
+ puts "#{player.name} (#{player.health})"
56
+ end
57
+ puts "\n#{@title} High Scores:"
58
+ @players.sort.each do |player|
59
+ formatted_name = player.name.ljust(20, '.')
60
+ puts "#{formatted_name} #{player.score}"
61
+ end
62
+ @players.each do |player|
63
+ puts "\n#{player.name}'s point totals:"
64
+ puts "#{player.points} grand total points"
65
+ end
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
+ def save_high_scores(to_file="high_scores.txt")
74
+ File.open(to_file, "w") do |file|
75
+ file.puts "#{@title} High Scores:"
76
+ @players.sort.each do |player|
77
+ formatted_name = player.name.ljust(20, '.')
78
+ file.puts "#{formatted_name} #{player.score}"
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,21 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'treasure_trove'
4
+ require_relative 'loaded_die'
5
+ module StudioGame
6
+ module GameTurn
7
+ def self.take_turn(player)
8
+ die = Die.new
9
+ case die.roll
10
+ when 1..2
11
+ player.blam
12
+ when 3..4
13
+ puts "#{player.name} was skipped."
14
+ else
15
+ player.w00t
16
+ end
17
+ treasure = TreasureTrove.random
18
+ player.found_treasure(treasure)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'auditable'
2
+ module StudioGame
3
+ class LoadedDie
4
+ include Auditable
5
+
6
+ attr_reader :number
7
+
8
+ def roll
9
+ numbers = [1, 1, 2, 5, 6, 6]
10
+ @number = numbers.sample
11
+ audit
12
+ @number
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ module StudioGame
2
+ module Playable
3
+ def blam
4
+ @health -= 10
5
+ puts "#{@name} got blammed!"
6
+ end
7
+ def w00t
8
+ @health += 15
9
+ puts "#{@name} got w00ted!"
10
+ end
11
+ def strong?
12
+ @health >= 100
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,47 @@
1
+ require_relative 'game'
2
+ require_relative 'playable'
3
+ module StudioGame
4
+ class Player
5
+ include Playable
6
+ attr_accessor :name
7
+ attr_reader :health
8
+
9
+ def initialize(name, health=100)
10
+ @name= name.capitalize
11
+ @health= health
12
+ @found_treasures = Hash.new(0)
13
+ end
14
+ def score
15
+ @health + points
16
+ end
17
+ def to_s
18
+ "I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}."
19
+ end
20
+ def <=>(other)
21
+ other.score <=> score
22
+ end
23
+ def points
24
+ @found_treasures.values.reduce(0, :+)
25
+ end
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
+ def each_found_treasure
32
+ @found_treasures.each do |name, points|
33
+ yield Treasure.new(name, points)
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ if __FILE__ == $0
40
+ player = Player.new("moe")
41
+ puts player.name
42
+ puts player.health
43
+ player.w00t
44
+ puts player.health
45
+ player.blam
46
+ puts player.health
47
+ end
@@ -0,0 +1,17 @@
1
+ module StudioGame
2
+ Treasure = Struct.new(:name, :points)
3
+ module TreasureTrove
4
+ TREASURES = [
5
+ Treasure.new(:pie, 5),
6
+ Treasure.new(:bottle, 25),
7
+ Treasure.new(:hammer, 50),
8
+ Treasure.new(:skillet, 100),
9
+ Treasure.new(:broomstick, 200),
10
+ Treasure.new(:crowbar, 400)
11
+ ]
12
+
13
+ def self.random
14
+ TREASURES.sample
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,36 @@
1
+ require 'studio_game/berserk_player'
2
+ module StudioGame
3
+ describe BerserkPlayer do
4
+
5
+ before do
6
+ @initial_health = 50
7
+ @player = BerserkPlayer.new("berserker", @initial_health)
8
+ end
9
+
10
+ it "does not go berserk when w00ted up to 5 times" do
11
+ 1.upto(5) { @player.w00t }
12
+
13
+ @player.berserk?.should be_false
14
+
15
+ # or if using Rspec 3.0:
16
+ # @player.berserk?.should be_falsey
17
+ end
18
+
19
+ it "goes berserk when w00ted more than 5 times" do
20
+ 1.upto(6) { @player.w00t }
21
+
22
+ @player.berserk?.should be_true
23
+
24
+ # or if using Rspec 3.0:
25
+ # @player.berserk?.should be_truthy
26
+ end
27
+
28
+ it "gets w00ted instead of blammed when it's gone berserk" do
29
+ 1.upto(6) { @player.w00t }
30
+ 1.upto(2) { @player.blam }
31
+
32
+ @player.health.should == @initial_health + (8 * 15)
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,32 @@
1
+ require 'studio_game/clumsy_player'
2
+ module StudioGame
3
+ describe ClumsyPlayer do
4
+ before do
5
+ @player = ClumsyPlayer.new("klutz")
6
+ end
7
+
8
+ it "only gets half the point value for each treasure" do
9
+ @player.points.should == 0
10
+
11
+ hammer = Treasure.new(:hammer, 50)
12
+ @player.found_treasure(hammer)
13
+ @player.found_treasure(hammer)
14
+ @player.found_treasure(hammer)
15
+
16
+ @player.points.should == 75
17
+
18
+ crowbar = Treasure.new(:crowbar, 400)
19
+ @player.found_treasure(crowbar)
20
+
21
+ @player.points.should == 275
22
+
23
+ yielded = []
24
+ @player.each_found_treasure do |treasure|
25
+ yielded << treasure
26
+ end
27
+
28
+ yielded.should == [Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)]
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,26 @@
1
+ require 'studio_game/game'
2
+ module StudioGame
3
+ describe Game do
4
+ before do
5
+ @game = Game.new("Knuckleheads")
6
+ @health = 100
7
+ @player = Player.new("moe", @health)
8
+ @game.add_player(@player)
9
+ end
10
+ it "wOOts the player if high number is rolled" do
11
+ Die.any_instance.stub(:roll).and_return(5)
12
+ @game.play(2)
13
+ @player.health.should == @health + (15 * 2)
14
+ end
15
+ it "skips the player if a medium number is rolled" do
16
+ Die.any_instance.stub(:roll).and_return(3)
17
+ @game.play(2)
18
+ @player.health.should == @health
19
+ end
20
+ it "Blams the player if a low number is rolled" do
21
+ Die.any_instance.stub(:roll).and_return(1)
22
+ @game.play(2)
23
+ @player.health.should == @health - (10 * 2)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,100 @@
1
+ require 'studio_game/player'
2
+ module StudioGame
3
+ describe Player do
4
+ before do
5
+ @player = Player.new("larry", 150)
6
+ @health = 150
7
+ end
8
+ it "has a capitalized name" do
9
+ @player.name.should == "Larry"
10
+ end
11
+ it "has an initial health" do
12
+ @player.health.should == 150
13
+ end
14
+ it "has a string representation" do
15
+ @player.found_treasure(Treasure.new(:hammer, 50))
16
+ @player.found_treasure(Treasure.new(:hammer, 50))
17
+
18
+ @player.to_s.should == "I'm Larry with health = 150, points = 100, and score = 250."
19
+ end
20
+ it "computes a score as the sum of its health and points" do
21
+ @player.found_treasure(Treasure.new(:hammer, 50))
22
+ @player.found_treasure(Treasure.new(:hammer, 50))
23
+
24
+ @player.score.should == 250
25
+ end
26
+ it "increases health by 15 when w00ted" do
27
+ @player.w00t
28
+ @player.health.should == @health + 15
29
+ end
30
+ it "decreases health by 10 when blammed" do
31
+ @player.blam
32
+ @player.health.should == @health - 10
33
+ end
34
+ it "computes points as the sum of all treasure points" do
35
+ @player.points.should == 0
36
+
37
+ @player.found_treasure(Treasure.new(:hammer, 50))
38
+
39
+ @player.points.should == 50
40
+
41
+ @player.found_treasure(Treasure.new(:crowbar, 400))
42
+
43
+ @player.points.should == 450
44
+
45
+ @player.found_treasure(Treasure.new(:hammer, 50))
46
+
47
+ @player.points.should == 500
48
+ end
49
+ it "yields each found treasure and its total points" do
50
+ @player.found_treasure(Treasure.new(:skillet, 100))
51
+ @player.found_treasure(Treasure.new(:skillet, 100))
52
+ @player.found_treasure(Treasure.new(:hammer, 50))
53
+ @player.found_treasure(Treasure.new(:bottle, 5))
54
+ @player.found_treasure(Treasure.new(:bottle, 5))
55
+ @player.found_treasure(Treasure.new(:bottle, 5))
56
+ @player.found_treasure(Treasure.new(:bottle, 5))
57
+ @player.found_treasure(Treasure.new(:bottle, 5))
58
+
59
+ yielded = []
60
+ @player.each_found_treasure do |treasure|
61
+ yielded << treasure
62
+ end
63
+
64
+ yielded.should == [
65
+ Treasure.new(:skillet, 200),
66
+ Treasure.new(:hammer, 50),
67
+ Treasure.new(:bottle, 25)
68
+ ]
69
+ end
70
+ context "with a health greater than 100" do
71
+ before do
72
+ @player = Player.new("larry", 150)
73
+ end
74
+ it "is strong" do
75
+ @player.should be_strong
76
+ end
77
+ end
78
+ context "with a health of less than 100" do
79
+ before do
80
+ @player = Player.new("moe", 100)
81
+ end
82
+ it "is not strong" do
83
+ @player.should be_strong
84
+ end
85
+ end
86
+ context "in a collection of players" do
87
+ before do
88
+ @player1 = Player.new("moe", 100)
89
+ @player2 = Player.new("larry", 200)
90
+ @player3 = Player.new("curly", 300)
91
+
92
+ @players = [@player1, @player2, @player3]
93
+ end
94
+
95
+ it "is sorted by decreasing score" do
96
+ @players.sort.should == [@player3, @player2, @player1]
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,55 @@
1
+ require 'studio_game/treasure_trove'
2
+ module StudioGame
3
+ describe Treasure do
4
+
5
+ before do
6
+ @treasure = Treasure.new(:hammer, 50)
7
+ end
8
+
9
+ it "has a name attribute" do
10
+ @treasure.name.should == :hammer
11
+ end
12
+
13
+ it "has a points attribute" do
14
+ @treasure.points.should == 50
15
+ end
16
+
17
+ end
18
+
19
+ describe TreasureTrove do
20
+
21
+ it "has six treasures" do
22
+ TreasureTrove::TREASURES.size.should == 6
23
+ end
24
+
25
+ it "has a pie worth 5 points" do
26
+ TreasureTrove::TREASURES[0].should == Treasure.new(:pie, 5)
27
+ end
28
+
29
+ it "has a bottle worth 25 points" do
30
+ TreasureTrove::TREASURES[1].should == Treasure.new(:bottle, 25)
31
+ end
32
+
33
+ it "has a hammer worth 50 points" do
34
+ TreasureTrove::TREASURES[2].should == Treasure.new(:hammer, 50)
35
+ end
36
+
37
+ it "has a skillet worth 100 points" do
38
+ TreasureTrove::TREASURES[3].should == Treasure.new(:skillet, 100)
39
+ end
40
+
41
+ it "has a broomstick worth 200 points" do
42
+ TreasureTrove::TREASURES[4].should == Treasure.new(:broomstick, 200)
43
+ end
44
+
45
+ it "has a crowbar worth 400 points" do
46
+ TreasureTrove::TREASURES[5].should == Treasure.new(:crowbar, 400)
47
+ end
48
+
49
+ it "returns a random treasure" do
50
+ treasure = TreasureTrove.random
51
+
52
+ TreasureTrove::TREASURES.should include(treasure)
53
+ end
54
+ end
55
+ end
metadata ADDED
@@ -0,0 +1,82 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: knuckleheads1313
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ajax
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2018-08-06 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
+ email: fake@fake.com
29
+ executables:
30
+ - studio_game
31
+ extensions: []
32
+ extra_rdoc_files: []
33
+ files:
34
+ - LICENSE
35
+ - README
36
+ - bin/players.csv
37
+ - bin/studio_game
38
+ - lib/studio_game/auditable.rb
39
+ - lib/studio_game/berserk_player.rb
40
+ - lib/studio_game/clumsy_player.rb
41
+ - lib/studio_game/die.rb
42
+ - lib/studio_game/game.rb
43
+ - lib/studio_game/game_turn.rb
44
+ - lib/studio_game/loaded_die.rb
45
+ - lib/studio_game/playable.rb
46
+ - lib/studio_game/player.rb
47
+ - lib/studio_game/treasure_trove.rb
48
+ - spec/studio_game/berserk_player_spec.rb
49
+ - spec/studio_game/clumsy_player_spec.rb
50
+ - spec/studio_game/game_spec.rb
51
+ - spec/studio_game/player_spec.rb
52
+ - spec/studio_game/treasure_trove_spec.rb
53
+ homepage: https://www.fake.com
54
+ licenses:
55
+ - MIT
56
+ metadata: {}
57
+ post_install_message:
58
+ rdoc_options: []
59
+ require_paths:
60
+ - lib
61
+ required_ruby_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: '1.9'
66
+ required_rubygems_version: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ requirements: []
72
+ rubyforge_project:
73
+ rubygems_version: 2.5.2
74
+ signing_key:
75
+ specification_version: 4
76
+ summary: minimilistic die roll game
77
+ test_files:
78
+ - spec/studio_game/berserk_player_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