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 +7 -0
- data/LICENSE.txt +1 -0
- data/README.md +1 -0
- data/bin/players.csv +3 -0
- data/bin/studio_game +37 -0
- data/lib/studio_game/auditable.rb +7 -0
- data/lib/studio_game/clumsy_player.rb +24 -0
- data/lib/studio_game/crazy_player.rb +31 -0
- data/lib/studio_game/game.rb +129 -0
- data/lib/studio_game/playable.rb +13 -0
- data/lib/studio_game/player.rb +46 -0
- data/lib/studio_game/scratch.rb +19 -0
- data/lib/studio_game/treasure_trove.rb +23 -0
- metadata +55 -0
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
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,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,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: []
|