-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathgame.rb
More file actions
executable file
·136 lines (121 loc) · 2.88 KB
/
game.rb
File metadata and controls
executable file
·136 lines (121 loc) · 2.88 KB
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
133
134
135
136
require_relative './lib/display'
require_relative './lib/board'
require_relative './lib/player'
require_relative './lib/engine'
require 'rack'
require 'erb'
class Game
attr_reader :board, :display, :p1, :p2, :p_qty
attr_accessor :current_player, :move_count
def initialize(p_qty)
@board = Board.new
@display = Display.new(@board)
if p_qty == 1
@p1 = Engine.new(:black, @board)
else
@p1 = Player.new(:black)
end
@p2 = Player.new(:white)
@p_qty = p_qty
@current_player = @p2
@move_count = 0
end
def fen_str
board.combined_fen(self.current_player.to_fen, self.move_count.to_s)
end
def game_over?
if self.black_checkmated?
puts "White wins!"
return "White wins!"
elsif self.white_checkmated?
return "Black wins!"
else
return ""
end
end
def engine_move
# @p1 = Engine.new(:black, @board)
@p1.handle_move(fen_str)
end
def generate_response(start_pos, end_pos)
resp = {
'start_val' => self.board[start_pos].to_img,
'end_val' => self.board[end_pos].to_img,
'errors' => "",
'fen' => self.fen_str
}
if self.p_qty != 1
resp
else
engine_start, engine_end = engine_move
board.move_piece(engine_move, current_player.color)
count_moves
swap_turn!
self.move_count += 1
engine_resp = {
'engine_pos_start' => engine_start,
'engine_pos_end' => engine_end,
'engine_start' => self.board[engine_start].to_img,
'engine_end' => self.board[engine_end].to_img
}
resp.merge(engine_resp)
end
end
def count_moves
if current_player.color == :black
self.move_count += 1
end
end
def play_move(move)
begin
start_pos, end_pos = move
board.move_piece(move, current_player.color)
count_moves
swap_turn!
response = generate_response(start_pos, end_pos)
response['winner'] = game_over?
response
rescue WrongColorError, NoStartPieceError, InvalidMoveError, InCheckError => e
return {
'errors' => e.message
}
end
end
def play
until black_checkmated? || white_checkmated?
begin
board.move_piece(display.move, current_player.color)
display.reset_move
swap_turn!
system "clear"
display.render
rescue WrongColorError, NoStartPieceError, InvalidMoveError, InCheckError => e
puts "#{e.message}"
display.reset_move
retry
end
end
notify_players
end
def black_checkmated?
@board.checkmate?(:black)
end
def white_checkmated?
@board.checkmate?(:white)
end
private
def notify_players
if black_checkmated?
puts "White wins!"
else
puts "Black wins!"
end
end
def swap_turn!
if @current_player == @p1
@current_player = @p2
else
@current_player = @p1
end
end
end