shola_builds_studio_game 2.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: 2ae48e69229b1f18936c452d52d11549fd5bf104272b491bdb9c3c6b7d76f97b
4
+ data.tar.gz: a6ec114384d61f519ef37775b0ad63fae8129697ef3710dd7b8a0097dce81936
5
+ SHA512:
6
+ metadata.gz: 6c2e0ff218ee5ddba8c3c63d51bfb94ab3dd841950ec3f209bcb838d4b4489442ffab64c61d59c388dd38e1f124495b8e29a5d68b73c0187f9d393c5b37cab00
7
+ data.tar.gz: 570e44215d44390d3829f044dcbb1a2caa8bb67853f92c1aa901decf6a483e87d32e2e40510a793ee5e7a294b568af4638d368bd805627357f57865da50cde45
data/LICENSE.txt ADDED
@@ -0,0 +1 @@
1
+ This is a placeholder.
data/README.md ADDED
@@ -0,0 +1 @@
1
+ ### This is a placeholder.
data/bin/players.csv ADDED
@@ -0,0 +1,3 @@
1
+ aaliyah,60
2
+ mya,90
3
+ dela
data/bin/studio_game ADDED
@@ -0,0 +1,37 @@
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/crazy_player"
7
+
8
+ game = StudioGame::Game.new("Dinosaur kids")
9
+
10
+ # __dir__ - absolute path
11
+ players_file = File.join(__dir__, "players.csv")
12
+
13
+ # shift and get the first command line arg or default to player_file
14
+ game.load_players(ARGV.shift || players_file)
15
+
16
+ clumsy_player_1 = StudioGame::ClumsyPlayer.new("Treezo", 100)
17
+ game.add_player(clumsy_player_1)
18
+
19
+ crazy_player_1 = StudioGame::CrazyPlayer.new("kurama", 50)
20
+ game.add_player(crazy_player_1)
21
+
22
+ loop do
23
+ print "\nHow many game rounds? ('quit' to exit) "
24
+ answer = gets.chomp.downcase
25
+
26
+ case answer
27
+ when /^\d+$/
28
+ game.play(answer.to_i)
29
+ when 'exit', 'quit'
30
+ game.print_stats
31
+ break
32
+ else
33
+ puts "Enter number of rounds or 'quit"
34
+ end
35
+ end
36
+
37
+ game.save_high_scores
@@ -0,0 +1,7 @@
1
+ module StudioGame
2
+ module Auditable
3
+ def audit(no_rolled)
4
+ puts "Audit: Rolled a #{no_rolled}"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,24 @@
1
+ require_relative "player"
2
+
3
+ module StudioGame
4
+ class ClumsyPlayer < Player
5
+ def add_treasure(name, points)
6
+ points = points / 2
7
+ # call the default method from parent class
8
+ super(name, points)
9
+ end
10
+ end
11
+
12
+ if __FILE__ == $0
13
+ clumsy = ClumsyPlayer.new("Bosco", 45)
14
+
15
+ clumsy.add_treasure("flute", 50)
16
+ clumsy.add_treasure("flute", 50)
17
+ clumsy.add_treasure("flute", 50)
18
+ clumsy.add_treasure("star", 100)
19
+
20
+ clumsy.treasures_collected.each do |name, points|
21
+ puts "#{clumsy.name} #{name} has #{points} pointssss"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,31 @@
1
+ require_relative "player"
2
+
3
+ module StudioGame
4
+ class CrazyPlayer < Player
5
+ def initialize(name, health = 100)
6
+ super(name, health)
7
+ @boost_count = 0
8
+ end
9
+
10
+ def is_player_crazy?
11
+ @boost_count > 5
12
+ end
13
+
14
+ def boost
15
+ super
16
+ @boost_count += 1
17
+ puts "#{@name} is crazy!" if is_player_crazy?
18
+ end
19
+
20
+ def drain
21
+ is_player_crazy? ? boost : super
22
+ end
23
+ end
24
+
25
+ if __FILE__ == $0
26
+ crazy_player = CrazyPlayer.new("kurama", 50)
27
+ 6.times { crazy_player.boost }
28
+ 2.times { crazy_player.drain }
29
+ puts crazy_player.health
30
+ end
31
+ end
@@ -0,0 +1,129 @@
1
+ require_relative "treasure_trove"
2
+ require_relative "player"
3
+ require_relative "auditable"
4
+
5
+ module StudioGame
6
+ class Game
7
+ include Auditable
8
+
9
+ attr_reader :game_title, :players
10
+
11
+ def initialize(game_title)
12
+ @game_title = game_title
13
+ @players = []
14
+ end
15
+
16
+ # load player
17
+ def load_players(file_name)
18
+ if File.exist?(file_name)
19
+ player_list = File.readlines(file_name, chomp: true)
20
+
21
+ player_list.each do |line|
22
+ new_player = Player.from_csv(line)
23
+
24
+ add_player(new_player)
25
+ end
26
+ else
27
+ puts "Oh no, #{file_name} not found"
28
+ # exit if error
29
+ exit 1
30
+ end
31
+ end
32
+
33
+ # save player (take a file and write to it)
34
+ def save_high_scores(to_file = "high_scores.txt")
35
+ File.open(to_file, "w") do |file|
36
+ file.puts "#{@game_title} High Scores:"
37
+ sorted_players_by_score.each do |player|
38
+ file.puts high_score_entry(player)
39
+ end
40
+ end
41
+ end
42
+
43
+ # add player
44
+ def add_player(player)
45
+ @players.push(player)
46
+ end
47
+
48
+ # roll dice
49
+ def roll_dice
50
+ rand(1..6)
51
+ end
52
+
53
+ # print stats
54
+ def print_stats
55
+ puts "\n#{@game_title} Stats:"
56
+ puts "-" * 20
57
+ total_points_per_player
58
+
59
+ puts "\nHigh Scores:"
60
+ sorted_players_by_score.each do |player|
61
+ puts high_score_entry(player)
62
+ end
63
+ end
64
+
65
+ # sort players
66
+ def sorted_players_by_score
67
+ @players.sort_by { |player| player.score}.reverse
68
+ end
69
+
70
+ # total points
71
+ def total_points_per_player
72
+ @players.each do |player|
73
+ puts "\n#{player.name}'s treasure point totals:"
74
+
75
+ player.treasures_collected.each do |treasure, value|
76
+ puts "#{treasure}: #{value}"
77
+ end
78
+
79
+ puts "total: £#{player.treasures_collected.values.sum}"
80
+ end
81
+ end
82
+
83
+ def high_score_entry(player)
84
+ name = player.name.ljust(20, ".")
85
+ points = player.score.round.to_s.rjust(5)
86
+ "#{name}#{points}"
87
+ end
88
+
89
+ # play
90
+ def play(rounds=2)
91
+ puts TreasureTrove.treasure_items
92
+
93
+ puts "\nBefore playing:"
94
+ puts players
95
+
96
+ 1.upto(rounds) do |round|
97
+ puts "\nRound #{round}:"
98
+
99
+ @players.each do |player|
100
+ number_rolled = roll_dice
101
+
102
+ case number_rolled
103
+ when 1..2
104
+ player.drain
105
+
106
+ puts "#{player.name} got drained 😢"
107
+ when 3..4
108
+ puts "#{player.name} got skipped"
109
+ else
110
+ player.boost
111
+
112
+ puts "#{player.name} got boosted 🥳"
113
+ end
114
+
115
+ treasure = TreasureTrove.random_treasure
116
+
117
+ player.add_treasure(treasure.name, treasure.points)
118
+
119
+ puts "#{player.name} found a #{treasure.name} worth #{treasure.points} points"
120
+
121
+ audit(number_rolled)
122
+ end
123
+ end
124
+
125
+ puts "\nAfter playing:"
126
+ puts sorted_players_by_score
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,13 @@
1
+ module StudioGame
2
+ module Playable
3
+ # boost
4
+ def boost
5
+ self.health += 20
6
+ end
7
+
8
+ # drain
9
+ def drain
10
+ self.health -= 10
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,46 @@
1
+ require_relative "playable"
2
+
3
+ module StudioGame
4
+ class Player
5
+ include Playable
6
+
7
+ attr_reader :name, :treasures_collected
8
+ attr_accessor :health
9
+
10
+ def initialize(name, init_health = 100)
11
+ @name = name.capitalize
12
+ @health = init_health
13
+ @treasures_collected = Hash.new(0)
14
+ end
15
+
16
+ # add treasure
17
+ def add_treasure(name, points)
18
+ @treasures_collected[name] += points
19
+ end
20
+
21
+ # score
22
+ def score
23
+ player_points = points
24
+ @health + player_points
25
+ end
26
+
27
+ # points
28
+ def points
29
+ @treasures_collected.values.sum
30
+ end
31
+
32
+ # from csv
33
+ def self.from_csv(line)
34
+ name, health = line.split(",")
35
+ Player.new(name, Integer(health))
36
+ rescue ArgumentError, TypeError
37
+ puts "The health given #{health} is invalid, a default health has been assigned"
38
+ Player.new(name)
39
+ end
40
+
41
+ # to_s
42
+ def to_s
43
+ "I'm #{@name} with health = #{@health}, points = #{points} and score = #{score}"
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,19 @@
1
+ # words = %w[dog zebra elephant chimpanzee]
2
+
3
+ # words.each do |word|
4
+ # puts word.length
5
+ # end
6
+
7
+ Treasure = Data.define(:treasure, :points)
8
+
9
+ treasures = [
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", 10),
17
+ ]
18
+
19
+ puts treasures.sample
@@ -0,0 +1,23 @@
1
+ module StudioGame
2
+ module TreasureTrove
3
+ Treasure = Struct.new(:name, :points)
4
+
5
+ TREASURES = [
6
+ Treasure.new("pie", 10),
7
+ Treasure.new("coin", 25),
8
+ Treasure.new("flute", 50),
9
+ Treasure.new("compass", 65),
10
+ Treasure.new("key", 80),
11
+ Treasure.new("crown", 90),
12
+ Treasure.new("star", 100),
13
+ ]
14
+
15
+ def self.random_treasure
16
+ TREASURES.sample
17
+ end
18
+
19
+ def self.treasure_items
20
+ TREASURES.map { |treasure| "A #{treasure.name} is worth #{treasure.points}"}
21
+ end
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: shola_builds_studio_game
3
+ version: !ruby/object:Gem::Version
4
+ version: 2.0.0
5
+ platform: ruby
6
+ authors:
7
+ - sholabuilds
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2024-07-10 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: builder@sholabuilds.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/clumsy_player.rb
26
+ - lib/studio_game/crazy_player.rb
27
+ - lib/studio_game/game.rb
28
+ - lib/studio_game/playable.rb
29
+ - lib/studio_game/player.rb
30
+ - lib/studio_game/scratch.rb
31
+ - lib/studio_game/treasure_trove.rb
32
+ homepage:
33
+ licenses:
34
+ - MIT
35
+ metadata: {}
36
+ post_install_message:
37
+ rdoc_options: []
38
+ require_paths:
39
+ - lib
40
+ required_ruby_version: !ruby/object:Gem::Requirement
41
+ requirements:
42
+ - - ">="
43
+ - !ruby/object:Gem::Version
44
+ version: 3.2.0
45
+ required_rubygems_version: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '0'
50
+ requirements: []
51
+ rubygems_version: 3.4.1
52
+ signing_key:
53
+ specification_version: 4
54
+ summary: A game built to refresh my Ruby skills.
55
+ test_files: []