alex_butirskiy_sea_battle 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fde9f524ae8ec16ef02bb04d79f042afba67ac1e
4
- data.tar.gz: 96db225f177af746dd41ed7d23154209da8ff9c2
3
+ metadata.gz: 47828dccda84920c1d86bdc3db02502d81d645ae
4
+ data.tar.gz: 980c519a16556b68308951ad4081da38501f14b1
5
5
  SHA512:
6
- metadata.gz: 0ab5faff90d92efa0a8a717e38eaf884298cbdd26c3b1c518842b0494c59ed45e51cf0fd3f6c544c2188b72cf8a820d26c832f57ea2e72e6db95fcc2c4db55f7
7
- data.tar.gz: 636b684e0602fc8952425d82521ed4fc36a7c30e1e8cd7c16d619124261ed998c4a5621db289299afcd659de676f0631b49d1afa4d36e1443829d8c7d6128ffd
6
+ metadata.gz: 8cf20eced52bd7eab6c2b61803f8c3b403afdd72cdcdc5ae17ebcde8d05a501499f3a9e89bd7849d90a8d6d8ebfb0abd56f00a0c4b200df4b339bbd0b0539dbd
7
+ data.tar.gz: 275986c680ab7f0d0f94de2f43585fbee194b6e251c6eb84b19063a5d8d1ef217635f4ab88e4d83c107329686737ed954826ee9fa42069b1b94aa34447d5b0fd
@@ -2,4 +2,4 @@
2
2
 
3
3
  require_relative '../lib/alex_butirskiy_sea_battle.rb'
4
4
 
5
- Game.new.run
5
+ Sea_battle::Game.new.run
@@ -1 +1,6 @@
1
- require_relative './game.rb'
1
+ require_relative 'sea_battle/game.rb'
2
+
3
+ module Sea_battle
4
+ class Game < Game
5
+ end
6
+ end
@@ -11,6 +11,8 @@ class Board
11
11
  include Direction
12
12
  include State
13
13
 
14
+ attr_accessor :player_name
15
+
14
16
  def initialize(size_x = 10, size_y = 10, name = '')
15
17
  unless (1..20).include?(size_x) && (1..20).include?(size_y)
16
18
  fail BoardSizeError, 'size should be in (1..20) range'
@@ -115,7 +117,7 @@ class Board
115
117
  false
116
118
  end
117
119
 
118
- def display(str)
120
+ def display(str, hide_ships = false)
119
121
  fail TypeError, 'str should be Fixnum' unless str.class == Fixnum
120
122
  offset = 2
121
123
  res = ''
@@ -132,7 +134,7 @@ class Board
132
134
  res << '|'
133
135
  @size_x.times do |x|
134
136
  case @cells[x][@size_y - 1 - (str - offset)].state
135
- when SHIP then res << 'O'
137
+ when SHIP then hide_ships ? (res << ' ') : (res << 'O')
136
138
  when BROKEN then res << 'X'
137
139
  when MISSED then res << '*'
138
140
  else res << ' '
