my_text_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.
@@ -0,0 +1,3 @@
1
+ Theo,125
2
+ Alvin,100
3
+ Simon,60
@@ -0,0 +1,3 @@
1
+ alvin,100
2
+ simon,60
3
+ theo,125
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ require_relative '../lib/text_game/game'
3
+
4
+ knuckleheads = TextGame::Game.new "knuckleheads"
5
+ default_player_file = File.join File.dirname(__FILE__), 'players.csv'
6
+ knuckleheads.load(ARGV.shift || default_player_file)
7
+
8
+ loop do
9
+ puts "\nHow many rounds? ('quit' to exit)"
10
+ answer = gets.chomp.downcase
11
+ case answer
12
+ when /^\d+$/
13
+ knuckleheads.play answer.to_i
14
+ when 'quit','exit','q'
15
+ knuckleheads.print_stats
16
+ knuckleheads.print_highscores
17
+ break
18
+ else
19
+ puts "Please enter a number or 'quit'"
20
+ end
21
+ end
22
+
23
+ knuckleheads.save
@@ -0,0 +1,30 @@
1
+ require_relative 'player'
2
+ require_relative 'treasure_trove'
3
+
4
+ class BerserkPlayer < TextGame::Player
5
+ attr_reader :berserk
6
+ def initialize name, health=100
7
+ @berserk=false
8
+ @berserk_count=0
9
+ super name, health
10
+ end
11
+ def woot
12
+ @berserk_count+=1
13
+ @berserk = true if @berserk_count >=6
14
+ super
15
+ end
16
+ def blam
17
+ if @berserk
18
+ woot
19
+ else
20
+ super
21
+ end
22
+ end
23
+ end
24
+
25
+ if __FILE__ == $0
26
+ berserker = BerserkPlayer.new "berserker", 50
27
+ 6.times { berserker.woot }
28
+ 2.times { berserker.blam }
29
+ puts berserker.health
30
+ end
@@ -0,0 +1,26 @@
1
+ require_relative 'player'
2
+ require_relative 'treasure_trove'
3
+
4
+ class ClumsyPlayer < TextGame::Player
5
+ def found_treasure treasure
6
+ @treasure_points[treasure.name] += treasure.points/2
7
+ puts "#{@name} found #{treasure.name} worth #{treasure.points/2}"
8
+ end
9
+ end
10
+
11
+ if __FILE__ == $0
12
+ clumsy = ClumsyPlayer.new "klutz"
13
+
14
+ hammer = Treasure.new(:hammer,50)
15
+ clumsy.found_treasure hammer
16
+ clumsy.found_treasure hammer
17
+ clumsy.found_treasure hammer
18
+
19
+ crowbar = Treasure.new :crowbar, 400
20
+ clumsy.found_treasure crowbar
21
+
22
+ clumsy.each_treasure do |treasure|
23
+ puts "#{treasure.points} of #{treasure.name}"
24
+ end
25
+ puts "#{clumsy.points_accumulated} grand total points"
26
+ end
@@ -0,0 +1,7 @@
1
+ class Die
2
+ def initialize
3
+ end
4
+ def roll
5
+ rand(1..6)
6
+ end
7
+ end
@@ -0,0 +1,91 @@
1
+ require_relative 'player'
2
+ require_relative 'die'
3
+ require_relative 'game_logic'
4
+ require_relative 'treasure_trove'
5
+
6
+ module TextGame
7
+ class Game
8
+ def initialize name
9
+ @name = name.capitalize
10
+ @players = []
11
+ end
12
+
13
+ def add_player player
14
+ @players.push player
15
+ end
16
+
17
+ def play rounds=1
18
+ puts "There are #{@players.size} players in #{@name}"
19
+ puts @players.sort
20
+
21
+ treasures = TreasureTrove::TREASURES
22
+ puts "\nThere are #{treasures.size} treasures available in the trove"
23
+
24
+ treasures.each { |treasure| puts "#{treasure.name.capitalize} has #{treasure.points} points."}
25
+
26
+ rounds.times do |count|
27
+ puts "\nRound #{count+1}"
28
+ #game round
29
+ @players.each do |player|
30
+ GameLogic.check player
31
+ treasure = TreasureTrove.random
32
+ player.found_treasure treasure
33
+ puts player
34
+ end
35
+ #@players.each { |player| puts player}
36
+ end
37
+ end
38
+
39
+ def load file_name
40
+ File.readlines(file_name).each do |line|
41
+ add_player Player.from_csv(line)
42
+ end
43
+ end
44
+
45
+ def save to_file="player_scores.csv"
46
+ File.open(to_file,"w") do |file|
47
+ @players.sort.each do |player|
48
+ file.puts player.to_csv
49
+ end
50
+ end
51
+ end
52
+
53
+ def total_points_accumulated
54
+ @players.reduce(0) { |sum, player| sum + player.points_accumulated }
55
+ end
56
+
57
+ def print_stats
58
+ puts "\n#{@name} Statistics:"
59
+
60
+ puts "#{total_points_accumulated} total points accumulated"
61
+
62
+ @players.sort.each do |player|
63
+ puts "\n#{player.name}'s point totals:"
64
+
65
+ player.each_treasure do |treasure|
66
+ puts "#{treasure.name} worth #{treasure.points} points"
67
+ end
68
+
69
+ puts "#{player.points_accumulated} grand total points"
70
+ end
71
+
72
+ strong, weak = @players.partition { |player| player.strong?}
73
+
74
+ puts "\nStrong:"
75
+ puts strong.sort
76
+
77
+ puts "\nWeak:"
78
+ puts weak.sort
79
+ end
80
+
81
+ def print_highscores
82
+ puts "\n#{@name} High Scores:"
83
+ sorted = @players.sort
84
+
85
+ sorted.each do |player|
86
+ puts "#{player.name}".ljust(30,'.')+"#{player.score}"
87
+ end
88
+
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,14 @@
1
+ module GameLogic
2
+ def self.check player
3
+ @die = Die.new
4
+ number_rolled = @die.roll
5
+ case number_rolled
6
+ when 5..6
7
+ player.woot
8
+ when 3..4
9
+ puts "#{player.name} was skipped."
10
+ else
11
+ player.blam
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,19 @@
1
+ module Playable
2
+ def strong?
3
+ self.health >= 100
4
+ end
5
+
6
+ def <=> other
7
+ other.score <=> score
8
+ end
9
+
10
+ def blam
11
+ self.health-=10
12
+ puts "#{self.name} got blammed!"
13
+ end
14
+
15
+ def woot
16
+ self.health+=15
17
+ puts "#{self.name} got wooted!"
18
+ end
19
+ end
@@ -0,0 +1,63 @@
1
+ require_relative 'playable'
2
+
3
+ module TextGame
4
+ class Player
5
+ include Playable
6
+ attr_reader :score
7
+ attr_accessor :health,:name
8
+ def initialize name,health=100
9
+ @name = name.capitalize
10
+ @health = health
11
+ @treasure_points = Hash.new 0
12
+ end
13
+
14
+ def self.from_csv line
15
+ name, health = line.split(',')
16
+ Player.new name,Integer(health)
17
+ end
18
+
19
+ def to_csv
20
+ "#{@name},#{score}"
21
+ end
22
+
23
+ def name= name
24
+ @name = name.capitalize
25
+ end
26
+
27
+ def to_s
28
+ "I'm #{@name} with a health of #{@health} and a score of #{score}"
29
+ end
30
+
31
+ def score
32
+ @health+points_accumulated
33
+ end
34
+
35
+ def points_accumulated
36
+ @treasure_points.values.reduce(0,:+)
37
+ end
38
+
39
+ def each_treasure
40
+ @treasure_points.each do |name, points|
41
+ treasure = Treasure.new name, points
42
+ yield treasure
43
+ end
44
+ end
45
+
46
+ def found_treasure treasure
47
+ @treasure_points[treasure.name] += treasure.points
48
+ puts "#{@name} found #{treasure.name} worth #{treasure.points}"
49
+ end
50
+
51
+ end
52
+
53
+ if __FILE__ == $0
54
+ player = Player.new "mark", 100
55
+ puts player
56
+ puts player.health
57
+ puts player.score
58
+
59
+ player.name="bob"
60
+ player.blam
61
+ puts player
62
+ end
63
+ end
@@ -0,0 +1,16 @@
1
+ Treasure = Struct.new(:name,:points)
2
+
3
+ module TreasureTrove
4
+ TREASURES = [
5
+ pie = Treasure.new(:pie,5),
6
+ bottle = Treasure.new(:bottle,25),
7
+ hammer = Treasure.new(:hammer,50),
8
+ skillet = Treasure.new(:skillet,100),
9
+ broomstick = Treasure.new(:broomstick,200),
10
+ crowbar = Treasure.new(:crowbar,400)
11
+ ]
12
+
13
+ def self.random
14
+ TREASURES.sample
15
+ end
16
+ end
@@ -0,0 +1,32 @@
1
+ require 'text_game/berserk_player'
2
+
3
+ #To avoid output from method invocations being displayed to console
4
+ $stdout = StringIO.new
5
+
6
+ module TextGame
7
+ describe BerserkPlayer do
8
+
9
+ before do
10
+ @initial_health = 50
11
+ @player = BerserkPlayer.new "berserker", @initial_health
12
+ end
13
+
14
+ it "does not go berserk when wooted up to 5 times" do
15
+ 5.times { @player.woot }
16
+ @player.berserk.should == false
17
+ end
18
+
19
+ it "goes berserk when wooted more than 5 times" do
20
+ 6.times { @player.woot }
21
+ @player.berserk.should == true
22
+ end
23
+
24
+ it "gets wooted instead of blammed when it's gone berserk" do
25
+ 6.times { @player.woot }
26
+ @player.blam
27
+ #health should be at 155
28
+ @player.health.should == 155
29
+ end
30
+
31
+ end
32
+ end
@@ -0,0 +1,67 @@
1
+ require 'text_game/game'
2
+
3
+ $stdout = StringIO.new
4
+
5
+ module TextGame
6
+ describe Game do
7
+ it "computes total points as the sum of all player points" do
8
+ game = Game.new("Knuckleheads")
9
+
10
+ player1 = Player.new("moe")
11
+ player2 = Player.new("larry")
12
+
13
+ game.add_player(player1)
14
+ game.add_player(player2)
15
+
16
+ player1.found_treasure(Treasure.new(:hammer, 50))
17
+ player1.found_treasure(Treasure.new(:hammer, 50))
18
+ player2.found_treasure(Treasure.new(:crowbar, 400))
19
+
20
+ game.total_points_accumulated.should == 500
21
+ end
22
+
23
+ before do
24
+ @game = Game.new "knuckleheads"
25
+
26
+ @initial_health = 100
27
+ @player = Player.new "moe", @initial_health
28
+
29
+ @game.add_player @player
30
+ end
31
+
32
+ context "is being played with one player" do
33
+ it "has blammed the player" do
34
+ Die.any_instance.stub(:roll).and_return(5)
35
+ @game.play
36
+ @player.health.should == @initial_health + 15
37
+ end
38
+
39
+ it "has skipped the player" do
40
+ Die.any_instance.stub(:roll).and_return(3)
41
+ @game.play
42
+ @player.health.should == @initial_health
43
+ end
44
+
45
+ it "has wooted the player" do
46
+ Die.any_instance.stub(:roll).and_return(1)
47
+ @game.play
48
+ @player.health.should == @initial_health - 10
49
+ end
50
+ end
51
+
52
+ context "with a collection of players" do
53
+ before do
54
+ @player1 = Player.new "moe", 100
55
+ @player2 = Player.new "larry", 200
56
+ @player3 = Player.new "curly", 300
57
+
58
+ @players = [@player1,@player2,@player3]
59
+ end
60
+
61
+ it "is sorted by decreasing score" do
62
+ @players.sort.should == [@player3,@player2,@player1]
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,61 @@
1
+ require 'text_game/player'
2
+
3
+ #To avoid output from method invocations being displayed to console
4
+ $stdout = StringIO.new
5
+
6
+ module TextGame
7
+ describe Player do
8
+
9
+ before do
10
+ @player = Player.new "mark", 100
11
+ @initial_health = 100
12
+ end
13
+
14
+ it "has a capitalized name" do
15
+ @player.name.should == "Mark"
16
+ end
17
+
18
+ it "has an initial health" do
19
+ @player.health.should == 100
20
+ end
21
+
22
+ it "has a string representation" do
23
+ @player.to_s == "I'm Mark with a health of 100 and a score of 104"
24
+ end
25
+
26
+ it "computes a score as the sum of its health and length of name" do
27
+ @player.score == 104
28
+ end
29
+
30
+ it "increases health by 15 when wooted" do
31
+ @player.woot
32
+ @player.health.should == 115
33
+ end
34
+
35
+ it "decreases health by 10 when blammed" do
36
+ @player.blam
37
+ @player.health.should == 90
38
+ end
39
+
40
+ context "has a starting health of 150" do
41
+ before do
42
+ @player = Player.new "mark", 150
43
+ end
44
+
45
+ it "is strong" do
46
+ @player.should be_strong
47
+ end
48
+
49
+ end
50
+
51
+ context "has a starting health of 99" do
52
+ before do
53
+ @player = Player.new "mark", 99
54
+ end
55
+
56
+ it "is weak" do
57
+ @player.should_not be_strong
58
+ end
59
+ end
60
+ end
61
+ end
metadata ADDED
@@ -0,0 +1,78 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: my_text_game
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Mark Yanaros
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-24 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: rspec
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ description: File.read(File.join(File.dirname(__FILE__), 'README'))
31
+ email: mark.yanaros@gmail.com
32
+ executables:
33
+ - text_game
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - bin/player_scores.csv
38
+ - bin/players.csv
39
+ - bin/text_game
40
+ - lib/text_game/berserk_player.rb
41
+ - lib/text_game/clumsy_player.rb
42
+ - lib/text_game/die.rb
43
+ - lib/text_game/game.rb
44
+ - lib/text_game/game_logic.rb
45
+ - lib/text_game/playable.rb
46
+ - lib/text_game/player.rb
47
+ - lib/text_game/treasure_trove.rb
48
+ - spec/text_game/berserk_player_spec.rb
49
+ - spec/text_game/game_spec.rb
50
+ - spec/text_game/player_spec.rb
51
+ homepage: ''
52
+ licenses: []
53
+ post_install_message:
54
+ rdoc_options: []
55
+ require_paths:
56
+ - lib
57
+ required_ruby_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ! '>='
61
+ - !ruby/object:Gem::Version
62
+ version: '1.9'
63
+ required_rubygems_version: !ruby/object:Gem::Requirement
64
+ none: false
65
+ requirements:
66
+ - - ! '>='
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 1.8.25
72
+ signing_key:
73
+ specification_version: 3
74
+ summary: Plays a game and displays results.
75
+ test_files:
76
+ - spec/text_game/berserk_player_spec.rb
77
+ - spec/text_game/game_spec.rb
78
+ - spec/text_game/player_spec.rb