studio_game_kevin 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: 7d839e162a59e87f554746e3553e3a20e62d113788129a768e7f2d06b0d2255e
4
+ data.tar.gz: 3ce5399c44170eb301189278644d69e6ac2c93a9f3fb5b566b53fd8fb3e4a6e6
5
+ SHA512:
6
+ metadata.gz: 491d576015ab47af7e388e7759a0f16ff87248a7de3b8ce64c11830fb878184dc615362b892003fc1767d99781026022765b9ae018403df8d368ca30d7572d11
7
+ data.tar.gz: 1a66ea438779a00cc126b215c6231f9abfa6a91de79e590f77085930bf08d3f046f10c8a127816f828356c6921ef828c5f71a754bbf7288db2dbdae32176948b
@@ -0,0 +1,8 @@
1
+ Winner Takes All High Scores:
2
+ Klutz............... 105
3
+ G................... 100
4
+ D................... 100
5
+ R................... 100
6
+ G................... 100
7
+ S................... 100
8
+ Berserker........... 50
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,34 @@
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
+ players_file = File.join(__dir__, "players.csv")
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, 3)
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'"
31
+ end
32
+ end
33
+
34
+ game.save_high_scores
@@ -0,0 +1,5 @@
1
+ module Auditable
2
+ def audit(num)
3
+ puts "Audit: Rolled a #{num}"
4
+ end
5
+ end
@@ -0,0 +1,31 @@
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
+
25
+ if __FILE__ == $0
26
+ berserker = StudioGame::BerserkPlayer.new("berserker", 50)
27
+ 6.times { berserker.boost }
28
+ 2.times { berserker.drain }
29
+ puts berserker.health
30
+ end
31
+ 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 boost
13
+ @boost_factor.times { super }
14
+ end
15
+
16
+ def found_treasure(name, points)
17
+ points = points / 2.0
18
+ super(name, points)
19
+ end
20
+ end
21
+
22
+
23
+ if __FILE__ == $0
24
+ clumsy = StudioGame::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,116 @@
1
+ require_relative "treasure_trove"
2
+ require_relative "auditable"
3
+ require "csv"
4
+
5
+ module StudioGame
6
+ class Game
7
+ include Auditable
8
+
9
+ attr_reader :title, :players
10
+
11
+ def initialize(title)
12
+ @title = title
13
+ @players = []
14
+ end
15
+
16
+ def print_stats
17
+ sorted_players.each do |player|
18
+ puts high_score_entry(player)
19
+ end
20
+ end
21
+
22
+ def load_players(from_file)
23
+ File.readlines(from_file, chomp: true).each do |line|
24
+ player = Player.from_csv(line)
25
+ add_player(player)
26
+ end
27
+
28
+ rescue Errno::ENOENT
29
+ puts "Whoops, #{from_file} not found!"
30
+ exit 1
31
+
32
+ # CSV.foreach(from_file) do |row|
33
+ # player = Player.new(row[0], row[1].to_i)
34
+ # add_player(player)
35
+ # end
36
+ end
37
+
38
+ def save_high_scores(to_file = "high_scores.txt")
39
+ File.open(to_file, "w") do |file|
40
+ file.puts "#{@title} High Scores:"
41
+ sorted_players.each do |player|
42
+ file.puts high_score_entry(player)
43
+ end
44
+ end
45
+ end
46
+
47
+ def high_score_entry(player)
48
+ name = player.name.ljust(20, ".")
49
+ score = player.score.round.to_s.rjust(5)
50
+ "#{name}#{score}"
51
+ end
52
+
53
+ def sorted_players
54
+ @players.sort_by {|player| player.score}.reverse
55
+ end
56
+
57
+ def add_player(player)
58
+ players.push(player)
59
+ end
60
+
61
+ def roll_die
62
+ audit(rand(1..6))
63
+ end
64
+
65
+ def play(rounds = 1)
66
+ puts "\nLet's play #{title}"
67
+ print "\nThe following treasures can be found:"
68
+
69
+ puts TreasureTrove.treasure_items
70
+
71
+ puts "\nBefore playing:"
72
+ puts @players
73
+
74
+ 1.upto(rounds) do |round|
75
+ puts "\nRound #{round}:"
76
+
77
+ @players.each do |player|
78
+ puts "\n#{player.name}'s treasure point totals:"
79
+ player.found_treasures.each do |name, points|
80
+ puts "#{name}: #{points}"
81
+ end
82
+
83
+ puts "total: #{player.points}"
84
+
85
+ puts "\nHigh Scores:"
86
+ sorted_players.each do |player|
87
+ name = player.name.ljust(20, ".")
88
+ points = player.score.round.to_s.rjust(5)
89
+ puts "#{name}#{points}"
90
+ end
91
+
92
+ number_rolled = roll_die
93
+
94
+ case number_rolled
95
+ when 1..2
96
+ player.drain
97
+ puts "#{player.name} got drained!"
98
+ when 3..4
99
+ puts "#{player.name} got skipped!"
100
+ else player.boost
101
+ puts "#{player.name} got boosted."
102
+ end
103
+
104
+ treasure = TreasureTrove.random_treasure
105
+
106
+ player.found_treasure(treasure.name, treasure.points)
107
+
108
+ puts "#{player.name} found a #{treasure.name} worth #{treasure.points}"
109
+ end
110
+ end
111
+
112
+ puts "\nAfter playing:"
113
+ puts @players
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,10 @@
1
+ module Playable
2
+
3
+ def boost()
4
+ self.health += 15
5
+ end
6
+
7
+ def drain()
8
+ self.health -= 10
9
+ end
10
+ 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
+
20
+ rescue ArgumentError
21
+ puts "Ignored invalid health: #{health}"
22
+ Player.new(name)
23
+ end
24
+
25
+ def found_treasure(name, points)
26
+ @found_treasures[name] += points
27
+ end
28
+
29
+ def score
30
+ @health + points
31
+ end
32
+
33
+ def points
34
+ @found_treasures.values.sum
35
+ end
36
+
37
+ def to_s
38
+ puts "I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}"
39
+ end
40
+ end
41
+
42
+ if __FILE__ == $0
43
+ player = Player.new("jase")
44
+ player = Player.new("jase")
45
+ puts player.name
46
+ puts player.health
47
+ player.boost
48
+ puts player.health
49
+ player.drain
50
+ puts player.health
51
+ end
52
+ end
@@ -0,0 +1,33 @@
1
+ # 1.upto(9) { |episode| puts "Star Wars: Episode #{episode}" }
2
+
3
+ # 10.times do
4
+ # puts "Howdy!"
5
+ # end
6
+
7
+ # 5.upto(8) {|number| puts "#{number} alligator"}
8
+
9
+ # 3.downto(1) {|number| puts "launch in #{number}"}
10
+
11
+ # words = ["dog", "zebra", "elephant", "chimpanzee"]
12
+
13
+ # words.each { |n| puts n.length}
14
+
15
+ # Snack = Data.define(:name, :price)
16
+
17
+ # SNACKS = [
18
+ # Snack.new("popcorn", 3),
19
+ # Snack.new("candy", 1),
20
+ # Snack.new("nachos", 4),
21
+ # Snack.new("pretzels", 2)
22
+ # ]
23
+
24
+ # puts snacks.sample
25
+
26
+ snacks_eaten = Hash.new(0)
27
+
28
+ snacks_eaten["popcorn"] = 3
29
+ snacks_eaten["candy"] = 1
30
+ snacks_eaten["popcorn"] += 3
31
+ snacks_eaten["nachos"] += 4
32
+
33
+ puts snacks_eaten
@@ -0,0 +1,21 @@
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
+ def self.treasure_items
15
+ TREASURES.map {|treasure| "A #{treasure.name} is worth #{treasure.points} points"}
16
+ end
17
+
18
+ def self.random_treasure
19
+ TREASURES.sample
20
+ end
21
+ end
metadata ADDED
@@ -0,0 +1,54 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game_kevin
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Kevin Godinho
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-01-29 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: kevin.godinho@ramseysolutions.com
15
+ executables:
16
+ - studio_game
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/high_scores.txt
21
+ - bin/players.csv
22
+ - bin/studio_game
23
+ - lib/studio_game/auditable.rb
24
+ - lib/studio_game/berserk_player.rb
25
+ - lib/studio_game/clumsy_player.rb
26
+ - lib/studio_game/game.rb
27
+ - lib/studio_game/playable.rb
28
+ - lib/studio_game/player.rb
29
+ - lib/studio_game/scratch.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: Play a dice rolling game!
54
+ test_files: []