File without changes
@@ -0,0 +1,213 @@
1
+ require 'pry'
2
+
3
+ require_relative 'board.rb'
4
+
5
+ ## Default setting constants
6
+ module Defaults
7
+ SIZE_X = 20
8
+ SIZE_Y = 10
9
+ PLAYER_1_NAME = 'Player 1'
10
+ PLAYER_2_NAME = 'Player 2'
11
+ PLAYER_NAME = 'Human'
12
+ COMPUTER_NAME = 'Computer'
13
+ COMPUTER_1_NAME = 'Computer 1'
14
+ COMPUTER_2_NAME = 'Computer 2'
15
+
16
+ SHIP_1_COUNT = 5
17
+ SHIP_2_COUNT = 4
18
+ SHIP_3_COUNT = 3
19
+ SHIP_4_COUNT = 2
20
+ SHIP_5_COUNT = 1
21
+
22
+ SHIPS_COUNT = [SHIP_1_COUNT, SHIP_2_COUNT, SHIP_3_COUNT,
23
+ SHIP_4_COUNT, SHIP_5_COUNT]
24
+ end
25
+
26
+ # Main game class
27
+ # Use Game.new.run
28
+ class Game
29
+ include Defaults
30
+ def initialize(name_0 = PLAYER_NAME, name_1 = COMPUTER_NAME)
31
+ @alphabet = ('A'..'Z').map { |a| a }
32
+ @board = [Board.new(SIZE_X, SIZE_Y, name_0),
33
+ Board.new(SIZE_X, SIZE_Y, name_1)]
34
+ @board[0].generate(*SHIPS_COUNT)
35
+ @board[1].generate(*SHIPS_COUNT)
36
+ @delay = 1 * 0.2
37
+ @current_player = 0
38
+ @player_name = [name_0, name_1]
39
+ @auto = :OFF
40
+ end
41
+
42
+ def display(b1, b2, hide_0 = false, hide_1 = false)
43
+ system('clear')
44
+ (SIZE_Y + 5).times do |i|
45
+ puts b1.display(i, hide_0) << ' ' * 3 << b2.display(i, hide_1)
46
+ end
47
+ puts "Turn: #{@player_name[@current_player]}"
48
+ end
49
+
50
+
51
+ def random_shoot
52
+ 1000.times do
53
+ shoot = [rand(SIZE_X), rand(SIZE_Y)]
54
+ result = @board[@current_player - 1].shoot(*shoot)
55
+ if result != 'ALREADY SHOT'
56
+ return [result, shoot]
57
+ end
58
+ end
59
+ fail
60
+ end
61
+
62
+ def human_shoot
63
+ loop do
64
+ print 'Enter the cell: '
65
+ inp = gets.chop.upcase
66
+ if inp == 'QUIT' then return ['QUIT', [0,0]] end
67
+ if inp == 'AUTO' then return ['AUTO', [0,0]] end
68
+ x = ('A'..'Z').to_a.index inp[0]
69
+ y = inp.scan(/\d+/).first
70
+ if x == nil || y == nil
71
+ puts 'Wrong format. Example: E5'
72
+ next
73
+ end
74
+
75
+ begin
76
+ result = @board[@current_player - 1].shoot(x, y.to_i)
77
+ rescue OutOfBoardError
78
+ puts 'You have shot out of board. Try again.'
79
+ next
80
+ end
81
+
82
+ if result == 'ALREADY SHOT'
83
+ puts 'You have already shot there. Try again'
84
+ next
85
+ end
86
+ return [result, [x,y]]
87
+ end
88
+ end
89
+
90
+ def shoot
91
+
92
+ @auto == :ON ? random_shoot : human_shoot
93
+
94
+ end
95
+
96
+ def process_result(result)
97
+ case result
98
+ when 'MISSED'
99
+ @current_player == 0 ? (@current_player = 1) : (@current_player = 0)
100
+ when 'INJURED'
101
+ sleep(@delay)
102
+ when 'KILLED'
103
+ if @board[@current_player - 1].is_ship_alive? == false
104
+ congratulation @player_name[@current_player]
105
+ return 'GAME OVER'
106
+ end
107
+ sleep(@delay)
108
+ when 'QUIT'
109
+ return 'QUIT'
110
+ end
111
+ sleep(@delay)
112
+ end
113
+
114
+ def congratulation(name)
115
+ puts "\nCONGRATULATION!!!"
116
+ puts "#{name} has won"
117
+ puts 'GAME OVER'
118
+ sleep(2)
119
+ end
120
+
121
+ def comp_vs_comp
122
+ @player_name[0] = @board[0].player_name = COMPUTER_1_NAME
123
+ @player_name[1] = @board[1].player_name = COMPUTER_2_NAME
124
+ display(*@board)
125
+ @auto = :ON
126
+ loop do
127
+ result, hit = (@auto == :OFF ? human_shoot : random_shoot)
128
+ return if result == 'QUIT'
129
+ if result == 'AUTO'
130
+ @auto = :ON
131
+ next
132
+ end
133
+ display(*@board)
134
+ puts "Hit: #{@alphabet[hit[0]]}#{hit[1]} - #{result}"
135
+ return if process_result(result) == 'GAME OVER'
136
+ end
137
+ end
138
+
139
+ def human_vs_comp
140
+ @player_name[0] = @board[0].player_name = PLAYER_NAME
141
+ @player_name[1] = @board[1].player_name = COMPUTER_NAME
142
+ system('clear')
143
+ print 'Enter your name: '
144
+ name = gets.chop
145
+ @player_name[0] = @board[0].player_name = name if name.length != 0
146
+ display(*@board, false, true)
147
+ loop do
148
+ result, hit = (@current_player == 0 ? human_shoot : random_shoot)
149
+ return if result == 'QUIT'
150
+
151
+ display(*@board, false, true)
152
+ puts "Hit: #{@alphabet[hit[0]]}#{hit[1]} - #{result}"
153
+ return if process_result(result) == 'GAME OVER'
154
+ end
155
+ end
156
+
157
+
158
+
159
+ def human_vs_human
160
+ @player_name[0] = @board[0].player_name = PLAYER_1_NAME
161
+ @player_name[1] = @board[1].player_name = PLAYER_2_NAME
162
+ system('clear')
163
+ print 'Enter Players 1 name: '
164
+ name = gets.chop
165
+ @player_name[0] = @board[0].player_name = name if name.length != 0
166
+ print 'Enter Players 2 name: '
167
+ name = gets.chop
168
+ @player_name[1] = @board[1].player_name = name if name.length != 0
169
+ player_last = -1
170
+ hit = nil
171
+ result = nil
172
+ loop do
173
+ if player_last != @current_player
174
+ player_last = @current_player
175
+ display(*@board, true, true)
176
+
177
+ puts 'Press Enter when ready'
178
+ gets
179
+ end
180
+
181
+ @current_player == 0 ? display(*@board, false, true) : display(*@board, true, false)
182
+ puts "Hit: #{@alphabet[hit[0]]}#{hit[1]} - #{result}" if hit != nil && result != nil
183
+ result, hit = human_shoot
184
+ return if result == 'QUIT'
185
+ @current_player == 0 ? display(*@board, false, true) : display(*@board, true, false)
186
+ puts "Hit: #{@alphabet[hit[0]]}#{hit[1]} - #{result}"
187
+ return if process_result(result) == 'GAME OVER'
188
+ end
189
+ end
190
+
191
+ def run
192
+ system('clear')
193
+ greeting
194
+ input = gets.chop
195
+ case input
196
+ when '1' then comp_vs_comp
197
+ when '2' then human_vs_comp
198
+ when '3' then human_vs_human
199
+ when 'q', 'Q' then
200
+ end
201
+ end
202
+
203
+ private
204
+
205
+ def greeting
206
+ puts "\n\n\n************** NAVAL BATTLE****************"
207
+ puts 'Choose game mode:'
208
+ puts '1 - Computer vs Computer'
209
+ puts '2 - Human vs Computer'
210
+ puts '3 - Human vs Human'
211
+ puts
212
+ end
213
+ end
File without changes
metadata CHANGED
@@ -1,20 +1,18 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alex_butirskiy_sea_battle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alex Butirskiy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-12 00:00:00.000000000 Z
11
+ date: 2015-07-23 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: |
14
14
  A simple computr game. Just type sea_battle after instalation
