studio_game-0419-timothy 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: d06285aa6f13a6bbc83357ce7ea3d0558a5befad30583193051a8e73eff5f2ce
4
+ data.tar.gz: 2134f7a6f61612ab5222a21090fa68a0bbded031e501cd7d71dccdfd5a52aac0
5
+ SHA512:
6
+ metadata.gz: c75657fa1811830459c65bf5b426e459c4faacb448d007839437c4741513e81ce951fe0eb6f739b4585b8158d167e9c26ede4b4d76ec9bc367ddaef3ec468c16
7
+ data.tar.gz: 582436abb6880d5e2d65258f8684fcd65c745c7be153ee71a66f08c9698ef4162c306becb4d423cec443d9b82c9739fde5c9bb8325fc40d49b0d2ba44a6ad3c8
data/LICENSE.txt ADDED
@@ -0,0 +1,7 @@
1
+ Copyright (c) <year> <copyright holders>
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1 @@
1
+ A great game
data/bin/players.csv ADDED
@@ -0,0 +1,5 @@
1
+ Starlord,50
2
+ Gamora,75
3
+ Rocket,100
4
+ Drax, 125
5
+ Groot,45
data/bin/studio_game ADDED
@@ -0,0 +1,153 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative "../lib/studio_game/player.rb"
3
+ require_relative "../lib/studio_game/game.rb"
4
+ require_relative "../lib/studio_game/clumsy_player.rb"
5
+ require_relative "../lib/studio_game/berserker_player.rb"
6
+
7
+
8
+ # class Games
9
+ # attr_reader :name, :players
10
+
11
+ # def initialize():
12
+ # @title = title
13
+ # @game = games
14
+ # end
15
+
16
+ # number_rolled = rand(1..6)
17
+ # player_1 = Player.new("Player1", 60)
18
+
19
+ # puts number_rolled
20
+ # if number_rolled < 3
21
+ # player_1.drain
22
+ # puts player_1.name + " got drained 😩"
23
+ # elsif number_rolled < 5
24
+ # puts player_1.name + " got skipped"
25
+ # else
26
+ # player_1.boost
27
+ # puts player_1.name + " got boosted 😁"
28
+ # end
29
+
30
+ # player_1 = Player.new("Player1", 60)
31
+ # player_2 = Player.new("Player2", 30)
32
+ # player_3 = Player.new("Player3")
33
+ # player_4 = Player.new("Player4", 45)
34
+
35
+ # players = [player_1, player_2, player_3, player_4]
36
+
37
+ players_file = File.join(__dir__, "players.csv")
38
+ game = StudioGame::Game.new("MGuardians")
39
+ game.load(ARGV.shift || players_file)
40
+
41
+ clumsy_player = StudioGame::ClumsyPlayer.new("klutz", 105)
42
+ berserk_player = StudioGame::BerserkPlayer.new("berserker", 50)
43
+ game.add_player(clumsy_player)
44
+ game.add_player(berserk_player)
45
+ # game.players = players
46
+
47
+ loop do
48
+ print "How many games? ('quit' or 'exit' to exit)"
49
+ answer = gets.chomp.downcase
50
+ case answer
51
+ when /^\d+$/
52
+ game.play(answer.to_i)
53
+ puts "Enjoy your #{answer} games..."
54
+ when "quit", "exit"
55
+ game.print_stats
56
+ break
57
+ else
58
+ puts "Please enter a number or 'quit', 'exit'"
59
+ end
60
+
61
+ end
62
+
63
+ game.save
64
+
65
+
66
+ puts game.players
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+ # game = Game.new("My Game")
75
+ # game.add_player(player_1)
76
+ # game.add_player(player_2)
77
+ # game.add_player(player_3)
78
+ # game.add_player(player_4)
79
+ # game.play
80
+
81
+
82
+ # game2 = Game.new("Chipmunks")
83
+
84
+ # alvin = Player.new("Alvin", 50)
85
+ # simon = Player.new("Simon", 100)
86
+ # theodore = Player.new("Theodore")
87
+
88
+ # game2.add_player(alvin)
89
+ # game2.add_player(simon)
90
+ # game2.add_player(theodore)
91
+ # game2.play
92
+
93
+
94
+
95
+
96
+
97
+
98
+
99
+ # # number_rolled = rand(1..6)
100
+ # # puts number_rolled
101
+ # player1 = Player.new("Player #1", health = 20)
102
+ # # puts player1
103
+
104
+
105
+ # player2 = Player.new("Player #2")
106
+ # # puts player2
107
+ # # puts player2.health
108
+ # # puts player2.name
109
+
110
+ # player3 = Player.new("Player #3", health = 0)
111
+ # player4 = Player.new("Player #4", health = 100)
112
+ # player5 = Player.new("Cole", health = 75)
113
+ # # puts player3
114
+ # # puts player3.health
115
+ # # player3.name = "new Player #3"
116
+ # # puts player3.name
117
+ # # puts player3.score
118
+
119
+ # players = [player1, player2, player3, player4]
120
+ # players.pop
121
+ # players.push(player5)
122
+ # puts "before playing"
123
+ # puts players
124
+
125
+
126
+ # players.each do |player|
127
+ # number_rolled = rand(1..6)
128
+ # puts number_rolled
129
+ # case number_rolled
130
+ # when 1..2
131
+ # player.drain()
132
+ # puts "#{player.name} got drained"
133
+ # when 3..4
134
+ # puts "#{player.name} got skipped"
135
+ # else
136
+ # player.boost()
137
+ # puts "#{player.name} got boosted"
138
+ # end
139
+ # end
140
+
141
+ # puts "\nafter playing"
142
+ # puts players
143
+
144
+
145
+
146
+
147
+
148
+
149
+
150
+
151
+
152
+
153
+
@@ -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,38 @@
1
+ require_relative "player"
2
+ module StudioGame
3
+ class BerserkPlayer < Player
4
+ def initialize(name, player)
5
+ super(name, player)
6
+ @boost_count = 0
7
+ end
8
+
9
+ #The question mark means that it is a boolean and return true/false
10
+ def berserk?
11
+ @boost_count > 5
12
+ end
13
+
14
+ def boost()
15
+ super()
16
+ @boost_count += 1
17
+ puts "#{name} is beserk!" if berserk?
18
+ end
19
+
20
+ def drain()
21
+ if berserk?
22
+ boost()
23
+ else
24
+ super()
25
+ end
26
+ end
27
+
28
+
29
+ end
30
+
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
38
+ end
@@ -0,0 +1,23 @@
1
+ require_relative "player"
2
+ module StudioGame
3
+ class ClumsyPlayer < Player
4
+ def found_treasure(name, points)
5
+ points = points/2
6
+ super(name, points)
7
+ end
8
+ end
9
+
10
+ if __FILE__ == $0
11
+ clumsy = ClumsyPlayer.new("klutz")
12
+
13
+ clumsy.found_treasure("flute", 50)
14
+ clumsy.found_treasure("flute", 50)
15
+ clumsy.found_treasure("flute", 50)
16
+ clumsy.found_treasure("star", 100)
17
+
18
+ clumsy.found_treasures.each do |name, points|
19
+ puts "#{name}: #{points} points"
20
+ end
21
+ puts "#{clumsy.points} total points"
22
+ end
23
+ end
@@ -0,0 +1,121 @@
1
+ require_relative "treasure_trove"
2
+ require_relative "auditable"
3
+ module StudioGame
4
+ class Game
5
+ include Auditable
6
+ Treasure = Data.define(:name, :points)
7
+
8
+ # TREASURES =
9
+ # [
10
+ # Treasure.new("pie", 10),
11
+ # Treasure.new("coin", 25),
12
+ # Treasure.new("flute", 50),
13
+ # Treasure.new("compass", 65),
14
+ # Treasure.new("key", 80),
15
+ # Treasure.new("crown", 90),
16
+ # Treasure.new("star", 100)
17
+ # ]
18
+
19
+ attr_reader :title, :players
20
+ attr_accessor :players
21
+
22
+
23
+ def initialize(title)
24
+ @title = title
25
+ @players = []
26
+ end
27
+
28
+ def load(filename)
29
+
30
+ File.readlines(filename, chomp: true).each do |line|
31
+ player = Player.from_csv(line)
32
+ add_player(player)
33
+ end
34
+ rescue Errno::ENOENT => e
35
+ puts "whoops, this file does not exist!"
36
+ exit 1
37
+ end
38
+
39
+ def save(to_file = "player_rankings.csv")
40
+ File.open(to_file, 'w') do |file|
41
+ sorted_players.each do |player|
42
+ file.puts player.to_csv
43
+ end
44
+ end
45
+ end
46
+
47
+
48
+ def add_player(player)
49
+ @players.append(player)
50
+ end
51
+
52
+ def sorted_players()
53
+ return @players.sort_by{|player| player.score}.reverse
54
+ end
55
+
56
+ def roll_die()
57
+ dye_numbers = [1,1,2,5,6,6]
58
+ random_number = dye_numbers.sample
59
+ audit(random_number)
60
+ random_number
61
+ end
62
+
63
+ def print_stats()
64
+ puts "\n Game Stats:"
65
+ puts "-" * 30
66
+ puts sorted_players
67
+ @players.each do |player|
68
+ puts "\n#{player.name}'s treasure point totals:"
69
+ player.found_treasures.each do |name, points|
70
+ puts "#{name}: #{points}"
71
+ end
72
+ puts "total : #{player.points}"
73
+ end
74
+
75
+ puts "\nHigh Scores:"
76
+ sorted_players.each do |player|
77
+ points = player.score
78
+ puts "#{player.name}................ #{points}"
79
+ end
80
+
81
+ end
82
+
83
+ def play(rounds = 1)
84
+ puts "welcome the following players"
85
+
86
+ puts "Here is a list of the treasures you may find!"
87
+
88
+ # TreasureTrove::TREASURES.each do |treasure|
89
+ # puts "A #{treasure.name} is worth #{treasure.points} points"
90
+ # end
91
+
92
+ puts TreasureTrove.treasure_items
93
+
94
+ puts @players
95
+ 1.upto(rounds) do |round|
96
+ @players.each do |player|
97
+ number_rolled = roll_die
98
+ puts number_rolled
99
+ case number_rolled
100
+ when 1..2
101
+ player.drain()
102
+ puts "#{player.name} got drained"
103
+ when 3..4
104
+ puts "#{player.name} got skipped"
105
+ else
106
+ player.boost()
107
+ puts "#{player.name} got boosted"
108
+ end
109
+
110
+ treasure = TreasureTrove.random_treasure
111
+ player.found_treasure(treasure.name, treasure.points)
112
+ puts "#{player} has found #{treasure.name} worth #{treasure.points} "
113
+ end
114
+ end
115
+
116
+ puts "\nHere are the current scores after playing:"
117
+ puts @players
118
+ end
119
+
120
+ end
121
+ end
@@ -0,0 +1,12 @@
1
+ module StudioGame
2
+ module Playable
3
+
4
+ def drain()
5
+ return @health -= 10
6
+ end
7
+
8
+ def boost()
9
+ return @health += 15
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,65 @@
1
+ require_relative "playable"
2
+ module StudioGame
3
+ class Player
4
+ attr_reader :health, :found_treasures
5
+ attr_accessor :name
6
+ include Playable
7
+
8
+ def initialize(name, health = 100)
9
+ @name = name.capitalize
10
+ @health = health
11
+ @found_treasures = Hash.new(0)
12
+ end
13
+
14
+ def found_treasure(name, points)
15
+ @found_treasures[name] +=points
16
+ end
17
+
18
+ def roll_die
19
+ rand(1..6)
20
+ end
21
+
22
+ def to_s()
23
+ return "I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}"
24
+ end
25
+
26
+ def drain()
27
+ return @health -= 10
28
+ end
29
+
30
+ def points()
31
+ return @found_treasures.values.sum
32
+ end
33
+
34
+ def score()
35
+ return @health + points
36
+ end
37
+
38
+ def boost()
39
+ return @health += 15
40
+ end
41
+
42
+ def self.from_csv(line)
43
+ name, health = line.split(",")
44
+ Player.new(name, Integer(health))
45
+ rescue ArgumentError
46
+ puts "Ignored invalid health: #{health}"
47
+ Player.new(name)
48
+ end
49
+
50
+ def to_csv()
51
+ return "#{@name},#{score}"
52
+ end
53
+
54
+
55
+ def name=(new_name)
56
+ @name = new_name.capitalize
57
+ end
58
+
59
+ end
60
+
61
+ if __FILE__ == $0
62
+ player = Player.new("Player 1")
63
+ puts player.name
64
+ end
65
+ end
@@ -0,0 +1,26 @@
1
+ module StudioGame
2
+ module TreasureTrove
3
+ Treasure = Data.define(:name, :points)
4
+
5
+ TREASURES =
6
+ [
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 {|item| "A #{item.name} is worth #{item.points} points"}
22
+ end
23
+
24
+
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game-0419-timothy
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Timothy
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2025-04-19 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: timothywmarr98@gmail.com
15
+ executables:
16
+ - studio_game
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - LICENSE.txt
21
+ - README.md
22
+ - bin/players.csv
23
+ - bin/studio_game
24
+ - lib/studio_game/auditable.rb
25
+ - lib/studio_game/berserker_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: https://github.com/timmarr98
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.22
51
+ signing_key:
52
+ specification_version: 4
53
+ summary: A wonderful game!
54
+ test_files: []