studio_game_alec 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: b7568733f543e2785e59632a7e4faaecc2124dd3b3f2ee312428944327f4c057
4
+ data.tar.gz: cd449ee1a87747501e6224a5b0c58eaa0c74df020f39639b30a319de1117fffe
5
+ SHA512:
6
+ metadata.gz: 919f706a3dc21b5dc73fbe2223bfd1ed544ccea35cc8a8ae837fb54efe0b8af79f3f27f647682bceede1ab9f9bf0862c5361b351df604d9e51926bc53584db77
7
+ data.tar.gz: be7a75f072dac13eb99e4f3bb063831562b3cc22a234b5e38972a3435bf71381cb8039402cb0c08371e509ef17f9fb7b1bb9485f4ad7e17e9201c460a5da67a1
data/LICENSE ADDED
@@ -0,0 +1,18 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Alec
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
13
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
14
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
15
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
16
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
17
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
18
+ SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,12 @@
1
+ # Flicks
2
+
3
+ Command-line app/gem to play a game.
4
+
5
+ ## Run from source
6
+ ruby bin/studio_game
7
+
8
+ ## Features
9
+ - Load players from CSV
10
+ - Points system (blam/w00t)
11
+ - Treasure trove
12
+ - Clumsy and beserker player
data/bin/players.csv ADDED
@@ -0,0 +1,3 @@
1
+ Alvin, 100
2
+ Simon, 60
3
+ Theo, 125
data/bin/studio_game ADDED
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ begin
4
+ require 'studio_game/player'
5
+ require 'studio_game/game'
6
+ require 'studio_game/treasure_trove'
7
+ require 'studio_game/clumsy_player'
8
+ require 'studio_game/berserk_player'
9
+ rescue LoadError
10
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
11
+ retry
12
+ end
13
+
14
+ player1=StudioGame::Player.new("moe")
15
+ player2=StudioGame::Player.new("larry",60)
16
+ player3= StudioGame::Player.new("curly", 125)
17
+ player4=StudioGame::Player.new("Alvin",100)
18
+ player5=StudioGame::Player.new("Simon", 60)
19
+ player6=StudioGame::Player.new("Theodore", 125)
20
+ player7=StudioGame::Player.new("Alec", 32)
21
+ player8=StudioGame::Player.new("Dani", 35)
22
+ player9=StudioGame::Player.new("Maria", 20 )
23
+
24
+
25
+
26
+ puts "*******"
27
+
28
+ jogo1 = StudioGame::Game.new("Ludo")
29
+ default_player_file = File.join(File.dirname(__FILE__), 'players.csv') #caso não seja informado qual o arquivo csv servirá de entrada de jogadores, o players.csv vai por padrão
30
+ jogo1.load_players(ARGV.shift || default_player_file)
31
+ #jogo1.add_player(player7)
32
+ #jogo1.add_player(player8)
33
+ #jogo1.add_player(player9)
34
+ klutz=StudioGame::ClumsyPlayer.new("klutz", 105)
35
+ jogo1.add_player(klutz)
36
+
37
+ gutz = StudioGame::BerserkPlayer.new("berserker", 50)
38
+ jogo1.add_player(gutz)
39
+
40
+ loop do
41
+ puts "How many games rounds? ('quit' or 'exit' to exit)"
42
+ answer = gets.chomp.downcase
43
+
44
+ case answer
45
+ when /^\d+$/
46
+ jogo1.play(answer.to_i)
47
+ when 'quit', 'exit'
48
+ jogo1.print_stats
49
+ break
50
+ else
51
+ puts "Please enter a number or 'quit' or 'exit'"
52
+ end
53
+ end
54
+ #jogo1.load_players("players.csv")
55
+ jogo1.save_high_scores
56
+ #jogo1.play(1) do
57
+ # jogo1.total_points >= 2000
58
+ #end
59
+
60
+
61
+
62
+
63
+
64
+
65
+
66
+
67
+
68
+
69
+
70
+
71
+
72
+
73
+
74
+
75
+
76
+
77
+
78
+
79
+
80
+
81
+
82
+ #players = [player1, player2, player3]
83
+
84
+ #puts("________________________________________________________________")
85
+ =begin
86
+ chipmunks = Game.new("Chipmunks")
87
+ chipmunks.add_player(player4)
88
+ chipmunks.add_player(player5)
89
+ chipmunks.add_player(player6)
90
+ chipmunks.play
91
+ =end
92
+
93
+
94
+ =begin
95
+ knuckleheads = Game.new("Knuckleheads")
96
+ knuckleheads.add_player(player1)
97
+ knuckleheads.add_player(player2)
98
+ knuckleheads.add_player(player3)
99
+ knuckleheads.play(3)
100
+ knuckleheads.print_stats
101
+ =end
@@ -0,0 +1,7 @@
1
+ module StudioGame
2
+ module Auditable
3
+ def audit
4
+ puts "Rolled a #{self.number} (#{self.class})"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'player'
2
+ module StudioGame
3
+ class BerserkPlayer < Player
4
+
5
+ def initialize(name, health=100)
6
+ super(name, health)
7
+ @w00t_count = 0
8
+ end
9
+
10
+ def berserk?
11
+ @w00t_count > 5
12
+ end
13
+
14
+ def w00t
15
+ super
16
+ @w00t_count += 1
17
+ puts "#{@name} is berserk!" if berserk?
18
+ end
19
+
20
+ def blam
21
+ berserk? ? w00t: super
22
+ =begin ((Mesma coisa))
23
+ if berserk?
24
+ w00t
25
+ else
26
+ super
27
+ end
28
+ =end
29
+ end
30
+ end
31
+ end
32
+ if __FILE__ == $0
33
+ berserker = BerserkPlayer.new("berserker", 50)
34
+ 6.times {berserker.w00t}
35
+ 2.times {berserker.blam}
36
+ puts berserker.health
37
+ end
@@ -0,0 +1,37 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+ class ClumsyPlayer < Player
5
+ attr_reader :boost_factor
6
+ def initialize (name, health=100, boost_factor=1)
7
+ super(name, health)
8
+ @boost_factor = boost_factor
9
+ end
10
+
11
+ def w00t
12
+ @boost_factor.times {super}
13
+ end
14
+
15
+ def found_treasure(treasure)
16
+ damaged_treasure = Treasure.new(treasure.name, treasure.points/2)
17
+ super(damaged_treasure)
18
+ end
19
+ end
20
+ end
21
+ if __FILE__ == $0
22
+ clumsy = ClumsyPlayer.new("klutz", 105, 3)
23
+
24
+ hammer = Treasure.new(:hammer, 50)
25
+ clumsy.found_treasure(hammer)
26
+ clumsy.found_treasure(hammer)
27
+ clumsy.found_treasure(hammer)
28
+
29
+ crowbar=Treasure.new(:crowbar, 400)
30
+
31
+ clumsy.found_treasure(crowbar)
32
+
33
+ clumsy.each_found_treasure do |treas|
34
+ puts "#{treas.points} total #{treas.name} points"
35
+ end
36
+ puts "#{clumsy.points} grand total points"
37
+ end
@@ -0,0 +1,17 @@
1
+ require_relative 'auditable'
2
+ module StudioGame
3
+ class Die
4
+ include Auditable
5
+ attr_reader :number
6
+
7
+ #def initialize
8
+ # roll
9
+ # end
10
+
11
+ def roll
12
+ @number = rand(1..6)
13
+ audit
14
+ @number
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,136 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'game_turn'
4
+ require_relative 'treasure_trove'
5
+ require 'csv'
6
+ module StudioGame
7
+ class Game
8
+
9
+
10
+ attr_reader :title
11
+ def initialize(title)
12
+ @title = title
13
+ @players = []
14
+ end
15
+
16
+ def high_score_entry(player)
17
+ formatted_name = player.name.ljust(20, '.')
18
+ "#{formatted_name} #{player.score}"
19
+ end
20
+ =begin
21
+ def load_players(from_file)
22
+ File.readlines(from_file).each do |line|
23
+ add_player(Player.from_csv(line))
24
+ end
25
+ end
26
+ =end
27
+ def load_players(from_file)
28
+ CSV.foreach(from_file) do |row|
29
+ player = Player.new(row[0], row[1].to_i)
30
+ add_player(player)
31
+ end
32
+ end
33
+
34
+ def save_high_scores(to_file = "high_score.txt")
35
+ File.open(to_file, "w") do |file|
36
+ file.puts "#{@title} High Scores: "
37
+ @players.sort.each do |player|
38
+ puts high_score_entry(player)
39
+ file.puts player.to_csv
40
+ end
41
+ end
42
+ end
43
+
44
+ def add_player(player)
45
+ @players << player #@players.push(player)
46
+ end
47
+
48
+ def play(rounds)
49
+ puts "There are #{@players.size} players in #{@title}:"
50
+ @players.each do |p|
51
+ puts p
52
+ end
53
+
54
+ treasures = TreasureTrove::TREASURES
55
+ puts "\nThere are #{treasures.size} treasures to be found: "
56
+
57
+ treasures.each do |t|
58
+ puts "A #{t.name} is worth #{t.points} points"
59
+ end
60
+ puts "---------------------------------"
61
+
62
+
63
+ 1.upto(rounds) do |r|
64
+ if block_given?
65
+ break if yield
66
+ end
67
+ puts "\nRound #{r}:"
68
+ @players.each do |p|
69
+ puts"---------------------------------"
70
+ GameTurn.take_turn(p)
71
+ #treasure = TreasureTrove.random
72
+ #p.found_treasure(treasure)
73
+ puts p
74
+ end
75
+ end
76
+
77
+
78
+ end
79
+ def print_name_and_score(player)
80
+ puts "#{player.name} Score: (#{player.score})"
81
+ end
82
+
83
+ def total_points
84
+ @players.reduce(0) do |sum,p|
85
+ sum + p.points
86
+ end
87
+ end
88
+
89
+ def print_stats
90
+ strong_players, wimpy_players = @players.partition {|player| player.strong?}
91
+
92
+ puts "\n#{@title} Statistics: "
93
+
94
+
95
+ puts "\n#{strong_players.size} strong players: "
96
+ strong_players.each do |player|
97
+ print_name_and_score(player)
98
+ end
99
+
100
+ puts "\n#{wimpy_players.size} wimpy players:"
101
+ wimpy_players.each do |player|
102
+ print_name_and_score(player)
103
+ end
104
+ #sorted_players = @players.sort {|a,b| b.score <=> a.score}
105
+ puts "\n"
106
+ puts "\n#{@title} High scores: "
107
+ @players.sort.each do |p|
108
+ puts high_score_entry(p)
109
+ puts "#{p.name}'s points total:"
110
+ p.each_found_treasure do |trea|
111
+ puts "#{trea.points} total #{trea.name} points"
112
+ end
113
+ puts "#{p.points} grand total points"
114
+ puts "\n"
115
+ end
116
+
117
+ puts "#{total_points} total points from treasures found"
118
+ end
119
+
120
+ end
121
+ end
122
+
123
+ if __FILE__ ==$0
124
+ player1 = Player.new("Juninho", 60)
125
+ chipmunks = Game.new("chipmunks")
126
+ chipmunks.add_player(player1)
127
+ chipmunks.play(2)
128
+ #puts player1.health
129
+ end
130
+
131
+
132
+ =begin
133
+ treasure = TreasureTrove.random
134
+ puts "#{p.name} found a #{treasure.name} worth #{treasure.points} points"
135
+ puts p
136
+ =end
@@ -0,0 +1,26 @@
1
+ require_relative 'game'
2
+ require_relative 'die'
3
+ require_relative 'treasure_trove'
4
+ require_relative 'loaded_die'
5
+ module StudioGame
6
+ module GameTurn
7
+ def self.take_turn(player)
8
+ # @players.each do |p|
9
+ die=LoadedDie.new
10
+ case die.roll
11
+ when 1..2
12
+ player.blam
13
+ when 3..4
14
+ puts "#{player.name} was skipped."
15
+ else
16
+ player.w00t
17
+ end
18
+ puts player
19
+
20
+ treasure = TreasureTrove.random
21
+ player.found_treasure(treasure)
22
+ #puts "#{player.name} found a #{treasure.name} worth #{treasure.points} points"
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,15 @@
1
+ require_relative 'auditable'
2
+ module StudioGame
3
+ class LoadedDie
4
+ include Auditable
5
+ attr_reader :number
6
+
7
+ def roll
8
+ numbers = [1,1,2,5,6,6]
9
+ #numbers = [1,2,3,4,5,6]
10
+ @number = numbers.sample
11
+ audit
12
+ @number
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ module StudioGame
2
+ module Playable
3
+ def blam #-10 health
4
+ self.health -= 10
5
+ puts "#{name} got blammed!"
6
+ end
7
+
8
+ def w00t #+15 health
9
+ self.health += 15
10
+ puts "#{name} got w00ted!"
11
+ end
12
+
13
+ def strong?
14
+ health>100
15
+ end
16
+
17
+
18
+ end
19
+ end
@@ -0,0 +1,82 @@
1
+ require_relative 'treasure_trove'
2
+ require_relative 'playable'
3
+ module StudioGame
4
+ class Player
5
+ include Playable
6
+ attr_accessor :name, :health
7
+
8
+ def initialize(name, health=100)
9
+ @name = name.capitalize
10
+ @health= health
11
+ @found_treasures = Hash.new(0)
12
+ #puts "Player #{@name} with a health of#{@health} created successfully at #{Time.new.strftime("%A %d/%m/%Y at %I:%M%p")}"
13
+ end
14
+ def to_csv
15
+ "#{@name}, #{@health}"
16
+ end
17
+
18
+ def self.from_csv(line)
19
+ name, health = line.split(',')
20
+ player = Player.new(name, Integer(health))
21
+ end
22
+
23
+ def each_found_treasure
24
+ @found_treasures.each do |name, points|
25
+ yield Treasure.new(name, points)
26
+ end
27
+ end
28
+
29
+ def points
30
+ @found_treasures.values.reduce(0,:+)#redu
31
+ end
32
+
33
+ def found_treasure(treasure)
34
+ @found_treasures[treasure.name] += treasure.points
35
+ puts "#{@name} found #{treasure.name} worth #{treasure.points} points"
36
+ puts "#{@name}'s treasures: #{@found_treasures}"
37
+ end
38
+
39
+ def score
40
+ @health + points
41
+ end
42
+
43
+ def to_s
44
+ "I'm #{@name} with health = #{@health}, points = #{points}, and score = #{score}."
45
+ end
46
+
47
+ def name=(new_name)
48
+ @name=new_name.capitalize
49
+ end
50
+
51
+ def <=>(other)
52
+ other.score <=> score
53
+ end
54
+ end
55
+ end
56
+ if __FILE__ == $0
57
+ player = Player.new("moe")
58
+ puts player.name
59
+ puts player.health
60
+ player.w00t
61
+ puts player.health
62
+ player.blam
63
+ puts player.health
64
+ puts "-----------"
65
+ berserker = Player.new("berserker", 50)
66
+ 6.times {berserker.w00t}
67
+ 2.times {berserker.blam}
68
+ puts berserker.health
69
+ =begin
70
+ puts :health.object_id
71
+ puts :name.object_id
72
+ puts player.object_id
73
+ puts player.health.object_id
74
+ puts player.name.object_id
75
+ puts "---------"
76
+ puts :health.object_id
77
+ puts :name.object_id
78
+ puts player.object_id
79
+ puts player.health.object_id
80
+ puts player.name.object_id
81
+ =end
82
+ end
@@ -0,0 +1,24 @@
1
+
2
+ module StudioGame
3
+ Treasure = Struct.new(:name, :points)
4
+
5
+ module TreasureTrove
6
+ TREASURES = [
7
+ Treasure.new(:pie,5),
8
+ Treasure.new(:bottle,25),
9
+ Treasure.new(:hammer,50),
10
+ Treasure.new(:skillet,100),
11
+ Treasure.new(:broomstick,200),
12
+ Treasure.new(:crowbar,400)
13
+ ]
14
+
15
+ def self.random
16
+ TREASURES.sample
17
+ end
18
+ end
19
+ end
20
+ if __FILE__ == $0
21
+ puts TreasureTrove::TREASURES
22
+ joia = TreasureTrove.random
23
+ puts "ACHOU O #{joia.name}"
24
+ end
@@ -0,0 +1,31 @@
1
+ require 'studio_game/berserk_player'
2
+ module StudioGame
3
+ describe BerserkPlayer do
4
+ before do
5
+ @initial_health = 50
6
+ @player = BerserkPlayer.new("berserker", @initial_health)
7
+ $stdout = StringIO.new
8
+
9
+ end
10
+
11
+ it "does not go berserk when w00ted up it 5 times" do
12
+ 1.upto(5) {@player.w00t}
13
+
14
+ @player.berserk?.should be_falsey
15
+ end
16
+
17
+ it "goes berserk when w00ted more than 5 times" do
18
+ 1.upto(6) {@player.w00t}
19
+
20
+ #@player.berserk?.should be_truthy
21
+ expect(@player.berserk?).to eq(true)
22
+ end
23
+
24
+ it "gets w00ted instead of blammed when it's gone berserk" do
25
+ 1.upto(6) {@player.w00t}
26
+ 1.upto(2) {@player.blam}
27
+
28
+ expect(@player.health).to eq(@initial_health +(8*15))
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ require 'studio_game/clumsy_player'
2
+ module StudioGame
3
+ describe ClumsyPlayer do
4
+ before do
5
+ @player = ClumsyPlayer.new("klutz")
6
+ $stdout = StringIO.new
7
+
8
+ end
9
+
10
+ it "only gets half the point value for each treasure" do
11
+ expect(@player.points).to eq(0)
12
+ hammer = Treasure.new(:hammer, 50)
13
+ @player.found_treasure(hammer)
14
+ @player.found_treasure(hammer)
15
+ @player.found_treasure(hammer)
16
+ expect(@player.points).to eq(75)
17
+
18
+ crowbar= Treasure.new(:crowbar, 400)
19
+ @player.found_treasure(crowbar)
20
+ expect(@player.points).to eq(275)
21
+
22
+ yielded = []
23
+ @player.each_found_treasure do |treasu|
24
+ yielded << treasu
25
+ end
26
+
27
+ expect(yielded).to eq([Treasure.new(:hammer, 75), Treasure.new(:crowbar, 200)])
28
+ end
29
+
30
+ context "with a boost factor" do
31
+ before do
32
+ @initial_health = 100
33
+ @boost_factor = 5
34
+ @player = ClumsyPlayer.new("klutz", @initial_health, @boost_factor)
35
+ $stdout = StringIO.new
36
+
37
+ end
38
+
39
+ it "has a boost factor" do
40
+ expect(@player.boost_factor).to eq(5)
41
+ end
42
+
43
+ it "gets boost factor number of w00ts when w00ted" do
44
+ @player.w00t
45
+
46
+ expect(@player.health).to eq((@initial_health + (15 * @boost_factor)))
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,61 @@
1
+
2
+ require 'studio_game/game'
3
+ module StudioGame
4
+ describe Game do
5
+ before do
6
+ @game = Game.new("Ludo_2")
7
+ @health = 100
8
+ @player = Player.new("Alex", @health)
9
+ @game.add_player(@player)
10
+ end
11
+ it "'w00ts' the player if a high number is rolled" do
12
+ allow_any_instance_of(LoadedDie).to receive(:roll).and_return(5)
13
+ @game.play(2)
14
+
15
+ expect(@player.health).to eq(@health + (15*2))
16
+ end
17
+ it "Skips the player if a medium number is rolled" do
18
+ allow_any_instance_of(LoadedDie).to receive(:roll).and_return(3)
19
+ @game.play(2)
20
+
21
+ expect(@player.health).to eq(@health)
22
+ end
23
+ it "'blam' the player if a low number is rolled" do
24
+ allow_any_instance_of(LoadedDie).to receive(:roll).and_return(1)
25
+ @game.play(2)
26
+
27
+ expect(@player.health).to eq(@health - (10*2))
28
+ end
29
+
30
+ it "assigns a treasure for points during a player's turn" do
31
+ game = Game.new("Knuckleheads")
32
+ player = Player.new("moe")
33
+
34
+ game.add_player(player)
35
+
36
+ game.play(1)
37
+
38
+ expect(player.points).not_to be_zero
39
+
40
+ end
41
+ it "computes total points as the sum of all player points" do
42
+ game = Game.new("Knuckleheads")
43
+
44
+ player1 = Player.new("moe")
45
+ player2 = Player.new("larry")
46
+
47
+ game.add_player(player1)
48
+ game.add_player(player2)
49
+
50
+ player1.found_treasure(Treasure.new(:hammer, 50))
51
+ player1.found_treasure(Treasure.new(:hammer, 50))
52
+ player2.found_treasure(Treasure.new(:crowbar, 400))
53
+
54
+ #game.total_points.should == 500
55
+ expect(game.total_points).to eq(500)
56
+ end
57
+
58
+
59
+
60
+ end
61
+ end
@@ -0,0 +1,152 @@
1
+ require 'studio_game/player'
2
+ require 'studio_game/treasure_trove'
3
+ module StudioGame
4
+ describe Player do
5
+ before do
6
+ @player = Player.new("moe")
7
+ $stdout = StringIO.new
8
+ end
9
+
10
+ it "Todo jogador tem a primeira letra do seu nome maiúscula (capitalized)" do
11
+ expect(@player.name).to eq("Moe")
12
+ end
13
+
14
+ it "Todo jogador começa com um número de vida" do
15
+ @player2 = Player.new("Larry", 60)
16
+ expect(@player2.health).to eq(60)
17
+ end
18
+
19
+ it "Caso não seja inserido o valor inicial de vida do jogador, é atribuído o valor de 100" do
20
+ expect(@player.health).to eq(100)
21
+ end
22
+
23
+ # 🔥 Corrigido: o score inicial é apenas a vida (não usa nome.length)
24
+ it "O score inicial é igual ao número de vida" do
25
+ expect(@player.score).to eq(100)
26
+ end
27
+
28
+ it "Decrementar 10 da vida do jogador" do
29
+ @player.blam
30
+ expect(@player.health).to eq(90)
31
+ end
32
+
33
+ it "Incrementar 15 da vida do jogador" do
34
+ @player.w00t
35
+ expect(@player.health).to eq(115)
36
+ end
37
+
38
+ it "Caso queira trocar o nome do jogador, seu novo nome também terá a primeira letra maiúscula" do
39
+ @player.name = "momo"
40
+ expect(@player.name).to eq("Momo")
41
+ end
42
+
43
+ context "Com um health maior que 100" do
44
+ before do
45
+ @player = Player.new("Alex", 150)
46
+ end
47
+ it "O jogador é forte?(strong?)" do
48
+ expect(@player.strong?).to eq(true)
49
+ end
50
+ end
51
+
52
+ context "Com um health igual a 100" do
53
+ before do
54
+ @player = Player.new("Alex", 100)
55
+ end
56
+ it "O jogador é forte?(strong?)" do
57
+ expect(@player.strong?).to eq(false)
58
+ end
59
+ end
60
+
61
+ context "Com um health menor que 100" do
62
+ before do
63
+ @player = Player.new("Alex", 99)
64
+ end
65
+ it "O jogador é forte?(strong?)" do
66
+ expect(@player.strong?).to eq(false)
67
+ end
68
+ end
69
+
70
+ context "in a collection of players" do
71
+ before do
72
+ @player1 = Player.new("moe", 100)
73
+ @player2 = Player.new("larry", 200)
74
+ @player3 = Player.new("curly", 300)
75
+
76
+ @players = [@player1, @player2, @player3]
77
+ end
78
+
79
+ it "is sorted by decreasing score" do
80
+ expect(@players.sort).to eq([@player3, @player2, @player1])
81
+ end
82
+ end
83
+
84
+ it "computes points as the sum of all treasure points" do
85
+ expect(@player.points).to eq(0)
86
+
87
+ @player.found_treasure(Treasure.new(:hammer, 50))
88
+ expect(@player.points).to eq(50)
89
+
90
+ @player.found_treasure(Treasure.new(:crowbar, 400))
91
+ expect(@player.points).to eq(450)
92
+
93
+ @player.found_treasure(Treasure.new(:hammer, 50))
94
+ expect(@player.points).to eq(500)
95
+ end
96
+
97
+ it "computes a score as the sum of its health and points" do
98
+ @player.found_treasure(Treasure.new(:hammer, 50))
99
+ @player.found_treasure(Treasure.new(:hammer, 50))
100
+
101
+ # health 100 + points 100 = 200
102
+ expect(@player.score).to eq(200)
103
+ end
104
+
105
+ context "string to_s" do
106
+ before do
107
+ @player = Player.new("Larry", 150)
108
+ end
109
+
110
+ it "has a string representation" do
111
+ @player.found_treasure(Treasure.new(:hammer, 50))
112
+ @player.found_treasure(Treasure.new(:hammer, 50))
113
+
114
+ expect(@player.to_s).to eq("I'm Larry with health = 150, points = 100, and score = 250.")
115
+ end
116
+ end
117
+
118
+
119
+
120
+
121
+
122
+ it "yields each found treasure and its total points" do
123
+ @player.found_treasure(Treasure.new(:skillet, 100))
124
+ @player.found_treasure(Treasure.new(:skillet, 100))
125
+ @player.found_treasure(Treasure.new(:hammer, 50))
126
+ @player.found_treasure(Treasure.new(:bottle, 5))
127
+ @player.found_treasure(Treasure.new(:bottle, 5))
128
+ @player.found_treasure(Treasure.new(:bottle, 5))
129
+ @player.found_treasure(Treasure.new(:bottle, 5))
130
+ @player.found_treasure(Treasure.new(:bottle, 5))
131
+
132
+ yielded = []
133
+ @player.each_found_treasure do |treasure|
134
+ yielded << treasure
135
+ end
136
+
137
+ expect(yielded).to eq([
138
+ Treasure.new(:skillet, 200),
139
+ Treasure.new(:hammer, 50),
140
+ Treasure.new(:bottle, 25)
141
+ ])
142
+ end
143
+
144
+ it "can be created from a CSV string" do
145
+ player = Player.from_csv("larry,150")
146
+
147
+ player.name.should == "Larry"
148
+ player.health.should == 150
149
+ end
150
+
151
+ end
152
+ end
@@ -0,0 +1,47 @@
1
+ require 'studio_game/treasure_trove'
2
+ module StudioGame
3
+ describe Treasure do
4
+ before do
5
+ @treasure = Treasure.new(:hammer, 50)
6
+ end
7
+
8
+ it "has a name attribute" do
9
+ expect(@treasure.name).to eq(:hammer)
10
+ end
11
+ it "has a points attribute" do
12
+ expect(@treasure.points).to eq(50)
13
+ end
14
+
15
+ end
16
+
17
+ describe TreasureTrove do
18
+
19
+ it "has a six treasures" do
20
+ expect(TreasureTrove::TREASURES.size).to eq(6)
21
+ end
22
+ it "has a pie worth 5 points" do
23
+ expect(TreasureTrove::TREASURES[0]).to eq(Treasure.new(:pie, 5))
24
+ end
25
+ it "has a bottle worth 25 points" do
26
+ expect(TreasureTrove::TREASURES[1]).to eq(Treasure.new(:bottle, 25))
27
+ end
28
+ it "has a hammer worth 50 points" do
29
+ expect(TreasureTrove::TREASURES[2]).to eq(Treasure.new(:hammer, 50))
30
+ end
31
+ it "has a skillet worth 100 points" do
32
+ expect(TreasureTrove::TREASURES[3]).to eq(Treasure.new(:skillet, 100))
33
+ end
34
+ it "has a broomstick worth 200 points" do
35
+ expect(TreasureTrove::TREASURES[4]).to eq(Treasure.new(:broomstick, 200))
36
+ end
37
+ it "has a crowbar worth 400 points" do
38
+ expect(TreasureTrove::TREASURES[5]).to eq(Treasure.new(:crowbar, 400))
39
+ end
40
+ it "returns a random treasure" do
41
+ treasure = TreasureTrove.random
42
+
43
+ expect(TreasureTrove::TREASURES).to include(treasure)
44
+ end
45
+
46
+ end
47
+ end
metadata ADDED
@@ -0,0 +1,89 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio_game_alec
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - LucioAlec
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: rspec
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '3'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '3'
26
+ description: |
27
+ # Flicks
28
+
29
+ Command-line app/gem to play a game.
30
+
31
+ ## Run from source
32
+ ruby bin/studio_game
33
+
34
+ ## Features
35
+ - Load players from CSV
36
+ - Points system (blam/w00t)
37
+ - Treasure trove
38
+ - Clumsy and beserker player
39
+ email: lucioalec@gmail.com
40
+ executables:
41
+ - studio_game
42
+ extensions: []
43
+ extra_rdoc_files: []
44
+ files:
45
+ - LICENSE
46
+ - README.md
47
+ - bin/players.csv
48
+ - bin/studio_game
49
+ - lib/studio_game/auditable.rb
50
+ - lib/studio_game/berserk_player.rb
51
+ - lib/studio_game/clumsy_player.rb
52
+ - lib/studio_game/die.rb
53
+ - lib/studio_game/game.rb
54
+ - lib/studio_game/game_turn.rb
55
+ - lib/studio_game/loaded_die.rb
56
+ - lib/studio_game/playable.rb
57
+ - lib/studio_game/player.rb
58
+ - lib/studio_game/treasure_trove.rb
59
+ - spec/studio_game/berserk_player_spec.rb
60
+ - spec/studio_game/clumsy_player_spec.rb
61
+ - spec/studio_game/game_spec.rb
62
+ - spec/studio_game/player_spec.rb
63
+ - spec/studio_game/treasure_trove_spec.rb
64
+ licenses:
65
+ - MIT
66
+ metadata: {}
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '2.5'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubygems_version: 3.6.9
82
+ specification_version: 4
83
+ summary: Play a game with a roll die
84
+ test_files:
85
+ - spec/studio_game/berserk_player_spec.rb
86
+ - spec/studio_game/clumsy_player_spec.rb
87
+ - spec/studio_game/game_spec.rb
88
+ - spec/studio_game/player_spec.rb
89
+ - spec/studio_game/treasure_trove_spec.rb