15
-
16
-
17
- Only the demo mode (Computer vs Computer) works at the momemt/..
15
+ There are three modes of playing
18
16
  email: butirskiy@gmail.com
19
17
  executables:
20
18
  - sea_battle
@@ -23,10 +21,10 @@ extra_rdoc_files: []
23
21
  files:
24
22
  - bin/sea_battle
25
23
  - lib/alex_butirskiy_sea_battle.rb
26
- - lib/board.rb
27
- - lib/cell.rb
28
- - lib/game.rb
29
- - lib/ship.rb
24
+ - lib/sea_battle/board.rb
25
+ - lib/sea_battle/cell.rb
26
+ - lib/sea_battle/game.rb
27
+ - lib/sea_battle/ship.rb
30
28
  homepage: https://github.com/alexbutirskiy/sea_battle
31
29
  licenses:
32
30
  - MIT
@@ -1,134 +0,0 @@
1
- require_relative 'board.rb'
2
-
3
- ## Default setting constants
4
- module Defaults
5
- SIZE_X = 20
6
- SIZE_Y = 10
7
- PLAYER_1_NAME = 'Player 1'
8
- PLAYER_2_NAME = 'Player 2'
9
- PLAYER_NAME = 'Human'
10
- COMPUTER_NAME = 'Computer'
11
- COMPUTER_1_NAME = 'Computer 1'
12
- COMPUTER_2_NAME = 'Computer 2'
13
-
14
- SHIP_1_COUNT = 5
15
- SHIP_2_COUNT = 4
16
- SHIP_3_COUNT = 3
17
- SHIP_4_COUNT = 2
18
- SHIP_5_COUNT = 1
19
-
20
- SHIPS_COUNT = [SHIP_1_COUNT, SHIP_2_COUNT, SHIP_3_COUNT,
21
- SHIP_4_COUNT, SHIP_5_COUNT]
22
- end
23
-
24
- # Main game class
25
- # Use Game.new.run
26
- class Game
27
- include Defaults
28
- def initialize
29
- @alphabet = ''
30
- ('A'..'Z').each { |a| @alphabet << a }
31
- end
32
-
33
- def display(b1, b2)
34
- system('clear')
35
- (SIZE_Y + 5).times do |i|
36
- puts b1.display(i) << ' ' * 3 << b2.display(i)
37
- end
38
- end
39
-
40
- def comp_vs_comp
41
- board = [Board.new(SIZE_X, SIZE_Y, COMPUTER_1_NAME),
42
- Board.new(SIZE_X, SIZE_Y, COMPUTER_2_NAME)]
43
-
44
- board[0].generate(*SHIPS_COUNT)
45
- board[1].generate(*SHIPS_COUNT)
46
-
47
- player_name = [COMPUTER_1_NAME, COMPUTER_2_NAME]
48
-
49
- current_player = 0
50
- result = ' '
51
- auto = :OFF
52
- delay = 1
53
- loop do
54
- if auto == :OFF
55
- display(*board)
56
- puts "Turn: #{player_name[current_player]}\n"
57
- puts "Press:Enter to continue\tQ+Enter - exit\tA+Enter - demo mode"
58
- inp = gets.chop
59
- case inp
60
- when 'Q', 'q' then return
61
- when 'A', 'a' then auto = :ON
62
- when 'AF', 'af'
63
- auto = :ON
64
- delay = 0.2
65
- end
66
- end
67
-
68
- hit = loop do
69
- hit = [rand(SIZE_X), rand(SIZE_Y)]
70
- result = board[current_player - 1].shoot(*hit)
71
- break hit if result != 'ALREADY SHOT'
72
- end
73
-
74
- display(*board)
75
- puts "Turn: #{player_name[current_player]}"
76
- puts "Hit: #{@alphabet[hit[0]]}#{hit[1]} - #{result}"
77
-
78
- case result
79
- when 'MISSED'
80
- current_player == 0 ? (current_player = 1) : (current_player = 0)
81
- when 'INJURED'
82
- sleep(delay)
83
- next
84
- when 'KILLED'
85
- if board[current_player - 1].is_ship_alive? == false
86
- congratulation player_name[current_player]
87
- return
88
- end
89
- sleep(delay)
90
- end
91
- sleep(delay)
92
- end
93
- end
94
-
95
- def congratulation(name)
96
- puts "\nCONGRATULATION!!!"
97
- puts "#{name} has won"
98
- puts 'GAME OVER'
99
- sleep(2)
100
- end
101
-
102
- def human_vs_human
103
- puts "\nUnder construction. Try later..."
104
- end
105
-
106
- def human_vs_comp
107
- puts "\nUnder construction. Try later..."
108
- end
109
-
110
- def run
111
- system('clear')
112
-
113
- greeting
114
- input = gets.chop
115
-
116
- case input
117
- when '1' then comp_vs_comp
118
- when '2' then human_vs_comp
119
- when '3' then human_vs_human
120
- when 'q', 'Q' then
121
- end
122
- end
123
-
124
- private
125
-
126
- def greeting
127
- puts "\n\n\n************** NAVAL BATTLE****************"
128
- puts 'Choose game mode:'
129
- puts '1 - Computer vs Computer'
130
- puts '2 - Human vs Computer'
131
- puts '3 - Human vs Human'
132
- puts
133
- end
134
- end