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