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 +4 -4
- data/bin/sea_battle +1 -1
- data/lib/alex_butirskiy_sea_battle.rb +6 -1
- data/lib/{board.rb → sea_battle/board.rb} +4 -2
- data/lib/{cell.rb → sea_battle/cell.rb} +0 -0
- data/lib/sea_battle/game.rb +213 -0
- data/lib/{ship.rb → sea_battle/ship.rb} +0 -0
- metadata +7 -9
- data/lib/game.rb +0 -134
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47828dccda84920c1d86bdc3db02502d81d645ae
|
4
|
+
data.tar.gz: 980c519a16556b68308951ad4081da38501f14b1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8cf20eced52bd7eab6c2b61803f8c3b403afdd72cdcdc5ae17ebcde8d05a501499f3a9e89bd7849d90a8d6d8ebfb0abd56f00a0c4b200df4b339bbd0b0539dbd
|
7
|
+
data.tar.gz: 275986c680ab7f0d0f94de2f43585fbee194b6e251c6eb84b19063a5d8d1ef217635f4ab88e4d83c107329686737ed954826ee9fa42069b1b94aa34447d5b0fd
|
data/bin/sea_battle
CHANGED
@@ -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
|
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-
|
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
|
data/lib/game.rb
DELETED
@@ -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
|