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 +7 -0
- data/LICENSE +1 -0
- data/README +3 -0
- data/bin/fav_players.csv +4 -0
- data/bin/players.csv +4 -0
- data/bin/studio_game +31 -0
- data/lib/studio_game/auditable.rb +9 -0
- data/lib/studio_game/berserk_player.rb +41 -0
- data/lib/studio_game/clumsy_player.rb +43 -0
- data/lib/studio_game/die.rb +26 -0
- data/lib/studio_game/game.rb +106 -0
- data/lib/studio_game/game_turn.rb +35 -0
- data/lib/studio_game/iterators.rb +41 -0
- data/lib/studio_game/loaded_die.rb +23 -0
- data/lib/studio_game/mixins.rb +57 -0
- data/lib/studio_game/playable.rb +19 -0
- data/lib/studio_game/player.rb +74 -0
- data/lib/studio_game/treasure_trove.rb +29 -0
- metadata +83 -0
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
data/bin/fav_players.csv
ADDED
data/bin/players.csv
ADDED
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,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,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: []
|