jj-studio_game 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: bb1492c2e149f6197d9263443f4af1d786b2b407affddeaa21d22b05c96fe39d
4
+ data.tar.gz: 3b1bbd8a63c83c2dffaa80d7fcef624108197c359bd57b8cf8c38ec8314896c0
5
+ SHA512:
6
+ metadata.gz: 75e8b8df169e745571d969104d47538fa7dcd37e26b23a263c91367abec197b9a0b5cbc991403e112ad942a29fd894cfbea12ff45edd82dd42bc34aa90a307f8
7
+ data.tar.gz: f149cc8353583759f3ef05e16b025d72d5b60fff5aa0c7036a0e26331c49d16d7ca2c206205ac89c77e5082affe0fa0ed6da95183a506cd0416b900905e5ba64
data/LICENSE ADDED
@@ -0,0 +1,8 @@
1
+ *** LICENSE AGREEMENT ***
2
+
3
+ This is my open source license for 'studio_game'. I truly don't care what you
4
+ do with this Ruby Gem, especially since you probably won't use it for anything,
5
+ as long as it's legal. I, Jacob Johnkoski, DO NOT CONDONE NOR AM RESPONSIBLE
6
+ for anything illegal done with this software.
7
+
8
+ Have a nice day!
data/README ADDED
@@ -0,0 +1,14 @@
1
+ *** READ ME ***
2
+
3
+ You don't really have to. There's nothing substantial in here.
4
+ This is a simple introductory ruby program for playing a silly
5
+ game and it's just part of an introductory ruby course.
6
+
7
+ If you, somehow, for some reason, found yourself actually reading
8
+ this, then I firstly want to apologize that you find yourself in
9
+ that position. Secondly, I hope you have a nice day. Thirdly,
10
+ I want to say "Hello!" from me, my wife Tiffany, my cats Spooky,
11
+ Kazmir, Annika, Meatball, Pig, and Spice.
12
+
13
+ YOU WILL BE ASSIMILATED.
14
+ RESISTANCE IS FUTILE.
@@ -0,0 +1,6 @@
1
+ Knuckleheads's High Scores:
2
+ Jacob...............870
3
+ Tiff................720
4
+ Berserker...........505
5
+ Spooky..............345
6
+ Klutz...............179
@@ -0,0 +1,36 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require_relative '../lib/jj-studio_game/game'
4
+ require_relative '../lib/jj-studio_game/clumsy_player'
5
+ require_relative '../lib/jj-studio_game/berserk_player'
6
+ require_relative '../lib/jj-studio_game/auditable'
7
+
8
+ player1 = StudioGame::Player.new("moe", 100)
9
+ player2 = StudioGame::Player.new("larry", 60)
10
+ player3 = StudioGame::Player.new("curly", 125)
11
+ klutz = StudioGame::ClumsyPlayer.new("klutz", 105)
12
+ berserker = StudioGame::BerserkPlayer.new("berserker", 50)
13
+
14
+ knuckleheads = StudioGame::Game.new("knuckleheads")
15
+ default_player_file = File.join(File.dirname(__FILE__), 'players.csv')
16
+ knuckleheads.load_player(ARGV.shift || default_player_file)
17
+ knuckleheads.add_player(klutz)
18
+ knuckleheads.add_player(berserker)
19
+
20
+ loop do
21
+ puts "\nHow many rounds? ('quit' to exit)"
22
+ answer = gets.chomp.downcase
23
+ case answer
24
+ when /^\d+$/
25
+ puts "Enjoy your #{answer} rounds."
26
+ knuckleheads.play(answer.to_i)
27
+ knuckleheads.print_stats
28
+ when "quit", "exit"
29
+ knuckleheads.print_stats
30
+ break
31
+ else
32
+ puts "\nPlease enter a number or 'quit'"
33
+ end
34
+ end
35
+ knuckleheads.print_stats
36
+ knuckleheads.save_scores
data/bin/players.csv ADDED
@@ -0,0 +1,3 @@
1
+ jacob,200
2
+ tiff,150
3
+ spooky,125
@@ -0,0 +1,7 @@
1
+ module Auditable
2
+
3
+ def audit
4
+ puts "Rolled a #{self.number}.(#{self.class})"
5
+ end
6
+
7
+ end
@@ -0,0 +1,27 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+ class BerserkPlayer < Player
5
+
6
+ def initialize(name, health)
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
+ berserk? ? w00t : super
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'player'
2
+
3
+ module StudioGame
4
+ class ClumsyPlayer < Player
5
+
6
+ def found_treasure(treasure)
7
+ damaged_treasure = Treasure.new(treasure.name, treasure.points / 2)
8
+ super(damaged_treasure)
9
+ end
10
+
11
+ end
12
+
13
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'game'
2
+ require_relative 'auditable'
3
+
4
+ module StudioGame
5
+ class Die
6
+
7
+ include Auditable
8
+ attr_accessor :number
9
+
10
+ def roll
11
+ @number = rand(1..6)
12
+ audit
13
+ @number
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,100 @@
1
+ require_relative 'player'
2
+ require_relative 'gameturn'
3
+ require_relative 'treasures'
4
+
5
+ module StudioGame
6
+ class Game
7
+
8
+ attr_reader :title
9
+ attr_accessor :players
10
+
11
+ def initialize(title)
12
+ @title = title.capitalize
13
+ @players = []
14
+ end
15
+
16
+ def add_player(player)
17
+ @players << player
18
+ end
19
+
20
+ def high_score(player)
21
+ player.name.ljust(20, '.') + "#{player.score}"
22
+ end
23
+
24
+ def sort_players
25
+ @players.sort { |a, b| b.score <=> a.score }
26
+ end
27
+
28
+ def load_player(from_file)
29
+ File.readlines(from_file).each do |line|
30
+ add_player(Player.from_csv(line))
31
+ end
32
+ end
33
+
34
+ def save_scores(to_file = "highscores.txt")
35
+ File.open(to_file, "w") do |file|
36
+ file.puts "#{@title}'s High Scores:"
37
+ @players.sort { |a, b| b.score <=> a.score }.each do |player|
38
+ file.puts high_score(player)
39
+ end
40
+ end
41
+ end
42
+
43
+ def play(turns)
44
+ puts "There are #{@players.size} players in #{@title.capitalize}:"
45
+ @players.each do |player|
46
+ puts player
47
+ end
48
+
49
+ treasures = TreasureChest::TREASURES
50
+ puts "\nThere are #{treasures.size} treasures in the game:"
51
+ treasures.each do |t|
52
+ puts "A #{t.name} is worth #{t.points} points."
53
+ end
54
+
55
+ 1.upto(turns) do |turn|
56
+ puts "\nRound #{turn}:"
57
+ @players.each do |player|
58
+ GameTurn.take_turn(player)
59
+ end
60
+ end
61
+ end
62
+
63
+ def print_stats
64
+ strong, wimpy = @players.partition { |p| p.strong? }
65
+
66
+ puts "\n#{@title}'s Statistics:"
67
+ puts "\n#{strong.size} strong players:"
68
+
69
+ strong.each do |p|
70
+ puts "#{p.name}(#{p.health})"
71
+ end
72
+
73
+ puts "\n#{wimpy.size} wimpy players:"
74
+ wimpy.each do |p|
75
+ puts "#{p.name}(#{p.health})\n"
76
+ end
77
+
78
+ @players.each do |player|
79
+ puts "\n#{player.name}'s points total:\n"
80
+ player.each_found_treasure do |treasure|
81
+ puts "#{treasure.points} total #{treasure.name} points"
82
+ end
83
+ puts "#{player.points} grand total points"
84
+ end
85
+
86
+ def total_points
87
+ @players.reduce(0) { |sum, player| sum + player.points}
88
+ end
89
+
90
+ puts "\nTotal points accumulated from treasures: #{total_points}"
91
+
92
+ puts "\n#{@title}'s High Scores:"
93
+ scored_players = @players.sort { |a, b| b.score <=> a.score }
94
+ scored_players.each do |player|
95
+ puts high_score(player)
96
+ end
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,22 @@
1
+ require_relative 'die'
2
+ require_relative 'loaded_die'
3
+
4
+ module GameTurn
5
+
6
+ def self.take_turn(player)
7
+ number_rolled = StudioGame::Die.new
8
+ number_rolled.roll
9
+ case number_rolled
10
+ when 1..2
11
+ player.blam
12
+ when 3..4
13
+ puts "#{player.name} was skipped."
14
+ else
15
+ player.w00t
16
+ end
17
+ treasure = StudioGame::TreasureChest.random
18
+ player.found_treasure(treasure)
19
+ puts player
20
+ end
21
+
22
+ end
@@ -0,0 +1,18 @@
1
+ require_relative 'auditable'
2
+
3
+ module StudioGame
4
+ class LoadedDie
5
+
6
+ include Auditable
7
+ attr_reader :number
8
+
9
+ def roll
10
+ numbers = [1, 1, 2, 5, 6, 6]
11
+ @number = numbers.sample
12
+ audit
13
+ @number
14
+ end
15
+
16
+ end
17
+
18
+ end
@@ -0,0 +1,19 @@
1
+ require_relative 'player'
2
+
3
+ module Playable
4
+
5
+ def w00t
6
+ @health += 15
7
+ puts "#{@name} got w00ted!"
8
+ end
9
+
10
+ def blam
11
+ @health -= 10
12
+ puts "#{@name} got blammed!"
13
+ end
14
+
15
+ def strong?
16
+ @health > 100 ? true : false
17
+ end
18
+
19
+ end
@@ -0,0 +1,52 @@
1
+ require_relative 'treasures'
2
+ require_relative 'playable'
3
+
4
+ module StudioGame
5
+ class Player
6
+
7
+ include Playable
8
+ attr_accessor :name, :health, :score
9
+
10
+ def initialize(name, health = 100)
11
+ @name = name.capitalize
12
+ @health = health
13
+ @found_treasures = Hash.new(0)
14
+ @players = []
15
+ end
16
+
17
+ def self.from_csv(line)
18
+ name, health = line.split(',')
19
+ Player.new(name, Integer(health))
20
+ end
21
+
22
+ def found_treasure(treasure)
23
+ @found_treasures[treasure.name] += treasure.points
24
+ puts "#{@name} found a #{treasure.name} worth #{treasure.points} points."
25
+ puts "#{@name}'s treasures: #{@found_treasures}"
26
+ end
27
+
28
+ def each_found_treasure
29
+ @found_treasures.each do |name, points|
30
+ yield Treasure.new(name, points)
31
+ end
32
+ end
33
+
34
+ def points
35
+ @found_treasures.values.reduce(0, :+)
36
+ end
37
+
38
+ def to_s
39
+ "I'm #{@name} with a health of #{@health} and a score of #{score}."
40
+ end
41
+
42
+ def name=(new_name)
43
+ @name = new_name.capitalize
44
+ end
45
+
46
+ def score
47
+ @score = @health + points
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,22 @@
1
+ module StudioGame
2
+
3
+ Treasure = Struct.new(:name, :points)
4
+
5
+ module TreasureChest
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
+
20
+ end
21
+
22
+ end
@@ -0,0 +1 @@
1
+ # No specs written for this game.
metadata ADDED
@@ -0,0 +1,87 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jj-studio_game
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Jacob Johnkoski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-08-15 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.0
20
+ - - "~>"
21
+ - !ruby/object:Gem::Version
22
+ version: '2.8'
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.0
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.8'
33
+ description: "*** READ ME ***\n\nYou don't really have to. There's nothing substantial
34
+ in here.\nThis is a simple introductory ruby program for playing a silly\ngame and
35
+ it's just part of an introductory ruby course.\n\nIf you, somehow, for some reason,
36
+ found yourself actually reading\nthis, then I firstly want to apologize that you
37
+ find yourself in\nthat position. Secondly, I hope you have a nice day. Thirdly,\nI
38
+ want to say \"Hello!\" from me, my wife Tiffany, my cats Spooky,\nKazmir, Annika,
39
+ Meatball, Pig, and Spice.\n\nYOU WILL BE ASSIMILATED.\nRESISTANCE IS FUTILE. \n"
40
+ email: jacobjohnkoski@gmail.com
41
+ executables:
42
+ - jj-studio_game
43
+ extensions: []
44
+ extra_rdoc_files: []
45
+ files:
46
+ - LICENSE
47
+ - README
48
+ - bin/highscores.txt
49
+ - bin/jj-studio_game
50
+ - bin/players.csv
51
+ - lib/jj-studio_game/auditable.rb
52
+ - lib/jj-studio_game/berserk_player.rb
53
+ - lib/jj-studio_game/clumsy_player.rb
54
+ - lib/jj-studio_game/die.rb
55
+ - lib/jj-studio_game/game.rb
56
+ - lib/jj-studio_game/gameturn.rb
57
+ - lib/jj-studio_game/loaded_die.rb
58
+ - lib/jj-studio_game/playable.rb
59
+ - lib/jj-studio_game/player.rb
60
+ - lib/jj-studio_game/treasures.rb
61
+ - spec/jj-studio_game/studio_game_spec.rb
62
+ homepage: http://www.github.com/jjohnkoski
63
+ licenses:
64
+ - LICENSE
65
+ metadata: {}
66
+ post_install_message:
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: '1.9'
75
+ required_rubygems_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
80
+ requirements: []
81
+ rubyforge_project:
82
+ rubygems_version: 2.7.9
83
+ signing_key:
84
+ specification_version: 4
85
+ summary: A silly game.
86
+ test_files:
87
+ - spec/jj-studio_game/studio_game_spec.rb