shola_builds_studio_game 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
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: []