-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathplayer.rb
132 lines (111 loc) · 3.05 KB
/
player.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
120
121
122
123
124
125
126
127
128
129
130
131
132
require './board'
require './piece'
class ComputerPlayer
attr_accessor :board
PIECE_VALUE = {
:king => 100,
:queen => 9,
:rook => 5,
:bishop => 3,
:knight => 3,
:pawn =>1
}
def initialize(board = nil)
@board = board
end
def make_move(color)
start_pos = nil
end_pos = nil
capturing_moves = []
my_pieces = board.find_pieces(color)
#Look for capturing moves
my_pieces.each do |piece|
capturing_moves += capture_moves(piece, color)
end
#Choose best capture move
unless capturing_moves.empty?
best_move = []
best_value = 0
capturing_moves.each do |start_pos, end_pos|
captured_piece = board[end_pos]
captured_value = PIECE_VALUE[captured_piece.symbol]
if captured_value > best_value
best_move = [start_pos, end_pos]
best_value = captured_value
end
end
return best_move
end
#If no cap moves, make random move
while end_pos.nil?
pieces = board.find_pieces(color)
start_pos = pieces.sample.pos
next if start_pos.nil?
end_pos = board[start_pos].valid_moves.sample
end
[start_pos, end_pos]
end
def turn(color)
move = make_move(color)
board.move(move[0], move[1])
board.render(move[1])
end
def capture_moves(piece, color)
capturing_moves = []
other_pieces_pos = other_pieces(color).map { |piece| piece.pos }
my_moves = piece.valid_moves
my_moves.each do |move|
if other_pieces_pos.include?(move)
capturing_moves << [piece.pos, move]
end
end
capturing_moves
end
def other_pieces(color)
other_color = (color == :black ? :white : :black)
other_pieces = board.find_pieces(other_color)
end
end
class HumanPlayer
attr_accessor :board
def initialize(board = nil)
@board = board
end
def turn(color)
message = "It's #{color}'s turn \nWhich piece do you want to move?"
board.render([0,0], message)
start_pos = kb_user_input([0,0])
raise MoveError.new "No piece at start position." if board[start_pos].nil?
raise MoveError.new "Wrong color" unless board[start_pos].color == color
message = "Where do you want to move it?"
board.render(start_pos.dup, message)
end_pos = kb_user_input(start_pos.dup)
board.move(start_pos, end_pos)
rescue MoveError => e
puts "#{e.message}"
board.render(start_pos.dup, "#{e.message}\nHit any key to continue")
retry if STDIN.getch
end
def kb_user_input(current_pos = [0,0])
input = STDIN.getch
unless input == "\r"
system('clear')
case input
when 'w'
current_pos[0] -= 1 if current_pos[0].between?(1,7)
when 'a'
current_pos[1] -= 1 if current_pos[1].between?(1,7)
when 's'
current_pos[0] += 1 if current_pos[0].between?(0,6)
when 'd'
current_pos[1] += 1 if current_pos[1].between?(0,6)
when 'q'
exit
end
# Print board with new cursor position
board.render(current_pos)
kb_user_input(current_pos)
end
current_pos
end
end