studio_game_3424 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: 7fb687b0662803806c3c8358371a47bafbc9b5eb4e10b5834ad0dfc3735e99ad
4
+ data.tar.gz: 9a1146edba2d376dd6691a3809e093eee0af370a9640e13d732bcf5328ca93d7
5
+ SHA512:
6
+ metadata.gz: f6e8284ab6faecd73e8ef69d7a2eb952f08a4e7347ef5497230b543149dd8cd01ac29651d980a8e3ac0763656e1be4a0dedd92adb09edd162d168860f82ee3ce
7
+ data.tar.gz: 3f284b1afe2ca67a1140993cf6b84db03cd8c6dd5753b561fe073a6e0b788444a13b2d513c8772b7e0399370af82457fbaec8b6f56be29d0b3eac3ebe7a6cd40
data/LICENSE.txt ADDED
File without changes
data/README.md ADDED
File without changes
data/bin/players.csv ADDED
@@ -0,0 +1,5 @@
1
+ Starlord,50
2
+ Gamora,75
3
+ Rocket,100
4
+ Drax, 125
5
+ Groot,80
data/bin/studio_game ADDED
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/studio_game/player"
4
+ require_relative "../lib/studio_game/game"
5
+ require_relative "../lib/studio_game/clumsy_player"
6
+ require_relative "../lib/studio_game/berserk_player"
7
+
8
+ game = StudioGame::Game.new("Guardians")
9
+ players_file = File.join(__dir__, "players.csv")
10
+ game.load_players(ARGV.shift || players_file)
11
+
12
+ clumsy = StudioGame::ClumsyPlayer.new("klutz", 105, 8)
13
+ game.add_player(clumsy)
14
+
15
+ berserker = StudioGame::BerserkPlayer.new("berserker", 50)
16
+ game.add_player(berserker)
17
+
18
+ loop do
19
+ print "\nHow many game rounds? ('quit' to exit) "
20
+ answer = gets.chomp.downcase
21
+
22
+ case answer
23
+ when /^\d+$/
24
+ game.play(answer.to_i)
25
+ when "quit", "exit"
26
+ game.print_stats
27
+ break
28
+ else
29
+ puts "Please enter a number or 'quit'"
30
+ end
31
+ end
32
+
33
+ game.save_high_scores
@@ -0,0 +1,8 @@
1
+ module StudioGame
2
+ module Auditable
3
+
4
+ def audit(number)
5
+ puts "Audit: Rolled a #{number}"
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,33 @@
1
+ require_relative "player"
2
+
3
+ module StudioGame
4
+ class BerserkPlayer < Player
5
+
6
+ def initialize(name, health = 100)
7
+ super(name, health)
8
+ @boost_count = 0
9
+ end
10
+
11
+ def berserk?
12
+ @boost_count > 5
13
+ end
14
+
15
+ def boost
16
+ super
17
+ @boost_count += 1
18
+ puts "#{@name} is berserk!" if berserk?
19
+ end
20
+
21
+ def drain
22
+ berserk? ? boost : super
23
+ end
24
+
25
+ end
26
+
27
+ if __FILE__ == $0
28
+ berserker = BerserkPlayer.new("berserker", 50)
29
+ 6.times { berserker.boost }
30
+ 2.times { berserker.drain }
31
+ puts berserker.health
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ require_relative "player"
2
+
3
+ module StudioGame
4
+ class ClumsyPlayer < Player
5
+ attr_reader :boost_factor
6
+
7
+ def initialize(name, health = 100, boost_factor = 1)
8
+ super(name, health)
9
+ @boost_factor = boost_factor
10
+ end
11
+
12
+ def found_treasure(name, points)
13
+ points = points / 2
14
+ super(name, points)
15
+ end
16
+
17
+ def boost
18
+ @boost_factor.times { super }
19
+ end
20
+
21
+ end
22
+
23
+ if __FILE__ == $0
24
+ clumsy = ClumsyPlayer.new("klutz")
25
+
26
+ clumsy.found_treasure("flute", 50)
27
+ clumsy.found_treasure("flute", 50)
28
+ clumsy.found_treasure("flute", 50)
29
+ clumsy.found_treasure("star", 100)
30
+
31
+ clumsy.found_treasures.each do |name, points|
32
+ puts "#{name}: #{points} points"
33
+ end
34
+ puts "#{clumsy.points} total points"
35
+ end
36
+ end
@@ -0,0 +1,110 @@
1
+ require_relative "treasure_trove"
2
+ require_relative "auditable"
3
+
4
+ module StudioGame
5
+ class Game
6
+ include Auditable
7
+
8
+ attr_reader :title, :players
9
+
10
+ def initialize(title)
11
+ @title = title
12
+ @players = []
13
+ end
14
+
15
+ def load_players(from_file)
16
+ File.readlines(from_file, chomp: true).each do |line|
17
+ player = Player.from_csv(line)
18
+ add_player(player)
19
+ end
20
+ rescue Errno::ENOENT
21
+ puts "#{from_file} could not be found."
22
+ exit 1
23
+ end
24
+
25
+ def save_high_scores(to_file = "high_scores.txt")
26
+ File.open(to_file, "w") do |file|
27
+ file.puts "#{@title} High Scores:"
28
+ sorted_players.each do |player|
29
+ file.puts high_score_entry(player)
30
+ end
31
+ end
32
+ end
33
+
34
+ def high_score_entry(player)
35
+ name = player.name.ljust(20, ".")
36
+ points = player.score.round.to_s.rjust(5)
37
+ "#{name}#{points}"
38
+ end
39
+
40
+ def add_player(player)
41
+ @players << player
42
+ end
43
+
44
+ def roll_die
45
+ rolled_number = rand(1..6)
46
+ audit(rolled_number)
47
+ rolled_number
48
+ end
49
+
50
+ def sorted_players
51
+ @players.sort_by { |player| player.score }.reverse
52
+ end
53
+
54
+ def print_stats
55
+ puts "\n#{@title} Game Stats:"
56
+ puts "-" * 30
57
+
58
+ puts sorted_players
59
+
60
+ @players.each do |player|
61
+ puts "\n#{player.name}'s treasure point totals:"
62
+ player.found_treasures.each do |name, points|
63
+ puts "#{name}: #{points}"
64
+ end
65
+ puts "total: #{player.points}"
66
+ end
67
+
68
+ puts "\nHigh Scores:"
69
+ sorted_players.each do |player|
70
+ puts high_score_entry(player)
71
+ end
72
+ end
73
+
74
+ def play(rounds = 1)
75
+ puts "\nLet's play #{@title}!"
76
+
77
+ puts "\nThe following treasures can be found:"
78
+ puts TreasureTrove.treasure_items
79
+
80
+ puts "\nBefore playing:"
81
+ puts @players
82
+
83
+ 1.upto(rounds) do |round|
84
+ puts "\nRound #{round}:"
85
+
86
+ @players.each do |player|
87
+ number_rolled = roll_die
88
+
89
+ case number_rolled
90
+ when 1..2
91
+ player.drain
92
+ puts "#{player.name} got drained 😩"
93
+ when 3..4
94
+ puts "#{player.name} got skipped"
95
+ else
96
+ player.boost
97
+ puts "#{player.name} got boosted 😁"
98
+ end
99
+
100
+ treasure = TreasureTrove.random_treasure
101
+ player.found_treasure(treasure.name, treasure.points)
102
+ puts "#{player.name} found a #{treasure.name} worth #{treasure.points} points"
103
+ end
104
+ end
105
+
106
+ puts "\nAfter playing:"
107
+ puts @players
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,11 @@
1
+ module StudioGame
2
+ module Playable
3
+ def drain
4
+ self.health -= 10
5
+ end
6
+
7
+ def boost
8
+ self.health += 15
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,52 @@
1
+ require_relative "playable"
2
+
3
+ module StudioGame
4
+ class Player
5
+ include Playable
6
+
7
+ attr_accessor :name, :health
8
+ attr_reader :found_treasures
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 self.from_csv(line)
17
+ name, health = line.split(',')
18
+ Player.new(name, Integer(health))
19
+ rescue ArgumentError
20
+ puts "Ignored invalid health: #{health}"
21
+ Player.new(name)
22
+ end
23
+
24
+ def score
25
+ @health + points
26
+ end
27
+
28
+ def found_treasure(name, points)
29
+ @found_treasures[name] += points
30
+ end
31
+
32
+ def points
33
+ @found_treasures.values.sum
34
+ end
35
+
36
+ def to_s
37
+ "I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}"
38
+ end
39
+
40
+ end
41
+
42
+ if __FILE__ == $0
43
+ player = Player.new("jase")
44
+ puts player.name
45
+ puts player.health
46
+ player.boost
47
+ puts player.health
48
+ player.drain
49
+ puts player.health
50
+ end
51
+
52
+ end
@@ -0,0 +1,23 @@
1
+ module StudioGame
2
+ module TreasureTrove
3
+ Treasure = Data.define(:name, :points)
4
+
5
+ TREASURES = [
6
+ Treasure.new("pie", 10),
7
+ Treasure.new("coin", 25),
8
+ Treasure.new("flute", 50),
9
+ Treasure.new("compass", 65),
10
+ Treasure.new("key", 80),
11
+ Treasure.new("crown", 90),
12
+ Treasure.new("star", 100)
13
+ ]
14
+
15
+ def self.random_treasure
16
+ TREASURES.sample
17
+ end
18
+
19
+ def self.treasure_items
20
+ TREASURES.map { |treasure| "A #{treasure.name} is worth #{treasure.points} points" }
21
+ end
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,49 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game_3424
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - MF
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ executables:
13
+ - studio_game
14
+ extensions: []
15
+ extra_rdoc_files: []
16
+ files:
17
+ - LICENSE.txt
18
+ - README.md
19
+ - bin/players.csv
20
+ - bin/studio_game
21
+ - lib/studio_game/auditable.rb
22
+ - lib/studio_game/berserk_player.rb
23
+ - lib/studio_game/clumsy_player.rb
24
+ - lib/studio_game/game.rb
25
+ - lib/studio_game/playable.rb
26
+ - lib/studio_game/player.rb
27
+ - lib/studio_game/treasure_trove.rb
28
+ homepage: https://www.example.com
29
+ licenses:
30
+ - MIT
31
+ metadata: {}
32
+ rdoc_options: []
33
+ require_paths:
34
+ - lib
35
+ required_ruby_version: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: 3.2.0
40
+ required_rubygems_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: '0'
45
+ requirements: []
46
+ rubygems_version: 3.6.9
47
+ specification_version: 4
48
+ summary: A command-line game with randomized treasure points.
49
+ test_files: []