ruby_studio_game_km 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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 93d76b922214ef5bfd87e73d914ae50a1197f791e678dcb7e1214159d2582e22
4
+ data.tar.gz: 9e7afed69bef1bbccee2667a69391e7a9b77f8ac57ee646b823202f77c825209
5
+ SHA512:
6
+ metadata.gz: 5ff79b27e14532b4b99d5ee2d8bab4226e8893762edc01c442383aeadbb4b1296bf1fa367e44f08ecd5191b77631c19087991e2462916a33be9ce1cd3b43e076
7
+ data.tar.gz: 4c63b226bf993a849d6519d537d7837ef674e3b3b529a97e666d2733b6601709c438088714328f446d025d86a1b60efdd65dac4b22e6128f83993aaf9d91f4f2
data/LICENSE ADDED
@@ -0,0 +1 @@
1
+ ???? SOMETHNING SHOULD GO HERE YEAH ????
data/README ADDED
@@ -0,0 +1 @@
1
+ Absolutely should make a proper read me for my first Ruby repository. TBD.
data/bin/players.csv ADDED
@@ -0,0 +1,3 @@
1
+ Alvin,100
2
+ Simon,60
3
+ Theo,125
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
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
+ klutz = StudioGame::ClumsyPlayer.new('klutz', 105)
11
+ knuckleheads.add_player(klutz)
12
+ berserker = StudioGame::BerserkPlayer.new('berserker', 50)
13
+ knuckleheads.add_player(berserker)
14
+
15
+ loop do
16
+ puts "\nHow many game rounds? ('quit' to exit)"
17
+ answer = gets.chomp.downcase
18
+ case answer
19
+ when /^\d+$/
20
+ knuckleheads.play(answer.to_i) do
21
+ if knuckleheads.total_points < 10_000
22
+ knuckleheads.total_points >= 10_000
23
+ else
24
+ puts "Points have exceeded 2000, please exit by typing 'quit'."
25
+ break
26
+ end
27
+ end
28
+ when 'quit', 'exit'
29
+ knuckleheads.print_stats
30
+ break
31
+ else
32
+ puts "Please enter a number or 'quit'."
33
+ end
34
+ end
35
+
36
+ knuckleheads.sav_high_scores
37
+
38
+ # OLD CODE BELOW THIS POINT
39
+
40
+ # name1 = "larry"
41
+ # health1 = 60
42
+ # name2 = "curly"
43
+ # health2 = 125
44
+ # name3 = "moe"
45
+ # health3 = 100
46
+ # name4 = "shemp"
47
+ # health4 = 90
48
+
49
+ # puts "#{name1.capitalize} has a health of #{health1}."
50
+
51
+ # puts "#{name2.upcase} has a health of #{health2}."
52
+
53
+ # health2 = health1
54
+
55
+ # puts "#{name2.upcase} has a health of #{health2}."
56
+
57
+ # health1 = 30
58
+
59
+ # puts "#{name1.capitalize} has a health of #{health1}."
60
+
61
+ # puts "#{name2.upcase} has a health of #{health2}."
62
+
63
+ # moe_text = "#{name3.capitalize} has a health of #{health3}."
64
+ # puts moe_text.center(50, '*')
65
+
66
+ # formatted_name = name4.capitalize.ljust(30, '.')
67
+ # puts "#{formatted_name} #{health4} health"
68
+ # # OR
69
+ # puts "#{name4.capitalize.ljust(30, '.')} #{health4} health"
70
+
71
+ # current_time = Time.new
72
+ # formatted_time = current_time.strftime("%A %m/%d/%Y at %I:%M%p")
73
+ # puts "The game started on #{formatted_time}."
74
+
75
+ # ************** Starting over here ********************
76
+
77
+ # def time_of_day
78
+ # current_time = Time.new
79
+ # current_time.strftime("%I:%M:%S%p")
80
+ # end
81
+
82
+ # def say_hello(name, health=100)
83
+ # "I'm #{name.capitalize} with a health of #{health} as of #{time_of_day}."
84
+ # end
85
+
86
+ # puts say_hello('larry', 60)
87
+ # puts say_hello('curly', 125)
88
+ # puts say_hello('moe')
89
+ # puts say_hello('shemp', 90)
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ # wrapper for our gem
4
+ module StudioGame
5
+ # audits the die rolls for the game
6
+ module Auditable
7
+ def audit
8
+ puts "Rolled a #{self.number} (#{self.class})"
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'player'
4
+
5
+ # wrapping paper
6
+ module StudioGame
7
+ # subclass for berserk players, after 6 w00ts he becomes so excited blamming him will
8
+ # only increase his health. he becomes unstoppable
9
+ class BerserkPlayer < Player
10
+ def initialize(name, health = 100)
11
+ super(name, health)
12
+ @w00t_count = 0
13
+ end
14
+
15
+ def berserk?
16
+ @w00t_count > 5
17
+ end
18
+
19
+ def w00t
20
+ super
21
+ @w00t_count += 1
22
+ puts "#{@name} is berserk!" if berserk?
23
+ end
24
+
25
+ def blam
26
+ berserk? ? w00t : super
27
+ end
28
+ end
29
+ end
30
+
31
+ if __FILE__ == $PROGRAM_NAME
32
+ berserker = BerserkPlayer.new('berserker', 50)
33
+ 6.times { berserker.w00t }
34
+ 2.times { berserker.blam }
35
+ puts berserker.health
36
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'player'
4
+
5
+ # wrapping
6
+ module StudioGame
7
+ # subclass of the player class, this is a clumsy player. he gets half points for
8
+ # for each treasure he finds
9
+ class ClumsyPlayer < Player
10
+ attr_reader :boost_factor
11
+
12
+ def initialize(name, health = 100, boost_factor = 1)
13
+ super(name, health)
14
+ @boost_factor = boost_factor
15
+ end
16
+
17
+ def w00t
18
+ @boost_factor.times { super }
19
+ end
20
+
21
+ def found_treasure(treasure)
22
+ damaged_treasure = Treasure.new(treasure.name, treasure.points / 2.0)
23
+ super(damaged_treasure)
24
+ end
25
+ end
26
+ end
27
+
28
+ if __FILE__ == $PROGRAM_NAME
29
+ clumsy = ClumsyPlayer.new('klutz')
30
+
31
+ hammer = Treasure.new(:hammer, 50)
32
+ clumsy.found_treasure(hammer)
33
+ clumsy.found_treasure(hammer)
34
+ clumsy.found_treasure(hammer)
35
+
36
+ crowbar = Treasure.new(:crowbar, 400)
37
+ clumsy.found_treasure(crowbar)
38
+
39
+ clumsy.each_found_treasure do |treasure|
40
+ puts "#{treasure.points} total #{treasure.name} points"
41
+ end
42
+ puts "#{clumsy.points} grand total points"
43
+ end
44
+
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'auditable'
4
+
5
+ # wrapping
6
+ module StudioGame
7
+ # rolls a dice
8
+ class Die
9
+ include Auditable
10
+
11
+ MIN_VALUE = 1
12
+ MAX_VALUE = 10
13
+
14
+ attr_reader :number
15
+
16
+ def roll
17
+ @number = rand(MIN_VALUE..MAX_VALUE)
18
+ audit
19
+ @number
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,115 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'player'
4
+ require_relative 'die'
5
+ require_relative 'game_turn'
6
+ require_relative 'treasure_trove'
7
+
8
+ # wrapping
9
+ module StudioGame
10
+ # game class that includes the title of the game where players then get assigned to that game
11
+ class Game
12
+ attr_reader :title
13
+
14
+ def initialize(title)
15
+ @title = title
16
+ @players = []
17
+ end
18
+
19
+ def load_players(from_file)
20
+ File.readlines(from_file).each do |line|
21
+ add_player(Player.from_csv(line))
22
+ end
23
+ end
24
+
25
+ def add_player(player)
26
+ @players << player
27
+ end
28
+
29
+ def play(rounds)
30
+ puts "\nThere are #{@players.length} players in #{@title} with #{rounds} rounds:"
31
+
32
+ 1.upto(rounds) do |count|
33
+ if block_given?
34
+ break if yield
35
+ end
36
+ puts "\nRound #{count}"
37
+ @players.each do |player|
38
+ GameTurn.take_turn(player)
39
+ end
40
+ end
41
+
42
+ treasures = TreasureTrove::TREASURES
43
+
44
+ puts "\nThere are #{treasures.length} treasures available:"
45
+
46
+ treasures.each do |treasure|
47
+ puts "A #{treasure.name} is worth #{treasure.points} points."
48
+ end
49
+ end
50
+
51
+ def player_name_health(player)
52
+ puts "#{player.name} (#{player.health})"
53
+ end
54
+
55
+ def print_stats
56
+ strong_players, wimpy_players = @players.partition(&:strong?)
57
+
58
+ puts "\n#{@title} Statistics:"
59
+
60
+ puts "\n#{strong_players.length} strong players:"
61
+ strong_players.each do |player|
62
+ player_name_health(player)
63
+ end
64
+
65
+ puts "\n#{wimpy_players.length} wimpy players:"
66
+ wimpy_players.each do |player|
67
+ player_name_health(player)
68
+ end
69
+
70
+ puts "\n#{@title} High Scores:"
71
+ @players.sort.each do |player|
72
+ puts high_score_entry(player)
73
+ end
74
+
75
+ puts "\nPlayer treasure point totals:"
76
+ @players.sort.each do |player|
77
+ puts "\n#{player.name.center(20, '_')}"
78
+ player.each_found_treasure do |treasure|
79
+ formatted_treasure_name = treasure.name.to_s.capitalize.ljust(15)
80
+ puts "#{formatted_treasure_name}: #{treasure.points}"
81
+ end
82
+ formatted_name = 'Total Points'.ljust(15)
83
+ puts '-'.center(20, '-')
84
+ puts "#{formatted_name}: #{player.points}"
85
+ end
86
+
87
+ puts "\n#{total_points} total points from treasures found."
88
+ end
89
+
90
+ def total_points
91
+ @players.reduce(0) { |sum, player| sum + player.points }
92
+ end
93
+
94
+ def sav_high_scores(file_name = 'high_scores.txt')
95
+ File.open(file_name, 'w') do |file|
96
+ file.puts "#{@title} High Scores:"
97
+ @players.sort.each do |player|
98
+ file.puts high_score_entry(player)
99
+ end
100
+ end
101
+ end
102
+
103
+ def high_score_entry(player)
104
+ formatted_name = player.name.ljust(20, '.')
105
+ "#{formatted_name} #{player.score}"
106
+ end
107
+ end
108
+ end
109
+
110
+ if __FILE__ == $PROGRAM_NAME
111
+ boston = Game.new('boston')
112
+ player1 = Player.new('moe')
113
+ puts boston.add_player(player1)
114
+ puts boston.play(2)
115
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'die'
4
+ require_relative 'loaded_die'
5
+ require_relative 'player'
6
+ require_relative 'treasure_trove'
7
+
8
+ # wrapping
9
+ module StudioGame
10
+ # handles the randomness of every games turn
11
+ module GameTurn
12
+ MIN_VALUE = 1
13
+ MAX_VALUE = 10
14
+ def self.take_turn(player)
15
+ roll = Die.new.roll
16
+ case roll
17
+ when MIN_VALUE..MAX_VALUE / 3
18
+ player.blam
19
+ when MAX_VALUE / 3 + 1..MAX_VALUE / 3 * 2
20
+ puts "#{player.name} was skipped."
21
+ else
22
+ player.w00t
23
+ end
24
+
25
+ treasure = TreasureTrove.random
26
+ player.found_treasure(treasure)
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'auditable'
4
+
5
+ # wrapping
6
+ module StudioGame
7
+ # loaded die class to check if the commision is paying attention
8
+ class LoadedDie
9
+ include Auditable
10
+
11
+ attr_reader :number
12
+
13
+ def roll
14
+ numbers = [1, 1, 2, 5, 6, 7, 9, 10]
15
+ @number = numbers.sample
16
+ audit
17
+ @number
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ # wrapping
4
+ module StudioGame
5
+ # module for all the reusable methods
6
+ module Playable
7
+ def w00t
8
+ self.health += 15
9
+ puts "#{name} got w00ted!"
10
+ end
11
+
12
+ def blam
13
+ self.health -= 10
14
+ puts "#{name} got blammed!"
15
+ end
16
+
17
+ def strong?
18
+ health > 100
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'treasure_trove'
4
+ require_relative 'playable'
5
+
6
+ # wrapping
7
+ module StudioGame
8
+ # player class that includes both health and the name of the player
9
+ class Player
10
+ include Playable
11
+
12
+ attr_reader :name
13
+ attr_accessor :health
14
+
15
+ # because we're using name= we don't need a getter and setter for name, we only need a getter
16
+ # attr_accessor :name
17
+
18
+ # initialize doesn't need to be called, it magically happens when a new class object is
19
+ # created, here you store the instance variables that you want to use later on in the class
20
+ def initialize(name, health = 100)
21
+ @name = name.capitalize
22
+ @health = health
23
+ @found_treasures = Hash.new(0)
24
+ end
25
+
26
+ def self.from_csv(string)
27
+ name, health = string.split(',')
28
+ Player.new(name, Integer(health))
29
+ end
30
+
31
+ def score
32
+ @health + points
33
+ end
34
+
35
+ # you can override the accessor by defining a name= method, this way you can capitalize any input
36
+ # you recieve
37
+ def name=(new_name)
38
+ @name = new_name.capitalize
39
+ end
40
+
41
+ # to_s returns a string whenever the class is called, the string will ALWAYS be returned
42
+ # without having to specifically ask for it
43
+ def to_s
44
+ "I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}."
45
+ end
46
+
47
+ def <=>(other)
48
+ other.score <=> score
49
+ end
50
+
51
+ def found_treasure(treasure)
52
+ @found_treasures[treasure.name] += treasure.points
53
+ puts "#{@name} found a #{treasure.name} worth #{treasure.points} points."
54
+ puts "#{@name}'s treasures: #{@found_treasures}"
55
+ end
56
+
57
+ def each_found_treasure
58
+ @found_treasures.each do |name, points|
59
+ treasure = Treasure.new(name, points)
60
+ yield treasure
61
+ end
62
+ end
63
+
64
+ def points
65
+ @found_treasures.values.reduce(0, :+)
66
+ end
67
+ end
68
+ end
69
+
70
+ if __FILE__ == $PROGRAM_NAME
71
+ player = Player.new('moe')
72
+ puts player.name
73
+ puts player.health
74
+ player.w00t
75
+ puts player.health
76
+ player.blam
77
+ puts player.health
78
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ # wrapping
4
+ module StudioGame
5
+ Treasure = Struct.new(:name, :points)
6
+
7
+ # this is where i would keep my trophy, IF I HAD ONE
8
+ module TreasureTrove
9
+ TREASURES = [
10
+ Treasure.new(:pie, 5),
11
+ Treasure.new(:bottle, 25),
12
+ Treasure.new(:hammer, 50),
13
+ Treasure.new(:skillet, 100),
14
+ Treasure.new(:broomstick, 200),
15
+ Treasure.new(:crowbar, 400)
16
+ ].freeze
17
+
18
+ def self.random
19
+ TREASURES.sample
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'studio_game/berserk_player'
4
+
5
+ # wrapper for our gem
6
+ module StudioGame
7
+ describe BerserkPlayer do
8
+ before do
9
+ @initial_health = 50
10
+ @player = BerserkPlayer.new('berserker', @initial_health)
11
+ end
12
+
13
+ it 'does not go berserk when w00ted up to 5 times' do
14
+ 1.upto(5) { @player.w00t }
15
+
16
+ expect(@player.berserk?).to be_falsey
17
+ end
18
+
19
+ it 'goes berserk when w00ted more than 5 times' do
20
+ 1.upto(6) { @player.w00t }
21
+
22
+ expect(@player.berserk?).to be_truthy
23
+ end
24
+
25
+ it 'gets w00ted instead of blammed when its gone berserk' do
26
+ 1.upto(6) { @player.w00t }
27
+ 1.upto(2) { @player.blam }
28
+
29
+ expect(@player.health).to eq(@initial_health + (8 * 15))
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'studio_game/clumsy_player'
4
+
5
+ # wrapping
6
+ module StudioGame
7
+ describe ClumsyPlayer do
8
+ before do
9
+ @player = ClumsyPlayer.new('klutz')
10
+ end
11
+
12
+ it 'only gets half the point value for each treasure' do
13
+ expect(@player.points).to eq(0)
14
+
15
+ hammer = Treasure.new(:hammer, 50)
16
+ @player.found_treasure(hammer)
17
+ @player.found_treasure(hammer)
18
+ @player.found_treasure(hammer)
19
+
20
+ expect(@player.points).to eq(75)
21
+
22
+ crowbar = Treasure.new(:crowbar, 400)
23
+ @player.found_treasure(crowbar)
24
+
25
+ expect(@player.points).to eq(275)
26
+
27
+ yielded = []
28
+ @player.each_found_treasure do |treasure|
29
+ yielded << treasure
30
+ end
31
+
32
+ expect(yielded).to eq(
33
+ [
34
+ Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)
35
+ ]
36
+ )
37
+ end
38
+
39
+ context 'with a boost factor' do
40
+ before do
41
+ @initial_health = 100
42
+ @boost_factor = 5
43
+ @player = ClumsyPlayer.new('klutz', @initial_health, @boost_factor)
44
+ end
45
+
46
+ it 'has a boost factor' do
47
+ expect(@player.boost_factor).to eq(5)
48
+ end
49
+
50
+ it 'gets boost factor number of w00ts when w00ted' do
51
+ @player.w00t
52
+
53
+ expect(@player.health).to eq(@initial_health + (15 * @boost_factor))
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'studio_game/die'
4
+
5
+ # wrapping
6
+ module StudioGame
7
+ describe Die do
8
+ describe '#roll' do
9
+ subject { Die.new.roll }
10
+
11
+ it 'returns a number' do
12
+ expect(subject).to be_a Integer
13
+ expect(subject).to be_between(Die::MIN_VALUE, Die::MAX_VALUE).inclusive
14
+ end
15
+ end
16
+
17
+ describe '#number' do
18
+ context 'when Die has been rolled' do
19
+ it 'returns the number value' do
20
+ subject.roll
21
+ expect(subject.number).to_not eq nil
22
+ expect(subject.number).to be_a Integer
23
+ end
24
+ end
25
+ context "when it hasn't been rolled" do
26
+ subject { Die.new.number }
27
+ it { is_expected.to eq nil }
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,63 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'studio_game/game'
4
+
5
+ # wrapping
6
+ module StudioGame
7
+ describe Game do
8
+ let(:game) { Game.new('Knuckleheads') }
9
+ let(:initial_health) { 100 }
10
+ let(:player) { Player.new('moe', initial_health) }
11
+
12
+ before do
13
+ game.add_player(player)
14
+ $stdout = StringIO.new
15
+ end
16
+
17
+ it 'w00ts when a high number is rolled' do
18
+ # same code, bottom one for RSpec 3
19
+ # Die.any_instance.stub(:roll).and_return(5)
20
+ allow_any_instance_of(Die).to receive(:roll).and_return(10)
21
+
22
+ game.play(1)
23
+
24
+ expect(player.health).to eq(initial_health + 15)
25
+ end
26
+
27
+ it 'skips a player when a medium number is rolled' do
28
+ allow_any_instance_of(Die).to receive(:roll).and_return(6)
29
+
30
+ game.play(1)
31
+
32
+ expect(player.health).to eq(initial_health)
33
+ end
34
+
35
+ it 'blams a player when a low number is rolled' do
36
+ allow_any_instance_of(Die).to receive(:roll).and_return(1)
37
+
38
+ game.play(1)
39
+
40
+ expect(player.health).to eq(initial_health - 10)
41
+ end
42
+
43
+ it "assigns a treasure for points during a player's turn" do
44
+ game.play(1)
45
+
46
+ expect(player.points).not_to be_zero
47
+ end
48
+
49
+ it 'computes total points as the sum of all player points' do
50
+ player1 = Player.new('moe')
51
+ player2 = Player.new('larry')
52
+
53
+ game.add_player(player1)
54
+ game.add_player(player2)
55
+
56
+ player1.found_treasure(Treasure.new(:hammer, 50))
57
+ player1.found_treasure(Treasure.new(:hammer, 50))
58
+ player2.found_treasure(Treasure.new(:crowbar, 400))
59
+
60
+ expect(game.total_points).to eq(500)
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,135 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'studio_game/player'
4
+
5
+ # wrapping
6
+ module StudioGame
7
+ describe Player do
8
+ before do
9
+ $stdout = StringIO.new
10
+ @initial_health = 150
11
+ @player = Player.new('larry', @initial_health)
12
+ end
13
+
14
+ it 'has a capitalized name' do
15
+ # player.name.should == 'Larry'
16
+ # these are the same ^v
17
+ expect(@player.name).to eq('Larry')
18
+ end
19
+
20
+ it 'has an initial health' do
21
+ expect(@player.health).to eq(@initial_health)
22
+ end
23
+
24
+ it 'has a string representation' do
25
+ @player.found_treasure(Treasure.new(:hammer, 50))
26
+ @player.found_treasure(Treasure.new(:hammer, 50))
27
+
28
+ expect(@player.to_s).to eq(
29
+ "I'm Larry with health = #{@initial_health}, points = 100, and score = #{@initial_health + 100}."
30
+ )
31
+ end
32
+
33
+ it 'computes a score as the sum of its health and points' do
34
+ @player.found_treasure(Treasure.new(:hammer, 50))
35
+ @player.found_treasure(Treasure.new(:hammer, 50))
36
+
37
+ expect(@player.score).to eq(@initial_health + 100)
38
+ end
39
+
40
+ it 'increases health by 15 when w00ted' do
41
+ @player.w00t
42
+
43
+ expect(@player.health).to eq(@initial_health + 15)
44
+ end
45
+
46
+ it 'decreases health by 10 when blammed' do
47
+ @player.blam
48
+
49
+ expect(@player.health).to eq(@initial_health - 10)
50
+ end
51
+
52
+ context 'with a health > 100' do
53
+ before do
54
+ @initial_health = 150
55
+ @player = Player.new('shemp', @initial_health)
56
+ end
57
+
58
+ it 'is strong' do
59
+ expect(@player).to be_strong
60
+ end
61
+ end
62
+
63
+ context 'with a health <= 100' do
64
+ before do
65
+ @initial_health = 100
66
+ @player = Player.new('shemp', @initial_health)
67
+ end
68
+
69
+ it 'is wimpy' do
70
+ expect(@player).not_to be_strong
71
+ end
72
+ end
73
+
74
+ context 'in a collection of players' do
75
+ before do
76
+ @player1 = Player.new('moe', 100)
77
+ @player2 = Player.new('larry', 200)
78
+ @player3 = Player.new('curly', 300)
79
+
80
+ @players = [@player1, @player2, @player3]
81
+ end
82
+
83
+ it 'is sorted by decreasing score' do
84
+ @players.sort.should == [@player3, @player2, @player1]
85
+ end
86
+ end
87
+
88
+ it 'computes points as the sum of all treasure points' do
89
+ expect(@player.points).to eq(0)
90
+
91
+ @player.found_treasure(Treasure.new(:hammer, 50))
92
+
93
+ expect(@player.points).to eq(50)
94
+
95
+ @player.found_treasure(Treasure.new(:crowbar, 400))
96
+
97
+ expect(@player.points).to eq(450)
98
+
99
+ @player.found_treasure(Treasure.new(:hammer, 50))
100
+
101
+ expect(@player.points).to eq(500)
102
+ end
103
+
104
+ it 'yields each found treasure and its total points' do
105
+ @player.found_treasure(Treasure.new(:skillet, 100))
106
+ @player.found_treasure(Treasure.new(:skillet, 100))
107
+ @player.found_treasure(Treasure.new(:hammer, 50))
108
+ @player.found_treasure(Treasure.new(:bottle, 5))
109
+ @player.found_treasure(Treasure.new(:bottle, 5))
110
+ @player.found_treasure(Treasure.new(:bottle, 5))
111
+ @player.found_treasure(Treasure.new(:bottle, 5))
112
+ @player.found_treasure(Treasure.new(:bottle, 5))
113
+
114
+ yielded = []
115
+ @player.each_found_treasure do |treasure|
116
+ yielded << treasure
117
+ end
118
+
119
+ expect(yielded).to eq(
120
+ [
121
+ Treasure.new(:skillet, 200),
122
+ Treasure.new(:hammer, 50),
123
+ Treasure.new(:bottle, 25)
124
+ ]
125
+ )
126
+ end
127
+
128
+ it 'can create a player object from csv string' do
129
+ player = Player.from_csv('larry,150')
130
+
131
+ expect(player.name).to eq('Larry')
132
+ expect(player.health).to eq(150)
133
+ end
134
+ end
135
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'studio_game/treasure_trove'
4
+
5
+ # wrapping
6
+ module StudioGame
7
+ describe Treasure do
8
+ before do
9
+ @treasure = Treasure.new(:hammer, 50)
10
+ end
11
+
12
+ it 'has a name attribute' do
13
+ expect(@treasure.name).to eq(:hammer)
14
+ end
15
+
16
+ it 'has a points attribute' do
17
+ expect(@treasure.points).to eq(50)
18
+ end
19
+ end
20
+
21
+ describe TreasureTrove do
22
+ it 'has six treasures' 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
+
53
+ expect(TreasureTrove::TREASURES).to include(treasure)
54
+ end
55
+ end
56
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby_studio_game_km
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Kayla Mir
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-25 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: '2.8'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.8.0
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.8'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.8.0
33
+ description: Absolutely should make a proper read me for my first Ruby repository.
34
+ TBD.
35
+ email: kayla.mir@kajabi.com
36
+ executables: []
37
+ extensions: []
38
+ extra_rdoc_files: []
39
+ files:
40
+ - LICENSE
41
+ - README
42
+ - bin/players.csv
43
+ - bin/studio_game.rb
44
+ - lib/studio_game/auditable.rb
45
+ - lib/studio_game/berserk_player.rb
46
+ - lib/studio_game/clumsy_player.rb
47
+ - lib/studio_game/die.rb
48
+ - lib/studio_game/game.rb
49
+ - lib/studio_game/game_turn.rb
50
+ - lib/studio_game/loaded_die.rb
51
+ - lib/studio_game/playable.rb
52
+ - lib/studio_game/player.rb
53
+ - lib/studio_game/treasure_trove.rb
54
+ - spec/studio_game/berserk_player_spec.rb
55
+ - spec/studio_game/clumsy_player_spec.rb
56
+ - spec/studio_game/die_spec.rb
57
+ - spec/studio_game/game_spec.rb
58
+ - spec/studio_game/player_spec.rb
59
+ - spec/studio_game/treasure_trove_spec.rb
60
+ homepage: https://github.com/Kayla-Mir
61
+ licenses:
62
+ - MIT
63
+ metadata: {}
64
+ post_install_message:
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '2.5'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubygems_version: 3.2.22
80
+ signing_key:
81
+ specification_version: 4
82
+ summary: My first Ruby project!
83
+ test_files:
84
+ - spec/studio_game/berserk_player_spec.rb
85
+ - spec/studio_game/clumsy_player_spec.rb
86
+ - spec/studio_game/die_spec.rb
87
+ - spec/studio_game/game_spec.rb
88
+ - spec/studio_game/player_spec.rb
89
+ - spec/studio_game/treasure_trove_spec.rb