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 +7 -0
- data/LICENSE +8 -0
- data/README +14 -0
- data/bin/highscores.txt +6 -0
- data/bin/jj-studio_game +36 -0
- data/bin/players.csv +3 -0
- data/lib/jj-studio_game/auditable.rb +7 -0
- data/lib/jj-studio_game/berserk_player.rb +27 -0
- data/lib/jj-studio_game/clumsy_player.rb +13 -0
- data/lib/jj-studio_game/die.rb +18 -0
- data/lib/jj-studio_game/game.rb +100 -0
- data/lib/jj-studio_game/gameturn.rb +22 -0
- data/lib/jj-studio_game/loaded_die.rb +18 -0
- data/lib/jj-studio_game/playable.rb +19 -0
- data/lib/jj-studio_game/player.rb +52 -0
- data/lib/jj-studio_game/treasures.rb +22 -0
- data/spec/jj-studio_game/studio_game_spec.rb +1 -0
- metadata +87 -0
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.
|
data/bin/highscores.txt
ADDED
data/bin/jj-studio_game
ADDED
@@ -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,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,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,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
|