studio_game_sb 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: fcc33ec1bb6b17cce02ffabba400519db30b52b613a07a7435daf93f553d47e2
4
+ data.tar.gz: c68e0a068f80c15d7568569b3973f2f3056f0f44b52e9e166ada999212357e57
5
+ SHA512:
6
+ metadata.gz: 94fc611e73821cc46a43722e48b8df1d0496d7db83eee4d49864797bfb1f41867f1ee07bc1b7810d383ceb441468dab18fc5d73813d96c0fb059c5b357a25793
7
+ data.tar.gz: 7110ec178eff983e743118b2f7fc0678d424471380a9be24b385740fd6f098e7be618de296bb6e4e84af270c0cf0afcf3ffce34d02ae2ca5cd191224ef53ec5d
data/README.md ADDED
File without changes
@@ -0,0 +1,2 @@
1
+ Sahil,50
2
+ Bhumi,75
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,94 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative "../lib/studio_game/game"
4
+ require_relative "../lib/studio_game/player"
5
+ require_relative "../lib/studio_game/clumsy_player"
6
+ require_relative "../lib/studio_game/berserk_player"
7
+
8
+ puts "Let's play a game!"
9
+ puts "🚀" * 25
10
+ puts "\n"
11
+ puts "\t3"
12
+ puts "\t2"
13
+ puts "\t1"
14
+
15
+ name = "Finn"
16
+ health_value = 60
17
+ player_1 = StudioGame::Player.new(name, health_value)
18
+
19
+ # puts player_1.inspect
20
+ # puts player_1
21
+
22
+ player_2 = StudioGame::Player.new("lucy", 90)
23
+ player_3 = StudioGame::Player.new("jase")
24
+ player_4 = StudioGame::Player.new("alex", 125)
25
+
26
+ # player_4 = Player.new("alex", 125)
27
+ # puts player_4
28
+ # player_4.drain
29
+ # puts player_4
30
+ # player_4.boost
31
+ # puts player_4
32
+ # puts player_4.health
33
+ # player_4.name = "alexander"
34
+ # puts player_4
35
+
36
+ # puts say_hello(name: name, health_value: health_value)
37
+ # puts say_hello(name: "Jasee")
38
+
39
+
40
+
41
+ players = [player_1, player_2, player_3, player_4]
42
+
43
+ players.pop
44
+
45
+ player_5 = StudioGame::Player.new("cole", 75)
46
+ players.push(player_5)
47
+
48
+ game = StudioGame::Game.new("Winner Takes All")
49
+ # game.add_player(player_1)
50
+ # game.add_player(player_2)
51
+ # game.add_player(player_3)
52
+ # game.add_player(player_4)
53
+ players_filename = File.join(__dir__, "players.csv")
54
+ game.load_players(ARGV.shift || players_filename)
55
+ clumsy = StudioGame::ClumsyPlayer.new("klutz", 105, 3)
56
+ game.add_player(clumsy)
57
+
58
+ berserker = StudioGame::BerserkPlayer.new("berserker", 50)
59
+ game.add_player(berserker)
60
+
61
+ loop do
62
+
63
+ print "\nHow many game rounds? ('quit' to exit) "
64
+ answer = gets.chomp.downcase
65
+
66
+ case answer
67
+ when /^\d+$/ # types number
68
+ game.play(answer.to_i)
69
+ when "quit", "exit"
70
+ game.print_stats
71
+ break
72
+ else
73
+ puts "Please enter a number or 'quit'"
74
+ end
75
+ end
76
+
77
+ game.save_high_scores
78
+
79
+ # game.play(2)
80
+ game.print_stats
81
+
82
+
83
+
84
+ # player_5 = Player.new("alvin", 100)
85
+ # player_6 = Player.new("simon", 60)
86
+ # player_7 = Player.new("theo", 125)
87
+
88
+ # chipmunks = Game.new("Chipmunks")
89
+ # chipmunks.add_player(player_5)
90
+ # chipmunks.add_player(player_6)
91
+ # chipmunks.add_player(player_7)
92
+ # chipmunks.play
93
+
94
+ # chipmunks.print_stats
@@ -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,37 @@
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
+ if berserk?
23
+ boost
24
+ else
25
+ super
26
+ end
27
+ end
28
+
29
+ end
30
+ end
31
+
32
+ if __FILE__ == $0
33
+ berserker = BerserkPlayer.new("berserker", 50)
34
+ 6.times { berserker.boost }
35
+ 2.times { berserker.drain }
36
+ puts berserker.health
37
+ 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.0
14
+ super(name, points)
15
+ end
16
+
17
+ def boost
18
+ @boost_factor.times { super }
19
+ end
20
+
21
+ end
22
+ end
23
+
24
+ if __FILE__ == $0
25
+ clumsy = ClumsyPlayer.new("klutz")
26
+
27
+ clumsy.found_treasure("flute", 50)
28
+ clumsy.found_treasure("flute", 50)
29
+ clumsy.found_treasure("flute", 50)
30
+ clumsy.found_treasure("star", 100)
31
+
32
+ clumsy.found_treasures.each do |name, points|
33
+ puts "#{name}: #{points} points"
34
+ end
35
+ puts "#{clumsy.points} total points"
36
+ end
@@ -0,0 +1,103 @@
1
+ require_relative("treasure_trove")
2
+ require_relative("auditable")
3
+
4
+ module StudioGame
5
+ class Game
6
+ include Auditable
7
+ attr_reader :name, :players
8
+
9
+ def initialize(name)
10
+ @name = name
11
+ @players = []
12
+ end
13
+
14
+ def load_players(from_file)
15
+ File.readlines(from_file, chomp: true).each do |line|
16
+ player = Player.from_csv(line)
17
+ add_player(player)
18
+ end
19
+ rescue Errno::ENOENT
20
+ puts "Whoops, #{from_file} not found!"
21
+ exit 1
22
+ end
23
+
24
+
25
+ def high_score_entry(player)
26
+ name = player.name.ljust(20, ".")
27
+ score = player.score.round.to_s.rjust(5)
28
+ "#{name}#{score}"
29
+ end
30
+
31
+ def save_high_scores(to_file = "high_scores.txt")
32
+ File.open(to_file, "w") do |file|
33
+ file.puts "#{@title} High Scores:"
34
+ sorted_players.each do |player|
35
+ file.puts high_score_entry(player)
36
+ end
37
+ end
38
+ end
39
+
40
+ def roll_die
41
+ number=rand(1..6) # number = [1, 1, 2, 5, 6, 6].sample
42
+ audit(number)
43
+ number
44
+ end
45
+
46
+ def add_player(player)
47
+ @players << player
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 Game Stats:"
56
+ puts "-" * 30
57
+
58
+ @players.each do |player|
59
+ puts "\n#{player.name}'s treasure point totals:"
60
+ player.found_treasures.each do |name, points|
61
+ puts "#{name}: #{points}"
62
+ end
63
+ puts "total: #{player.points}"
64
+ end
65
+
66
+ sorted_players.each do |player|
67
+ puts high_score_entry(player)
68
+ end
69
+
70
+ end
71
+
72
+ def play(rounds=3)
73
+ puts "\nBefore Playing:"
74
+ puts @players
75
+ puts "\n"
76
+
77
+ puts TreasureTrove.treasure_items
78
+
79
+ 1.upto(rounds) do |round_number|
80
+ puts "\Round #{round_number}:"
81
+ @players.each do |player|
82
+ number_rolled = roll_die
83
+ case number_rolled
84
+ when 1..2
85
+ player.drain
86
+ puts "#{player.name} got drained"
87
+ when 3..4
88
+ puts "#{player.name} got skipped"
89
+ else
90
+ player.boost
91
+ puts "#{player.name} got boosted"
92
+ end
93
+ treasure = TreasureTrove.random_treasure
94
+ player.found_treasure(treasure.name, treasure.points)
95
+ puts "#{player.name} found a #{treasure.name} worth #{treasure.points}"
96
+ end
97
+ end
98
+
99
+ puts "\nAfter Playing:"
100
+ puts @players
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,14 @@
1
+
2
+ module StudioGame
3
+ module Playable
4
+
5
+ def boost
6
+ self.health += 15
7
+ end
8
+
9
+ def drain
10
+ self.health -= 10
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,56 @@
1
+ require_relative "playable"
2
+
3
+ module StudioGame
4
+ class Player
5
+ include Playable
6
+
7
+ attr_reader :name, :found_treasures
8
+ attr_accessor :health
9
+ # attr_accessor :name
10
+
11
+ def name=(new_name)
12
+ @name = new_name.capitalize
13
+ end
14
+
15
+ def score
16
+ return @health + points
17
+ end
18
+
19
+ def initialize(name, health=100)
20
+ @name = name.capitalize
21
+ @health = health
22
+ @found_treasures = Hash.new(0)
23
+ end
24
+
25
+ def to_s()
26
+ "I am #{@name.capitalize.strip} with a health of #{@health}, points of #{points} and score of #{score}" # endless method
27
+ end
28
+
29
+ def self.from_csv(line) # return class object so need a class method so add self prior to method name
30
+ name, health = line.split(",")
31
+ Player.new(name, Integer(health)) # Integer(health) rescue 5 - alternate way
32
+ rescue ArgumentError
33
+ puts "Ignored invalid health: #{health}"
34
+ Player.new(name)
35
+ end
36
+
37
+ def found_treasure(name, points)
38
+ @found_treasures[name] += points
39
+ end
40
+
41
+ def points
42
+ @found_treasures.values.sum
43
+ end
44
+
45
+ end
46
+ end
47
+
48
+ if __FILE__ == $0
49
+ player = Player.new("jase")
50
+ puts player.name
51
+ puts player.health
52
+ player.boost
53
+ puts player.health
54
+ player.drain
55
+ puts player.health
56
+ end
@@ -0,0 +1,25 @@
1
+
2
+ module StudioGame
3
+ module TreasureTrove
4
+
5
+ Treasure = Data.define(:name, :points) #dataclass
6
+ TREASURES = [
7
+ Treasure.new("pie", 10),
8
+ Treasure.new("coin", 25),
9
+ Treasure.new("flute", 50),
10
+ Treasure.new("compass", 65),
11
+ Treasure.new("key", 80),
12
+ Treasure.new("crown", 90),
13
+ Treasure.new("star", 100)
14
+ ]
15
+
16
+ def self.random_treasure
17
+ TREASURES.sample
18
+ end
19
+
20
+ def self.treasure_items
21
+ TREASURES.map { |treasure| "A #{treasure.name} is worth #{treasure.points} points"}
22
+ end
23
+
24
+ end
25
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game_sb
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - SB
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-08-31 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: sb@gmail.com
15
+ executables:
16
+ - studio_game
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - README.md
21
+ - bin/my_favorite_players.csv
22
+ - bin/players.csv
23
+ - bin/studio_game
24
+ - lib/studio_game/auditable.rb
25
+ - lib/studio_game/berserk_player.rb
26
+ - lib/studio_game/clumsy_player.rb
27
+ - lib/studio_game/game.rb
28
+ - lib/studio_game/playable.rb
29
+ - lib/studio_game/player.rb
30
+ - lib/studio_game/treasure_trove.rb
31
+ homepage: ''
32
+ licenses:
33
+ - MIT
34
+ metadata: {}
35
+ post_install_message:
36
+ rdoc_options: []
37
+ require_paths:
38
+ - lib
39
+ required_ruby_version: !ruby/object:Gem::Requirement
40
+ requirements:
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 3.2.0
44
+ required_rubygems_version: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ requirements: []
50
+ rubygems_version: 3.5.23
51
+ signing_key:
52
+ specification_version: 4
53
+ summary: A command line, randomized studio game application
54
+ test_files: []