jemchan 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: '03418e60a582133e51168fb8f07a697f1bcee17d85457c023122e82b0ea01743'
4
+ data.tar.gz: c994e2a028bffce0b76a04326429cae1e9790a6ccf99b822eade215c6aeb2d67
5
+ SHA512:
6
+ metadata.gz: facde0ba82727b7af14e1c14cca508ba5adb81a471b03bedf84b59c342862ad95897da7750d1d750862d479a1f5b76dc51c5a17567d52ce8add37e6cee4a1e8b
7
+ data.tar.gz: 69fee152e834aa97cd0940fec482555db4599c4173bb88fde6068991364206388df6fd04c333d2301e9bff3603d1b64fc1420e829373e77d5a80e86155e03519
data/bin/jemchan ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/studio_game/player'
4
+ require_relative '../lib/studio_game/game'
5
+ require_relative '../lib/studio_game/clumsy_player'
6
+ require_relative '../lib/studio_game/berserk_player'
7
+
8
+
9
+ player1 = JemChan::Player.new("moe")
10
+ player2 = JemChan::Player.new("larry", 70)
11
+ player3 = JemChan::Player.new("curly", 125)
12
+
13
+
14
+ player4 = JemChan::Player.new("alvin", 100)
15
+ player5 = JemChan::Player.new("simon", 60)
16
+ player6 = JemChan::Player.new("theodore", 125)
17
+
18
+
19
+ knuckleheads = JemChan::Game.new("Knucleheads")
20
+ knuckleheads.add_player(player1)
21
+ knuckleheads.add_player(player2)
22
+ knuckleheads.add_player(player3)
23
+ knuckleheads.play(3)
24
+ knuckleheads.print_stats
25
+
26
+
27
+
28
+ knuckleheads = JemChan::Game.new("Knuckleheads")
29
+ default_player_file = File.join(File.dirname(__FILE__), 'player.csv')
30
+ knuckleheads.load_players(ARGV.shift || default_player_file)
31
+
32
+ klutz = JemChan::ClumsyPlayer.new("klutz", 105)
33
+ knuckleheads.add_player(klutz)
34
+
35
+ berserker = JemChan::BerserkPlayer.new("berserker", 50)
36
+ knuckleheads.add_player(berserker)
37
+
38
+
39
+
40
+ loop do
41
+
42
+
43
+ puts "\nHow many rounds? ('quit' to 'exit')"
44
+ answer = gets.chomp.downcase
45
+ case answer
46
+ when /^\d+$/
47
+ knuckleheads.play(answer.to_i)
48
+ when 'quit', 'exit'
49
+ knuckleheads.print_stats
50
+ break
51
+ else
52
+ puts "Please enter a number or 'quit' "
53
+ end
54
+ end
55
+
56
+ knuckleheads.save_high_scores
57
+
58
+ # game = StudioGame::Game.new("Knuckleheads")
59
+
60
+
data/bin/player.csv ADDED
@@ -0,0 +1,3 @@
1
+ Alvin,100
2
+ Simon,60
3
+ Theo,125
@@ -0,0 +1,11 @@
1
+ # module JemChan
2
+
3
+ module Auditable
4
+
5
+ def audit
6
+ puts "Rolled a #{self.number} (#{self.class})"
7
+ end
8
+
9
+ end
10
+
11
+ # end
@@ -0,0 +1,36 @@
1
+ require_relative 'player'
2
+
3
+ module JemChan
4
+
5
+ class BerserkPlayer < Player
6
+ def initialize(name, health = 100)
7
+ super(name, health)
8
+ @w00t_count = 0
9
+ end
10
+
11
+ def berserk?
12
+ @w00t_count > 5
13
+ end
14
+
15
+ def w00t
16
+ super
17
+ @w00t_count += 1
18
+ puts "#{@name} is berserk!" if berserk?
19
+ end
20
+
21
+ def blam
22
+ if berserk?
23
+ w00t
24
+ else
25
+ super
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ if __FILE__ == $0
32
+ berserker = BerserkPlayer.new("berserker", 50)
33
+ 6.times {berserker.w00t}
34
+ 2.times {berserker.blam}
35
+ puts berserker.health
36
+ end
@@ -0,0 +1,35 @@
1
+ require_relative 'player'
2
+
3
+ module JemChan
4
+
5
+ class ClumsyPlayer < Player
6
+
7
+ def found_treasures(treasure)
8
+ damaged_treasure = Treasure.new(treasure.name, treasure.points / 2.0)
9
+ super (damaged_treasure)
10
+ # points = treasure.points / 2.0
11
+ # @found_treasures[treasure.name] += points
12
+ # puts "#{@name} found a #{treasure.name} worth #{points} points."
13
+ end
14
+
15
+ end
16
+ end
17
+
18
+ if __FILE__ == $0
19
+ clumsy = ClumsyPlayer.new("klutz")
20
+
21
+ hammer = Treasure.new(:hammer, 50)
22
+ clumsy.found_treasures(hammer)
23
+ clumsy.found_treasures(hammer)
24
+ clumsy.found_treasures(hammer)
25
+
26
+ crowbar = Treasure.module StudioGame
27
+ new(:crowbar, 400)
28
+ clumsy.found_treasures(crowbar)
29
+
30
+ clumsy.each_found_treasure do |treasure|
31
+ puts "#{treasure.points} total #{treasure.name} points"
32
+ end
33
+ puts "#{clumsy.points} grand total points"
34
+ end
35
+
@@ -0,0 +1,19 @@
1
+ require_relative 'auditable'
2
+
3
+ module JemChan
4
+
5
+ class Die
6
+ include Auditable
7
+
8
+ attr_reader :number
9
+
10
+ # def initialize
11
+ # roll
12
+ # end
13
+
14
+ def roll
15
+ rand(1..6)
16
+ end
17
+ end
18
+
19
+ end
@@ -0,0 +1,135 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'game_turn'
4
+ require_relative 'treasure_trove'
5
+
6
+ module JemChan
7
+ class Game
8
+ attr_reader :title
9
+
10
+ def initialize (title)
11
+ @title = title
12
+ @players = []
13
+ end
14
+
15
+ def add_player (a_player)
16
+ @players << a_player
17
+ end
18
+
19
+ def play(rounds)
20
+ puts "There are #{@players.size} players in #{@title}:"
21
+
22
+ @players.each do |player|
23
+ puts player
24
+ end
25
+
26
+ 1.upto(rounds) do |round|
27
+ puts "\nRound #{round}:"
28
+ @players.each do |player|
29
+ GameTurn.take_turn(player)
30
+ puts player
31
+ end
32
+
33
+ # if block_given?
34
+ # break if yield
35
+ # end
36
+ end
37
+
38
+ @players.each do |player|
39
+ player.w00t
40
+ puts player
41
+ end
42
+
43
+ treasures = TreasureTrove::TREASURES
44
+ puts "\nThere ara #{treasures.size} treasures to be found:"
45
+ treasures.each do |treasure|
46
+ puts "A #{treasure.name} is worth #{treasure.points} points"
47
+ end
48
+
49
+ end
50
+
51
+ def print_name_and_health(player)
52
+ puts "\n#{player.name} (#{player.health})"
53
+ end
54
+
55
+ def print_stats
56
+ puts "\n#{@title} Statistics:"
57
+
58
+ strong_players, wimpy_players = @players.partition { |player| player.strong? }
59
+
60
+ puts "\n#{strong_players.size} strong players:"
61
+ strong_players.each do |player|
62
+ print_name_and_health(player)
63
+ end
64
+
65
+ puts "\n#{wimpy_players.size} wimpy players:"
66
+ wimpy_players.each do |player|
67
+ print_name_and_health(player)
68
+ end
69
+
70
+ # sorted_players = @players.sort { |a, b| b.score <=> a.score }
71
+ # puts "\n#{@title} High Scores:"
72
+ # sorted_players.each do |player|
73
+ # formatted_name = player.name.ljust(20, '.')
74
+ # puts "#{formatted_name} #{player.score}"
75
+ # end
76
+
77
+ puts "\n#{@title} High Score:"
78
+ @players.sort.each do |player|
79
+ puts high_score_entry(player)
80
+ # formatted_name = player.name.ljust(20, '.')
81
+ # puts "#{formatted_name} #{player.score}"
82
+ end
83
+
84
+ @players.each do |player|
85
+ puts "\n#{player.name}'s points totals:"
86
+ puts "#{player.points} grand total points"
87
+ end
88
+
89
+ @players.each do |player|
90
+ puts "\n#{player.name}'s points total:"
91
+ player.each_found_treasure do |treasure|
92
+ puts "#{treasure.points} total #{treasure.name} points"
93
+ end
94
+ puts "#{player.points} grand total points"
95
+ end
96
+
97
+ end
98
+
99
+ def load_players(from_file)
100
+ File.readlines(from_file).each do |line|
101
+ add_player(Player.from_csv(line))
102
+ #puts line
103
+ # name, health = line.split(',')
104
+ # player = Player.new(name, Integer(health))
105
+ # add_player(player)
106
+ end
107
+ end
108
+
109
+ # def total_points
110
+ # knuckleheads.play(10) do
111
+ # knuckleheads.total_points >= 2000
112
+ # end
113
+ # end
114
+ def save_high_scores(to_file = "high_score.txt")
115
+ File.open(to_file, "w") do |file|
116
+ file.puts "#{@title} High Scores:"
117
+ @players.sort.each do |player|
118
+ file.puts high_score_entry(player)
119
+ # formatted_name = player.name.ljust(20, '.')
120
+ # file.puts "#{formatted_name} #{player.score}"
121
+ end
122
+ end
123
+ end
124
+
125
+ def high_score_entry(player)
126
+ formatted_name = player.name.ljust(20, '.')
127
+ "#{formatted_name} #{player.score}"
128
+ end
129
+
130
+ end
131
+ end
132
+
133
+
134
+
135
+
@@ -0,0 +1,26 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'treasure_trove'
4
+ require_relative 'loaded_die'
5
+
6
+ # module JemChan
7
+
8
+ module GameTurn
9
+ def self.take_turn(player)
10
+ die = JemChan::Die.new
11
+ case die.roll
12
+ when 1..2
13
+ player.blam
14
+ when 3..4
15
+ puts "#{player.name} was skipped."
16
+ else
17
+ player.w00t
18
+ end
19
+
20
+ treasure = TreasureTrove.random
21
+ player.found_treasures(treasure)
22
+ # puts "#{player.name} found a #{treasure.name} worth #{treasure.points} points."
23
+ end
24
+ end
25
+
26
+ # end
@@ -0,0 +1,18 @@
1
+ require_relative 'auditable'
2
+
3
+ module JemChan
4
+
5
+ class LoadedDie
6
+ include Auditable
7
+
8
+ attr_reader :number
9
+
10
+ def roll
11
+ number = [1, 2, 3, 4, 5, 6]
12
+ @number = number.sample
13
+ audit
14
+ @number
15
+ end
16
+ end
17
+
18
+ end
@@ -0,0 +1,21 @@
1
+ # module JemChan
2
+
3
+ module Playable
4
+
5
+ def blam
6
+ @health -= 10
7
+ puts "#{@name} got blammed!"
8
+ end
9
+
10
+ def w00t
11
+ @health += 15
12
+ puts "#{@name} got WOOted!"
13
+ end
14
+
15
+ def strong?
16
+ @health > 100
17
+ end
18
+
19
+ end
20
+
21
+ # end
@@ -0,0 +1,83 @@
1
+ require_relative 'treasure_trove'
2
+ require_relative 'playable'
3
+
4
+ module JemChan
5
+
6
+ class Player
7
+ include Playable
8
+
9
+ attr_reader :health
10
+ attr_accessor :name
11
+
12
+
13
+ def initialize (name, health = 100)
14
+ @name = name.capitalize
15
+ @health = health
16
+ @found_treasures = Hash.new(0)
17
+ end
18
+
19
+ #def normalized_health
20
+ # @health / 10
21
+ #end
22
+ def score
23
+ @health + points
24
+ end
25
+
26
+
27
+ def to_s
28
+ "I'm #{@name} with a health of = #{@health}, points = #{points} and a score of = #{score}."
29
+ end
30
+
31
+ # def blam
32
+ # @health -= 10
33
+ # puts "#{@name} got blammed!"
34
+ # end
35
+
36
+ # def w00t
37
+ # @health += 15
38
+ # puts "#{@name} got WOOted!"
39
+ # end
40
+
41
+ # def strong?
42
+ # @health > 100
43
+ # end
44
+
45
+ def <=>(other)
46
+ other.score <=> score
47
+ end
48
+
49
+ def found_treasures(treasure)
50
+ @found_treasures[treasure.name] += treasure.points
51
+ puts "#{@name} found a #{treasure.name} worth #{treasure.points} points."
52
+ puts "#{@name}'s treasures: #{@found_treasures}"
53
+ end
54
+
55
+ def points
56
+ @found_treasures.values.reduce(0, :+)
57
+ end
58
+
59
+ def each_found_treasure
60
+ @found_treasures.each do |name, points|
61
+ yield Treasure.new(name, points)
62
+ end
63
+ end
64
+
65
+ def self.from_csv(string)
66
+ name, health = string.split(',')
67
+ Player.new(name, Integer(health))
68
+ end
69
+
70
+ end
71
+
72
+ end
73
+
74
+ if __FILE__ == $0
75
+ player = Player.new("moe")
76
+ puts player.name
77
+ puts player.health
78
+ player.w00t
79
+ puts player.health
80
+ player.blam
81
+ puts player.health
82
+ end
83
+
@@ -0,0 +1,20 @@
1
+
2
+ # module JemChan
3
+ Treasure = Struct.new(:name, :points)
4
+
5
+ module TreasureTrove
6
+
7
+ TREASURES = [
8
+ Treasure.new(:pie, 5),
9
+ Treasure.new(:bottle, 25),
10
+ Treasure.new(:hammer, 50),
11
+ Treasure.new(:skillet, 100),
12
+ Treasure.new(:broomstick, 200),
13
+ Treasure.new(:crowbar, 400),
14
+ ]
15
+
16
+ def self.random
17
+ TREASURES.sample
18
+ end
19
+ end
20
+ # end
metadata ADDED
@@ -0,0 +1,55 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jemchan
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jude Mar B. Navia
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-02-08 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description:
14
+ email: marbayo58@gmail.com
15
+ executables:
16
+ - jemchan
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - bin/jemchan
21
+ - bin/player.csv
22
+ - lib/studio_game/auditable.rb
23
+ - lib/studio_game/berserk_player.rb
24
+ - lib/studio_game/clumsy_player.rb
25
+ - lib/studio_game/die.rb
26
+ - lib/studio_game/game.rb
27
+ - lib/studio_game/game_turn.rb
28
+ - lib/studio_game/loaded_die.rb
29
+ - lib/studio_game/playable.rb
30
+ - lib/studio_game/player.rb
31
+ - lib/studio_game/treasure_trove.rb
32
+ homepage: https://online.pragmaticstudio.com/
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: '1.9'
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.0.3
52
+ signing_key:
53
+ specification_version: 4
54
+ summary: Play with your health as treasures
55
+ test_files: []