Codechest
Codechest
import pygame
import numpy as np
import torch
import torch.nn as nn
import torch.optim as optim
import sys
import random
from collections import deque
pieces = board.piece_map()
for square, piece in pieces.items():
row, col = divmod(square, 8)
piece_text = unicode_pieces[piece.symbol()]
text_surface = font.render(piece_text, True, pygame.Color('black' if piece.color ==
chess.WHITE else 'white'))
text_rect = text_surface.get_rect(center=((col + 0.5) * square_size, (row + 0.5) *
square_size))
screen.blit(text_surface, text_rect)
while True:
try:
choice = int(input("Lựa chọn (1-4): "))
if 1 <= choice <= 4:
return [chess.QUEEN, chess.ROOK, chess.BISHOP, chess.KNIGHT][choice - 1]
except ValueError:
pass
print("Lựa chọn không hợp lệ. Vui lòng thử lại.")
# === Replay Buffer ===
class ReplayBuffer:
def __init__(self, capacity):
self.buffer = deque(maxlen=capacity)
def __len__(self):
return len(self.buffer)
if move in board.legal_moves:
board.push(move)
print(f"Player moved: {move}")
else:
print("Nước đi không hợp lệ.")
best_move_idx = np.argmax(q_values)
return legal_moves[best_move_idx]
q_values = model(states)
with torch.no_grad():
next_q_values = model(next_states)
max_next_q_values = next_q_values.max(1, keepdim=True)[0]
optimizer.zero_grad()
loss.backward()
optimizer.step()
running = True
selected_square = None
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
elif event.type == pygame.MOUSEBUTTONDOWN and board.turn != ai_plays_white:
pos = pygame.mouse.get_pos()
col, row = pos[0] // square_size, pos[1] // square_size
square = row * 8 + col
if selected_square is None:
selected_square = square
else:
handle_player_move(board, selected_square, square)
selected_square = None
screen.fill(pygame.Color('white'))
draw_board(screen, board, square_size)
pygame.display.flip()
clock.tick(30)
pygame.quit()
sys.exit()
if __name__ == "__main__":
main()