Skip to content

Commit 84f56b5

Browse files
committed
Refactored valid move handling
1 parent 18e18cc commit 84f56b5

5 files changed

+24
-22
lines changed

chess_board.rb

+17-15
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ def place_pieces
3838

3939
def place_pawn_row(row, color)
4040
@board[row].each_with_index do |spot, i|
41-
@board[row][i] = Pawn.new([row, i], self, color)
41+
self[[row, i]] = Pawn.new([row, i], self, color)
4242
end
4343

4444
nil
@@ -70,8 +70,12 @@ def display
7070
nil
7171
end
7272

73-
def find_king(color)
74-
@board.flatten.each do |piece|
73+
def pieces
74+
@board.flatten.compact
75+
end
76+
77+
def find_king_pos(color)
78+
self.pieces.each do |piece|
7579
if piece.class == King && piece.color == color
7680
return piece.pos
7781
end
@@ -81,34 +85,35 @@ def find_king(color)
8185
end
8286

8387
def in_check?(color)
84-
king_pos = find_king(color)
85-
@board.flatten.compact.each do |piece|
88+
king_pos = find_king_pos(color)
89+
self.pieces.each do |piece|
8690
next if piece.color == color
8791
return true if piece.moves.include?(king_pos)
8892
end
8993

9094
false
9195
end
9296

97+
def pos_on_board?(pos)
98+
row, col = pos
99+
row.between?(0, height - 1) && col.between?(0, width - 1)
100+
end
101+
93102
def move!(start, end_pos)
103+
return unless pos_on_board?(start) && pos_on_board?(end_pos)
94104
piece = self[start]
95-
# changes piece.pos to end_pos
96105
piece.pos = end_pos
97-
98-
# changes Board positions
99106
self[start], self[end_pos] = nil, piece
100107

101108
nil
102109
end
103110

104111
def move(start, end_pos)
105-
# finds piece at start position
106112
piece = self[start]
107113
if piece.nil?
108114
raise "No piece at start position."
109115
end
110116

111-
# checks piece.moves for end_pos
112117
unless piece.moves.include?(end_pos)
113118
raise "Can't move to that position."
114119
end
@@ -117,14 +122,11 @@ def move(start, end_pos)
117122
raise "Move will leave you in check."
118123
end
119124

120-
piece.pos = end_pos
121-
self[start], self[end_pos] = nil, piece
122-
123-
nil
125+
move!(start, end_pos)
124126
end
125127

126128
def checkmate?(color)
127-
pieces = @board.flatten.compact.select { |piece| piece.color == color }
129+
pieces = self.pieces.select { |piece| piece.color == color }
128130
pieces.all? { |piece| piece.valid_moves.empty? }
129131
end
130132

piece.rb

+5-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ def valid_moves
2626
def valid_move?(target)
2727
duped_board = @board.dup
2828
duped_board.move!(@pos, target)
29-
!duped_board.in_check?(self.color)
29+
return false if duped_board.in_check?(self.color)
30+
return false unless move_within_boundaries?(target)
31+
return false if !@board[target].nil? && @board[target].color == self.color
32+
33+
true
3034
end
3135
end

sliding_piece.rb

+1-4
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,8 @@ def moves
77
current_pos = @pos
88
loop do
99
next_move = vector_sum([current_pos, dir])
10-
break unless move_within_boundaries?(next_move)
11-
break if !@board[next_move].nil? && @board[next_move].color == self.color
1210
moves << next_move
13-
break unless @board[next_move].nil? #change .empty? to whatever call
14-
11+
break unless move_within_boundaries?(next_move) && @board[next_move].nil?
1512
current_pos = next_move
1613
end
1714
end

stepping_piece.rb

-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ def moves
55
moves = []
66
move_dirs.each do |dir|
77
next_move = vector_sum([pos, dir])
8-
next unless move_within_boundaries?(next_move)
9-
next if !@board[next_move].nil? && @board[next_move].color == self.color
108
moves << next_move
119
end
1210

vector_sum.rb

+1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ def vector_sum(vectors)
44
result[0] += vec[0]
55
result[1] += vec[1]
66
end
7+
78
result
89
end

0 commit comments

Comments
 (0)