-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathboard.rb
executable file
·123 lines (97 loc) · 2.57 KB
/
board.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
require './pieces'
require 'colorize'
class InvalideMoveError< StandardError
end
class Board
def initialize(new_game = false)
@board = Hash.new { |h, key| h[key] = nil }
fill_board
set_board if new_game
end
def fill_board
(0..7).to_a.repeated_permutation(2).to_a.each{ |pos| @board[pos] }
end
def [](pos)
@board[pos]
end
def []=(pos,val)
@board[pos] = val
end
def empty?(pos)
@board[pos] == nil
end
def move(move)
start_pos, end_pos = move
raise InvalideMoveError, "Invalid move" if !valid_move?(move)
piece = @board[start_pos]
if is_jump?(move)
piece.make_jump(end_pos)
raise InvalideMoveError, "Make another Jump" if any_jumps?(piece.color)
transform_kings
return nil
end
raise InvalideMoveError, "Make Jump" if any_jumps?(piece.color)
piece.make_slide(end_pos)
transform_kings
end
def transform_kings
find_kings.each {|piece| @board[piece.pos] = Pieces.new(piece.board, piece.color, piece.pos, true) }
end
def find_kings
black_kings = find_pieces(:b).select { |piece| piece.pos[1] == 7 }
red_kings = find_pieces(:r).select{ |piece| piece.pos[1] == 0 }
black_kings + red_kings
end
def valid_move?(move)
start_pos,end_pos = move
@board[start_pos] && empty?(end_pos) && @board[start_pos].valid_moves.include?(end_pos)
end
def is_jump?(move)
start_pos, end_pos = move
@board[start_pos].jump_moves.include?(end_pos)
end
def any_jumps?(color)
find_pieces(color).any? { |piece| !piece.jump_moves.empty?}
end
def find_pieces(color)
@board.select { |pos,piece| piece && piece.color == color }.values
end
def to_s
str = ""
str << " 0 1 2 3 4 5 6 7 \n"
7.downto(0) do |row|
str << "#{row} "
8.times do |col|
add = self[[col,row]].nil? ? " " : " #{@board[[col,row]]} "
add = (row + col).odd? ? add.colorize(:background => :light_black) : add
str << add
end
str << " #{row} \n"
end
str << " 0 1 2 3 4 5 6 7 \n "
str
end
def over?
find_pieces(:b).empty? || find_pieces(:r).empty?
end
def in_board?(pos)
pos.all? { |coord| coord.between?(0,7) }
end
protected
def set_board
rows=[[0,0],[1,1], [0,2], [1,5], [0,6], [1,7]]
rows.each do |row|
if row[1] > 2
fill_row(row,:r)
next
end
fill_row(row,:b)
end
end
def fill_row(pos, col)
while in_board?(pos)
@board[pos] = Pieces.new(self, col, pos)
pos =[pos[0]+2, pos[1]]
end
end
end