studio_game_learning 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: 8851a7b0b63d1406bb071746e97905b8be110268a65e54e4d67a04df84ac05fe
4
+ data.tar.gz: ae852dba8fa701688bb117bb56cdc548ad03b9f5b162c8c9a5da5d6e434a821d
5
+ SHA512:
6
+ metadata.gz: 5dbdf064f46547c675ac43697821aa7087298b86021a0b85b4eb65ecb42548d8ac59a9b9d66d9080868728bdd60b069f40d1e7f05bd77a2266994a7d41c380f6
7
+ data.tar.gz: 68cd771ac652d76f7845e202eeb7838b1e37a311f4b562ee64a0aa9da2d49b12fab2a5eb738a88dfd4d85fa7c0d50e20db3c291763445c12905c1f3a8923a84a
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2020 Laura Beatris
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,3 @@
1
+ # Studio Game
2
+
3
+ A simple command-line game written to learn Ruby fundamentals.
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
+ # frozen_string_literal: true
3
+ require_relative '../lib/studio_game/game.rb'
4
+ require_relative '../lib/studio_game/player.rb'
5
+ require_relative '../lib/studio_game/clumsy_player'
6
+ require_relative '../lib/studio_game/berserk_player'
7
+
8
+ berserker = StudioGame::BerserkPlayer.new('berserker', 50)
9
+ clumsy = StudioGame::ClumsyPlayer.new('klutz', 105)
10
+ players_file = File.join(__dir__, 'players.csv')
11
+
12
+ game = StudioGame::Game.new('Winner Takes All')
13
+ game.load_players(ARGV.shift || players_file)
14
+ game.add_player(clumsy)
15
+ game.add_player(berserker)
16
+ game.print_stats
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,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StudioGame
4
+ # Provides methods for a auditable behavior
5
+ module Auditable
6
+ def audit(number)
7
+ puts "Audit: Rolled a #{number}"
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'player'
4
+
5
+ # The main StudioGame module
6
+ module StudioGame
7
+ # Provides methods for working with the BerserkPlayer object
8
+ class BerserkPlayer < Player
9
+ def initialize(name, health = 100)
10
+ super(name, health)
11
+ @boost_count = 0
12
+ end
13
+
14
+ def berserk?
15
+ @boost_count > 5
16
+ end
17
+
18
+ def boost
19
+ super
20
+ @boost_count += 1
21
+ puts "#{@name} is berserk!" if berserk?
22
+ end
23
+
24
+ def drain
25
+ berserk? ? boost : super
26
+ end
27
+ end
28
+
29
+ if __FILE__ == $PROGRAM_NAME
30
+ berserker = BerserkPlayer.new('berserker', 50)
31
+ 6.times { berserker.boost }
32
+ 2.times { berserker.drain }
33
+ puts berserker.health
34
+ end
35
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'player'
4
+
5
+ # The main StudioGame module
6
+ module StudioGame
7
+ # Provides methods for working with the ClumsyPlayer object
8
+ class ClumsyPlayer < Player
9
+ def found_treasure(name, points)
10
+ points /= 2.0
11
+ super(name, points)
12
+ end
13
+ end
14
+
15
+ if __FILE__ == $PROGRAM_NAME
16
+ clumsy = ClumsyPlayer.new('klutz')
17
+
18
+ clumsy.found_treasure('flute', 50)
19
+ clumsy.found_treasure('flute', 50)
20
+ clumsy.found_treasure('flute', 50)
21
+ clumsy.found_treasure('star', 100)
22
+
23
+ clumsy.found_treasures.each do |name, points|
24
+ puts "#{name}: #{points} points"
25
+ end
26
+ puts "#{clumsy.points} total points"
27
+ end
28
+ end
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'treasure_trove'
4
+ require_relative 'auditable'
5
+ require 'csv'
6
+
7
+ module StudioGame
8
+ # Provides methods for working with the Game object
9
+ class Game
10
+ include Auditable
11
+
12
+ attr_reader :title, :players
13
+
14
+ def initialize(title)
15
+ @title = title
16
+ @players = []
17
+ end
18
+
19
+ def add_player(player)
20
+ @players.push(player)
21
+ end
22
+
23
+ def roll_die
24
+ number = [1, 1, 2, 5, 6, 6].sample
25
+ audit(number)
26
+ number
27
+ end
28
+
29
+ def play(rounds = 1)
30
+ display_game_start_message
31
+
32
+ display_players_before_playing
33
+
34
+ play_rounds(rounds)
35
+
36
+ display_players_after_playing
37
+ end
38
+
39
+ def sorted_players
40
+ @players.sort_by(&:score).reverse
41
+ end
42
+
43
+ # rubocop:disable Metrics/AbcSize
44
+ def print_stats
45
+ puts "\n Game Stats:"
46
+ puts '-' * 30
47
+
48
+ puts sorted_players
49
+
50
+ @players.each do |player|
51
+ puts "\n#{player.name}'s treasure point totals:"
52
+ player.found_treasures.each do |name, points|
53
+ puts "#{name}: #{points}"
54
+ end
55
+ puts "total: #{player.points}"
56
+ end
57
+
58
+ puts "\nHigh Scores:"
59
+ sorted_players.each do |player|
60
+ puts high_score_entry(player)
61
+ end
62
+ end
63
+ # rubocop:enable Metrics/AbcSize
64
+
65
+ def load_players(from_file)
66
+ CSV.foreach(from_file) do |row|
67
+ player = Player.from_csv(row)
68
+ add_player(player)
69
+ end
70
+ rescue Errno::ENOENT
71
+ puts "Whoops, #{from_file} not found!"
72
+ exit 1
73
+ end
74
+
75
+ def save_high_scores(to_file = 'high_scores.txt')
76
+ File.open(to_file, 'w') do |file|
77
+ file.puts "#{@title} High Scores:"
78
+ sorted_players.each do |player|
79
+ file.puts high_score_entry(player)
80
+ end
81
+ end
82
+ end
83
+
84
+ private
85
+
86
+ def high_score_entry(player)
87
+ name = player.name.ljust(20, '.')
88
+ points = player.score.round.to_s.rjust(5)
89
+ "#{name}#{points}"
90
+ end
91
+
92
+ def display_game_start_message
93
+ puts "\nLet's play #{@title}!"
94
+ end
95
+
96
+ def display_players_before_playing
97
+ puts "\nBefore playing:"
98
+ puts @players
99
+ end
100
+
101
+ def display_players_after_playing
102
+ puts "\After playing:"
103
+ puts @players
104
+ end
105
+
106
+ def play_rounds(rounds)
107
+ 1.upto(rounds) do |round|
108
+ play_round(round)
109
+ end
110
+ end
111
+
112
+ def play_round(round)
113
+ puts "\nRound #{round}:"
114
+
115
+ @players.each do |player|
116
+ process_player_turn(player)
117
+ end
118
+ end
119
+
120
+ def process_player_turn(player)
121
+ number_rolled = roll_die
122
+
123
+ display_treasures_found(player)
124
+
125
+ handle_number_rolled(player, number_rolled)
126
+
127
+ pick_random_treasure(player)
128
+ end
129
+
130
+ def handle_number_rolled(_player, number_rolled)
131
+ @players.each do |player|
132
+ case number_rolled
133
+ when 1..2
134
+ player.drain
135
+ puts "#{player.name} got drained 😩"
136
+ when 3..4
137
+ puts "#{player.name} got skipped"
138
+ else
139
+ player.boost
140
+ puts "#{player.name} got boosted 😁"
141
+ end
142
+ end
143
+ end
144
+
145
+ def display_treasures_found(_player)
146
+ puts "\nThe following treasures can be found:"
147
+
148
+ puts TreasureTrove.treasure_items
149
+ end
150
+
151
+ def pick_random_treasure(player)
152
+ treasure = TreasureTrove.random_treasure
153
+
154
+ player.found_treasure(treasure.name, treasure.points)
155
+
156
+ puts "#{player.name} found a #{treasure.name} worth #{treasure.points} points"
157
+ end
158
+ end
159
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StudioGame
4
+ # Provides methods for a playable behavior
5
+ module Playable
6
+ def boost
7
+ @health += 15
8
+ end
9
+
10
+ def drain
11
+ @health -= 10
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'playable'
4
+
5
+ # The main StudioGame module
6
+ module StudioGame
7
+ # Provides methods for working with the Player object
8
+ class Player
9
+ include Playable
10
+
11
+ attr_reader :health
12
+ attr_accessor :name
13
+ attr_reader :found_treasures
14
+
15
+ def initialize(name, health = 100)
16
+ @name = name.capitalize
17
+ @health = health
18
+ @found_treasures = Hash.new(0)
19
+ end
20
+
21
+ def points
22
+ @found_treasures.values.sum
23
+ end
24
+
25
+ def found_treasure(name, points)
26
+ @found_treasures[name] += points
27
+ end
28
+
29
+ def to_s
30
+ "I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}"
31
+ end
32
+
33
+ def score
34
+ @health + points
35
+ end
36
+
37
+ def self.from_csv(row)
38
+ Player.new(row[0], Integer(row[1]))
39
+ rescue ArgumentError
40
+ puts "Ignored invalid health: #{health}"
41
+ Player.new(name)
42
+ end
43
+ end
44
+
45
+ # Will only be executed if the name of the current source file (stored in the __FILE__ variable)
46
+ # is the same as the name of the Ruby program file being run (stored in the $PROGRAM_NAME variable)
47
+ if __FILE__ == $PROGRAM_NAME
48
+ player = Player.new('jase')
49
+ puts player.name
50
+ puts player.health
51
+ player.boost
52
+ puts player.health
53
+ player.drain
54
+ puts player.health
55
+ end
56
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module StudioGame
4
+ # Defines the Treasure constant
5
+ module TreasureTrove
6
+ Treasure = Data.define(:name, :points)
7
+
8
+ TREASURES = [
9
+ Treasure.new('pie', 10),
10
+ Treasure.new('coin', 25),
11
+ Treasure.new('flute', 50),
12
+ Treasure.new('compass', 65),
13
+ Treasure.new('key', 80),
14
+ Treasure.new('crown', 90),
15
+ Treasure.new('star', 100)
16
+ ].freeze
17
+
18
+ def self.random_treasure
19
+ TREASURES.sample
20
+ end
21
+
22
+ def self.treasure_items
23
+ TREASURES.map { |treasure| "A #{treasure.name} is worth #{treasure.points} points" }
24
+ end
25
+ end
26
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game_learning
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Laura Beatris
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-11-25 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: laurabeatriserafim@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/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.4.10
51
+ signing_key:
52
+ specification_version: 4
53
+ summary: A simple Gem from a Ruby learning exercise
54
+ test_files: []