studio-game-by-zsolo 0.1.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: 4793c74478398a094b6c077b4ebb0b15852c1069ea5e1f43e7f32588674ebed1
4
+ data.tar.gz: 19891482a06bdc03ef8b442557efccdd235419c7d074991f81b7388361d5c645
5
+ SHA512:
6
+ metadata.gz: 5465b65cefb8564de973ba76a7c3f9d9b1372e3961230dade50ab5420ad9cace7d26cf82fd00a4abf1d10ceb7ce4e7baec250aaaf88c53e3ce16840f98eb9cde
7
+ data.tar.gz: ca8905e543974c0513bcf415209616a9dbaeea3562a4e0156a06738323c00b787245e5280ae36c93510c98d5c6874aa79cf5ad8f8c32aed84e86d211c14e6c25
data/LICENSE ADDED
@@ -0,0 +1 @@
1
+ This software is distributed under the MIT license
data/README ADDED
@@ -0,0 +1,3 @@
1
+ A simple command line game created as a guided project for the Pragmatic Studio Ruby course.
2
+
3
+ To run the game type: ./bin/app
@@ -0,0 +1,4 @@
1
+ bud, 120
2
+ terence, 100
3
+ ormond, 90
4
+ rosco, 70
data/bin/players.csv ADDED
@@ -0,0 +1,4 @@
1
+ moe, 90
2
+ larry, 60,
3
+ curly, 100
4
+ shemp, 120
data/bin/studio_game ADDED
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/studio_game/game'
4
+ require_relative '../lib/studio_game/clumsy_player'
5
+ require_relative '../lib/studio_game/berserk_player'
6
+
7
+ game = StudioGame::Game.new('knuckerheads')
8
+
9
+ default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
10
+ game.load_players(ARGV.shift || default_player_file)
11
+
12
+ klutz = StudioGame::ClumsyPlayer.new('klutz', 105, 4)
13
+ game.add_player(klutz)
14
+
15
+ berserker = StudioGame::BerserkPlayer.new('berserker', 50)
16
+ game.add_player(berserker)
17
+
18
+ loop do
19
+ puts "\nHow many game rounds? ('quit' to exit)"
20
+ answer = gets.chomp.downcase
21
+ case answer
22
+ when /^\d+$/
23
+ game.play(answer.to_i)
24
+ when 'quit', 'exit'
25
+ game.print_stats
26
+ # game.save_high_scores
27
+ break
28
+ else
29
+ puts "Please type a number or 'quit'"
30
+ end
31
+ end
@@ -0,0 +1,9 @@
1
+ module StudioGame
2
+ module Auditable
3
+
4
+ def audit
5
+ puts "Rolled #{self.number_rolled} (#{self.class})"
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,41 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+ class BerserkPlayer < Player
5
+
6
+ def initialize(name, health=100)
7
+ super(name, health)
8
+ @number_of_w00ts = 0
9
+ end
10
+
11
+ def w00t
12
+ super
13
+ @number_of_w00ts += 1
14
+ puts "#{@name} has become a berserker!" if berserk?
15
+ end
16
+
17
+ def blam
18
+ berserk? ? w00t : super
19
+ end
20
+
21
+ private
22
+
23
+ def berserk?
24
+ @number_of_w00ts > 5
25
+ end
26
+
27
+ end
28
+
29
+ if __FILE__ == $0
30
+ berserk = BerserkPlayer.new('bob', 100)
31
+
32
+ puts berserk
33
+
34
+ 3.times { berserk.blam }
35
+ 6.times { berserk.w00t }
36
+ 2.times { berserk.blam }
37
+ puts berserk.health
38
+
39
+ end
40
+ end
41
+
@@ -0,0 +1,43 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+ class ClumsyPlayer < Player
5
+
6
+ attr_reader :boost_factor
7
+
8
+ def initialize(name, health=100, boost_factor=3)
9
+ super(name, health)
10
+ @boost_factor = boost_factor
11
+ end
12
+
13
+ def found_treasure(treasure)
14
+ damaged_treasure = TreasureTrove::Treasure.new(treasure.name, treasure.point / 2.0)
15
+ super(damaged_treasure)
16
+ end
17
+
18
+ def w00t
19
+ @boost_factor.times { super }
20
+ end
21
+
22
+ end
23
+
24
+ if __FILE__ == $0
25
+ klutz = ClumsyPlayer.new('klutz')
26
+ puts klutz
27
+ puts klutz.boost_factor
28
+
29
+ hammer = TreasureTrove::Treasure.new(:hammer, 50)
30
+ klutz.found_treasure(hammer)
31
+ klutz.found_treasure(hammer)
32
+ klutz.found_treasure(hammer)
33
+
34
+ crowbar = TreasureTrove::Treasure.new(:crowbar, 400)
35
+ klutz.found_treasure(crowbar)
36
+
37
+ klutz.each_found_treasure do |treasure|
38
+ puts "#{treasure.point} points of #{treasure.name}"
39
+ end
40
+
41
+ puts "#{klutz.treasure_points} total treasure_points"
42
+ end
43
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'auditable'
2
+
3
+ module StudioGame
4
+ class Die
5
+ include Auditable
6
+
7
+ attr_reader :number_rolled
8
+
9
+ def initialize
10
+ roll
11
+ end
12
+
13
+ def roll
14
+ @number_rolled = rand(1..6)
15
+ audit
16
+ @number_rolled
17
+ end
18
+
19
+ end
20
+
21
+ if __FILE__ == $0
22
+ die = Die.new
23
+ die.roll
24
+ puts die.number_rolled
25
+ end
26
+ end
@@ -0,0 +1,106 @@
1
+ require_relative 'player'
2
+ require_relative 'game_turn'
3
+
4
+ module StudioGame
5
+ class Game
6
+
7
+ attr_reader :name
8
+
9
+ def initialize(name)
10
+ @name = name.capitalize
11
+ @players = []
12
+ @total_treasure_points = 0
13
+ end
14
+
15
+ def load_players(from_file)
16
+ File.readlines(from_file).each do |line|
17
+ add_player(Player.from_CSV(line))
18
+ end
19
+ end
20
+
21
+ def add_player(player)
22
+ @players << player
23
+ end
24
+
25
+ def play(num_of_turns)
26
+
27
+ puts '******************************'
28
+ puts "There are #{@players.size} players in #{@name}:"
29
+ @players.each do |player|
30
+ puts player
31
+ end
32
+
33
+ puts '******************************'
34
+ puts "There are #{TreasureTrove::TREASURES.size} treasures to be found:"
35
+ TreasureTrove::TREASURES.each do |t|
36
+ puts "A #{t.name} is worth #{t.point} points"
37
+ end
38
+
39
+ puts '******************************'
40
+ 1.upto(num_of_turns) do |n|
41
+ puts "\nTurn #{n}:"
42
+ @players.each do |player|
43
+ GameTurn.take_turn(player)
44
+ puts player
45
+ end
46
+ end
47
+
48
+ end
49
+
50
+ def print_stats
51
+ puts '******************************'
52
+ puts "\n#{@name} Statistics:"
53
+ strong, wimpy = @players.partition { |p| p.strong? }
54
+
55
+ puts "#{strong.size} strong players:"
56
+ strong.each { |p| puts print_name_and_health(p) }
57
+
58
+ puts "#{wimpy.size} wimpy players:"
59
+ wimpy.each { |p| puts print_name_and_health(p) }
60
+
61
+ puts '******************************'
62
+ @players.each do |p|
63
+ puts "#{p.name}'s treasure point totals:"
64
+ p.each_found_treasure do |treasure|
65
+ puts "#{treasure.point} total point of #{treasure.name}"
66
+ end
67
+ puts "#{p.treasure_points} grand total points"
68
+ end
69
+
70
+ puts
71
+ puts "#{total_treasure_points} total points from treasures found."
72
+
73
+ puts '******************************'
74
+ puts "\n#{@name} High Scores:"
75
+ ranked_players.each { |p| puts format_high_scores(p) }
76
+ end
77
+
78
+ def save_high_scores(to_file="high_scores.txt")
79
+ File.open(to_file, 'w') do |file|
80
+ file.puts("#{@name} High Scores:")
81
+ ranked_players.each { |p| file.puts format_high_scores(p) }
82
+ end
83
+ end
84
+
85
+ private
86
+
87
+ def total_treasure_points
88
+ @players.reduce(0) { |sum, p| sum + p.treasure_points }
89
+ end
90
+
91
+ def print_name_and_health(player)
92
+ "#{player.name} (#{player.health})"
93
+ end
94
+
95
+ def ranked_players
96
+ @players.sort { |a, b| b.score <=> a.score}
97
+ end
98
+
99
+ def format_high_scores(player)
100
+ "#{player.name.ljust(20, '.')} #{player.score}"
101
+ end
102
+
103
+ end
104
+ end
105
+
106
+
@@ -0,0 +1,35 @@
1
+ require_relative 'loaded_die'
2
+ require_relative 'treasure_trove'
3
+
4
+ module StudioGame
5
+ module GameTurn
6
+
7
+ def self.take_turn(player)
8
+ die = LoadedDie.new
9
+ number_rolled = die.roll
10
+
11
+ case number_rolled
12
+ when 1..2
13
+ player.blam
14
+ when 5..6
15
+ player.w00t
16
+ else
17
+ puts "#{player.name} was skipped."
18
+ end
19
+
20
+ treasure = TreasureTrove.get_random_treasure
21
+ player.found_treasure(treasure)
22
+
23
+ end
24
+
25
+ def self.what_is_self
26
+ self
27
+ end
28
+
29
+ end
30
+
31
+ if __FILE__ == $0
32
+ puts self
33
+ puts GameTurn.what_is_self
34
+ end
35
+ end
@@ -0,0 +1,41 @@
1
+ def twice
2
+ puts "Before running your block"
3
+ if block_given?
4
+ puts yield(1)
5
+ result = yield(2)
6
+ puts "After running your block"
7
+ puts "Result: #{result}"
8
+ else
9
+ puts "No block given!"
10
+ end
11
+ end
12
+
13
+ twice { |n| n * 2 }
14
+
15
+ numbers = (1..10).to_a
16
+
17
+ puts numbers.select { |n| n.even? }
18
+
19
+ def my_select(arr)
20
+ new_arr = []
21
+ if block_given?
22
+ arr.each { |el| new_arr << el if yield(el) }
23
+ new_arr
24
+ else
25
+ "No block given"
26
+ end
27
+ end
28
+
29
+ puts my_select(numbers) { |n| n.odd? }
30
+
31
+ puts "********************"
32
+
33
+ def n_times(number)
34
+ 1.upto(number) { |c| yield c }
35
+ end
36
+
37
+ n_times(3) do |n|
38
+ puts "#{n} situps"
39
+ puts "#{n} pushups"
40
+ puts "#{n} chinups"
41
+ end
@@ -0,0 +1,23 @@
1
+ require_relative 'die'
2
+ require_relative 'auditable'
3
+
4
+ module StudioGame
5
+ class LoadedDie < Die
6
+ include Auditable
7
+
8
+ def roll
9
+ numbers = [1, 4, 5, 5, 6, 6, 6]
10
+ @number_rolled = numbers.sample
11
+ audit
12
+ @number_rolled
13
+ end
14
+
15
+ end
16
+
17
+ if __FILE__ == $0
18
+ loaded_die = LoadedDie.new
19
+ puts loaded_die.number_rolled
20
+ loaded_die.roll
21
+ puts loaded_die.number_rolled
22
+ end
23
+ end
@@ -0,0 +1,57 @@
1
+ module Rankable
2
+
3
+ def increase_rank
4
+ self.rank += 20
5
+ end
6
+
7
+ def decrease_rank
8
+ self.rank -= 10
9
+ end
10
+ end
11
+
12
+
13
+ class Movie
14
+ include Rankable
15
+
16
+ attr_accessor :rank, :title
17
+
18
+ def initialize(title, rank=10)
19
+ @title = title.capitalize
20
+ @rank = rank
21
+ end
22
+
23
+ def to_s
24
+ "#{@title} has a rank of #{@rank}"
25
+ end
26
+
27
+ end
28
+
29
+ class Song
30
+ include Rankable
31
+
32
+ attr_accessor :rank, :name
33
+
34
+ def initialize(name, rank=0)
35
+ @name = name.capitalize
36
+ @rank = rank
37
+ end
38
+
39
+ def to_s
40
+ "The song #{@name} has a popularity of #{@rank}"
41
+ end
42
+ end
43
+
44
+ if __FILE__ == $0
45
+ movie = Movie.new('ghostbusters')
46
+ song = Song.new('Alpha', 30)
47
+
48
+ puts movie
49
+ puts song
50
+ puts movie.rank
51
+ puts song.rank
52
+
53
+ 10.times { movie.increase_rank }
54
+ puts movie
55
+ 5.times { song.increase_rank }
56
+ puts song
57
+ end
@@ -0,0 +1,19 @@
1
+ module StudioGame
2
+ module Playable
3
+
4
+ def blam
5
+ self.health -= 10
6
+ puts "#{name} got blammed!"
7
+ end
8
+
9
+ def w00t
10
+ self.health += 15
11
+ puts "#{name} got w00ted!"
12
+ end
13
+
14
+ def strong?
15
+ health > 100
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,74 @@
1
+ require_relative 'treasure_trove'
2
+ require_relative 'playable'
3
+
4
+ module StudioGame
5
+ class Player
6
+ include Playable
7
+
8
+ attr_accessor :name, :health
9
+
10
+ def self.from_CSV(line)
11
+ name, health = line.split(',')
12
+ self.new(name, Integer(health))
13
+ end
14
+
15
+ def initialize(name, health=100)
16
+ @name = name.capitalize
17
+ @health = health
18
+ @found_treasures = Hash.new(0)
19
+ end
20
+
21
+ def found_treasure(treasure)
22
+ @found_treasures[treasure.name] += treasure.point
23
+ puts "#{@name} found a #{treasure.name} worth #{treasure.point} points"
24
+ puts "#{@name}'s treasures: #{@found_treasures}"
25
+ end
26
+
27
+ def treasure_points
28
+ @found_treasures.values.reduce(0, :+)
29
+ end
30
+
31
+ def each_found_treasure
32
+ @found_treasures.each do |name, value|
33
+ yield TreasureTrove::Treasure.new(name, value)
34
+ end
35
+ end
36
+
37
+ # Virtual attribute
38
+ def score
39
+ @health + treasure_points
40
+ end
41
+
42
+ # def health
43
+ # @health
44
+ # end
45
+
46
+ # def name
47
+ # @name
48
+ # end
49
+
50
+
51
+ def name=(new_name)
52
+ @name = new_name.capitalize
53
+ end
54
+
55
+ def to_s
56
+ "I'm #{@name} with health = #{@health}, points = #{treasure_points} and score = #{score}"
57
+ end
58
+
59
+
60
+ end
61
+
62
+ # __FILE - the name of this file, player.rb
63
+ # $0 - the name of the file that is being run - can be player.rb or app.rb, etc.
64
+ # the file being run is can also be accessed by $PROGRAM_FILE
65
+ if __FILE__ == $0
66
+ player1 = Player.new('zsolt', 95)
67
+ puts player1.name
68
+
69
+ player1.w00t
70
+ player1.w00t
71
+
72
+ puts player1
73
+ end
74
+ end
@@ -0,0 +1,29 @@
1
+ module StudioGame
2
+ module TreasureTrove
3
+
4
+ Treasure = Struct.new(:name, :point)
5
+
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.get_random_treasure
16
+ TREASURES.sample
17
+ end
18
+
19
+ end
20
+
21
+ if __FILE__ == $0
22
+ puts TreasureTrove.get_random_treasure
23
+ end
24
+ end
25
+
26
+
27
+
28
+
29
+
metadata ADDED
@@ -0,0 +1,83 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: studio-game-by-zsolo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Zsolt Szalma
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2023-02-05 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.8'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 2.8.0
23
+ type: :development
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '2.8'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 2.8.0
33
+ description: |
34
+ A simple command line game created as a guided project for the Pragmatic Studio Ruby course.
35
+
36
+ To run the game type: ./bin/app
37
+ email: zsolt.szalma@gmail.com
38
+ executables:
39
+ - studio_game
40
+ extensions: []
41
+ extra_rdoc_files: []
42
+ files:
43
+ - LICENSE
44
+ - README
45
+ - bin/fav_players.csv
46
+ - bin/players.csv
47
+ - bin/studio_game
48
+ - lib/studio_game/auditable.rb
49
+ - lib/studio_game/berserk_player.rb
50
+ - lib/studio_game/clumsy_player.rb
51
+ - lib/studio_game/die.rb
52
+ - lib/studio_game/game.rb
53
+ - lib/studio_game/game_turn.rb
54
+ - lib/studio_game/iterators.rb
55
+ - lib/studio_game/loaded_die.rb
56
+ - lib/studio_game/mixins.rb
57
+ - lib/studio_game/playable.rb
58
+ - lib/studio_game/player.rb
59
+ - lib/studio_game/treasure_trove.rb
60
+ homepage: http://szalmazsolt.com
61
+ licenses:
62
+ - MIT
63
+ metadata: {}
64
+ post_install_message:
65
+ rdoc_options: []
66
+ require_paths:
67
+ - lib
68
+ required_ruby_version: !ruby/object:Gem::Requirement
69
+ requirements:
70
+ - - ">="
71
+ - !ruby/object:Gem::Version
72
+ version: '1.9'
73
+ required_rubygems_version: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ requirements: []
79
+ rubygems_version: 3.2.22
80
+ signing_key:
81
+ specification_version: 4
82
+ summary: A simple turn-based command line game
83
+ test_files: []