studio-game-by-zsolo 0.1.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: 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: []