thithithi 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: 5711d6a04254889f5bf726f28f451ed18b51be4d6d5393b662451832454af7b3
4
+ data.tar.gz: dcd407d329332ae6d3668abe97fdb5d2cf41c757fa2da6068ba9d996d190057c
5
+ SHA512:
6
+ metadata.gz: af43c7bc0d35ded9c24f2799b3aeab0ad4239d30355748851f44efd29e57e134d7a2884559a6f180707791da5019a59c98f15390ad6edcc52b8e471a6cea836a
7
+ data.tar.gz: c8d615a9416b6bca947aa7338cb81328a5b38c7a0d84b9046bd99232ae62f6d8d3a1d41267085d3a2d1207404ec11794e959b696c5b262d1975b3b72b237c2bf
data/LICENSE.txt ADDED
@@ -0,0 +1 @@
1
+ etc
data/README.md ADDED
@@ -0,0 +1 @@
1
+ read me
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,35 @@
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
+ game = StudioGame::Game.new("Winner Takes All")
9
+
10
+ players_file = File.join(__dir__, "players.csv")
11
+
12
+ game.load_players(ARGV.shift || players_file)
13
+
14
+ clumsy = StudioGame::ClumsyPlayer.new("klutz", 105)
15
+ berserker = StudioGame::BerserkPlayer.new("berserker", 50)
16
+ game.add_player(clumsy)
17
+ game.add_player(berserker)
18
+
19
+ loop do
20
+ print "\nHow many rounds? ('quit' to exit) "
21
+
22
+ res = gets.chomp.downcase
23
+
24
+ case res
25
+ when /^\d+$/
26
+ game.play(res.to_i)
27
+ when "quit", "exit"
28
+ game.print_stats
29
+ break
30
+ else
31
+ print "\nPlease enter a number or 'quit'"
32
+ end
33
+ end
34
+
35
+ game.save_high_scores
@@ -0,0 +1,7 @@
1
+ module StudioGame
2
+ module Auditable
3
+ def audit(number)
4
+ puts "Audit: Rolled a #{number}"
5
+ end
6
+ end
7
+ 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 = 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,35 @@
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 found_treasure(name, points)
13
+ super(name, points / 2.0)
14
+ end
15
+
16
+ def boost
17
+ @boost_factor.times { super }
18
+ end
19
+
20
+ end
21
+
22
+ if __FILE__ == $0
23
+ clumsy = ClumsyPlayer.new("klutz", 105, 3)
24
+
25
+ clumsy.found_treasure("flute", 50)
26
+ clumsy.found_treasure("flute", 50)
27
+ clumsy.found_treasure("flute", 50)
28
+ clumsy.found_treasure("star", 100)
29
+
30
+ clumsy.found_treasures.each do |name, points|
31
+ puts "#{name}: #{points} points"
32
+ end
33
+ puts "#{clumsy.points} total points"
34
+ end
35
+ end
@@ -0,0 +1,107 @@
1
+ require_relative "auditable"
2
+ require_relative "treasure_trove"
3
+
4
+ module StudioGame
5
+ class Game
6
+ include Auditable
7
+
8
+ attr_reader :title, :players
9
+
10
+ def initialize(title)
11
+ @title = title
12
+ @players = []
13
+ end
14
+
15
+ def load_players(from_file)
16
+ File.readlines(from_file, chomp: true).each do |line|
17
+ player = Player.from_csv(line)
18
+ add_player(player)
19
+ end
20
+ rescue Errno::ENOENT
21
+ print "Whoops, #{from_file} not found\n"
22
+ exit 1
23
+ end
24
+
25
+ def save_high_scores(to_file = "high_scores.csv")
26
+ File.open(to_file, "w") do |file|
27
+ file.puts "#{@title} High Scores: "
28
+
29
+ sorted_players.each do |player|
30
+ file.puts high_score_entry(player)
31
+ end
32
+ end
33
+ end
34
+
35
+ def high_score_entry(player)
36
+ "#{player.name.ljust(20, ".")}#{player.score}"
37
+ end
38
+
39
+ def add_player(player)
40
+ @players << player
41
+ end
42
+
43
+ def roll_die
44
+ number = rand(1..10)
45
+ audit(number)
46
+ number
47
+ end
48
+
49
+ def play(rounds = 1)
50
+ puts "*" * 30
51
+ puts "Lets Play #{@title}!\n"
52
+
53
+ puts "\nThe following treasures can be found:"
54
+ puts TreasureTrove.treasure_items
55
+
56
+ puts "-" * 20
57
+ puts @players
58
+
59
+ 1.upto(rounds) do |round|
60
+ puts "\nRound #{round}:"
61
+ @players.each do |player|
62
+ number_rolled = roll_die
63
+
64
+ case number_rolled
65
+ when 1..3
66
+ player.drain
67
+ puts " #{player.name} got drained 😩"
68
+ when 4..6
69
+ puts " #{player.name} got no effect 😐"
70
+ else
71
+ player.boost
72
+ puts " #{player.name} got boosted 😁"
73
+ end
74
+
75
+ treasure = TreasureTrove.random_treasure
76
+ player.found_treasure(treasure.name, treasure.points)
77
+ puts " #{player.name} found a treasure: [#{treasure.name}] worth #{treasure.points} points"
78
+ end
79
+ end
80
+ end
81
+
82
+ def sorted_players
83
+ @players.sort_by { |player| player.score }.reverse
84
+ end
85
+
86
+ def print_stats
87
+ puts "\n Game Stats:"
88
+ puts "-" * 30
89
+
90
+ puts sorted_players
91
+
92
+ @players.each do |player|
93
+ puts "\n#{player.name}'s treasure point totals: "
94
+ player.found_treasures.each do |name, points|
95
+ puts "#{name}: #{points}"
96
+ end
97
+ puts "total: #{player.points}"
98
+ end
99
+
100
+ puts "\nHigh Scores:"
101
+
102
+ sorted_players.each do |player|
103
+ puts high_score_entry(player)
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,11 @@
1
+ module StudioGame
2
+ module Playable
3
+ def drain
4
+ self.health -= 10
5
+ end
6
+
7
+ def boost
8
+ self.health += 15
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,54 @@
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 to_s
17
+ "I'm #{@name} with health = #{@health}, points = #{points} and score: #{score}"
18
+ end
19
+
20
+ def score
21
+ @health + points
22
+ end
23
+
24
+ def points
25
+ @found_treasures.values.sum
26
+ end
27
+
28
+ def name=(new_name)
29
+ @name = new_name.capitalize
30
+ end
31
+
32
+ def found_treasure(name, points)
33
+ @found_treasures[name] += points
34
+ end
35
+
36
+ def self.from_csv(line)
37
+ name, health = line.split(",")
38
+ Player.new(name, Integer(health))
39
+ rescue ArgumentError
40
+ print "Ignoring invalid health: #{health}\n"
41
+ Player.new(name)
42
+ end
43
+ end
44
+
45
+ if __FILE__ == $0
46
+ player = Player.new("jase")
47
+ puts player.name
48
+ puts player.health
49
+ player.boost
50
+ puts player.health
51
+ player.drain
52
+ puts player.health
53
+ end
54
+ end
@@ -0,0 +1,23 @@
1
+ module StudioGame
2
+ module TreasureTrove
3
+ Treasure = Data.define(: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} points" }
21
+ end
22
+ end
23
+ end
metadata ADDED
@@ -0,0 +1,50 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: thithithi
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Thieigo Teneiro
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies: []
12
+ email: thitccp@gmail.com
13
+ executables:
14
+ - studio_game
15
+ extensions: []
16
+ extra_rdoc_files: []
17
+ files:
18
+ - LICENSE.txt
19
+ - README.md
20
+ - bin/players.csv
21
+ - bin/studio_game
22
+ - lib/studio_game/auditable.rb
23
+ - lib/studio_game/berserk_player.rb
24
+ - lib/studio_game/clumsy_player.rb
25
+ - lib/studio_game/game.rb
26
+ - lib/studio_game/playable.rb
27
+ - lib/studio_game/player.rb
28
+ - lib/studio_game/treasure_trove.rb
29
+ homepage: https://studiogame.com
30
+ licenses:
31
+ - MIT
32
+ metadata: {}
33
+ rdoc_options: []
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 3.2.0
41
+ required_rubygems_version: !ruby/object:Gem::Requirement
42
+ requirements:
43
+ - - ">="
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ requirements: []
47
+ rubygems_version: 3.6.7
48
+ specification_version: 4
49
+ summary: Studio game from pragmatic studios course
50
+ test_files: []