Jeu d'echecs python
Bonjour, je suis en grosse galere et je n'arrive pas a finaliser min code de jeu d'echecs,je recherche de l'aide desperement qlqn peut m'aider svp :
import pygame from .Pieces import * from .constant import * class newBoard: def __init__(self, Width, Height, Rows, Cols, Square, win): self.Width = Width self.Height = Height self.Square = Square self.win = win self.Rows = Rows self.Cols = Cols self.Board = [] self.create_Board() def create_Board(self): for row in range(self.Rows): self.Board.append([0 for i in range(self.Cols)]) for col in range(self.Cols): if row == 1: self.Board[row][col] = Pawn(self.Square, Black_Pawn, Black, "Pawn", row, col) if row == 6: self.Board[row][col] = Pawn(self.Square, White_Pawn, Black, "Pawn", row, col) if row == 0: if col == 0 or col == 7: self.Board[row][col] = Rook(self.Square, Black_Rook, Black, "Rook", row, col) if col == 6 or col == 1: self.Board[row][col] = Knight(self.Square, Black_Knight, Black, "Knight", row, col) if col == 5 or col == 2: self.Board[row][col] = Bishop(self.Square, Black_Bishop, Black, "Bishop", row, col) if col == 3: self.Board[row][col] = Queen(self.Square, Black_Queen, Black, "Queen", row, col) if col == 4: self.Board[row][col] = King(self.Square, Black_King, Black, "King", row, col) if row == 7: if col == 0 or col == 7: self.Board[row][col] = Rook(self.Square, White_Rook, White, "Rook", row, col) if col == 6 or col == 1: self.Board[row][col] = Knight(self.Square, White_Knight, White, "Knight", row, col) if col == 5 or col == 2: self.Board[row][col] = Bishop(self.Square, White_Bishop, White, "Bishop", row, col) if col == 3: self.Board[row][col] = Queen(self.Square, White_Queen, White, "Queen", row, col) if col == 4: self.Board[row][col] = King(self.Square, White_King, White, "King", row, col) def get_piece(self, row, col): return self.Board[row][col] def moove(self, piece, row, col): self.Board[piece.row][piece.col], self.Board[row][col] = self.Board[row][col], self.Board[piece.row][piece.col] piece.piece_moove(row, col) if piece.type == "Pawn": if piece.first_moove: piece.first_moove = False def draw_Board(self, win): win.fill(Brown) for row in range(self.Rows): for col in range(self.Cols): color = White if (row + col) % 2 == 0 else Brown pygame.draw.rect(win, color, (col * self.Square, row * self.Square, self.Square, self.Square)) for row in range(self.Rows): for col in range(self.Cols): if self.Board[row][col] != 0: piece = self.Board[row][col] x, y = col * self.Square, row * self.Square piece.draw_piece(win, x, y) def draw_pieces(self): for row in range(self.Rows): for col in range(self.Cols): if self.Board[row][col] != 0: piece = self.Board[row][col] piece.draw_piece(self.win) </code> <code>import pygame import os Width, Height= 760, 760 Rows, Cols = 8, 8 Square = Width//Rows path = "Chess_game\chess_image" Brown = (87,16,16) White = (255,255,255) Green = (0,255,0) Black = (0,0,0) #piece_noir Black_Knight = pygame.transform.scale(pygame.image.load(os.path.join(path, "cheval.png")),(Square, Square)) Black_King = pygame.transform.scale(pygame.image.load(os.path.join(path, "king.png")),(Square, Square)) Black_Bishop = pygame.transform.scale(pygame.image.load(os.path.join(path, "fou.png")),(Square, Square)) Black_Pawn = pygame.transform.scale(pygame.image.load(os.path.join(path, "petit_pion.png")),(Square, Square)) Black_Rook = pygame.transform.scale(pygame.image.load(os.path.join(path, "tour.png")),(Square, Square)) Black_Queen = pygame.transform.scale(pygame.image.load(os.path.join(path, "queen.png")),(Square, Square)) #piece blanche White_Knight = pygame.transform.scale(pygame.image.load(os.path.join(path, "white_cheval.png")),(Square, Square)) White_King = pygame.transform.scale(pygame.image.load(os.path.join(path, "white_king.png")),(Square, Square)) White_Bishop = pygame.transform.scale(pygame.image.load(os.path.join(path, "white_fou.png")),(Square, Square)) White_Pawn = pygame.transform.scale(pygame.image.load(os.path.join(path, "white_pion.png")),(Square, Square)) White_Rook = pygame.transform.scale(pygame.image.load(os.path.join(path, "white_tour.png")),(Square, Square)) White_Queen = pygame.transform.scale(pygame.image.load(os.path.join(path, "white_queen.png")),(Square, Square))</code> <code>import pygame from .Board import * from .constant import * from copy import deepcopy class Game: def __init__(self, Width, Height, Rows, Cols, Square, win): self.win = win self.Board = newBoard(Width, Height, Rows, Cols, Square, win) self.Square = Square self.selected = None self.turn = White self.valid_moves = [] self.Black_pieces_left = 16 self.White_pieces_left = 16 def update_window(self): self.Board.draw_Board(self.win) self.Board.draw_pieces() self.draw_available_moves() pygame.display.update() def check_game(self): if self.checkmate(self.Board): if self.turn == White: print("Black Wins") return True else: print("White wins") return True def enemmies_moves(self, piece, Board): enemmies_moves = [] for r in range(len(Board)): for c in range(len(Board[r])): if Board[r][c] != 0: if Board[r][c].color != piece.color: moves = Board[r][c].get_available_moves(r,c, Board) for move in moves: enemmies_moves.append(move) return enemmies_moves def get_King_pos(self, Board): for r in range(len(Board)): for c in range(len(Board)): if Board[r][c] != 0: if Board[r][c].type == "King" and Board[r][c].color == self.turn: return (r,c) def possible_moves(self, Board): possible_moves = [] for r in range(len(Board)): for c in range(len(Board[r])): if Board[r][c] != 0: if Board[r][c].color == self.turn and Board[r][c].type != "King": moves = Board[r][c].get_available_moves(r,c, Board) for move in moves: possible_moves.append(move) return possible_moves def checkmate(self, Board): king_pos = self.get_King_pos(Board.Board) get_King = Board.get_piece(king_pos[0], king_pos[1]) king_available_moves = set(get_King.get_available_moves(king_pos[0], king_pos[1], Board.Board)) enemies_moves_set = set(self.enemmies_moves(get_King, Board.Board)) king_moves = king_available_moves - enemies_moves_set set1 = king_available_moves.intersection(enemies_moves_set) possible_moves_to_def = set1.intersection(self.possible_moves(Board.Board)) if not king_moves and king_available_moves and not possible_moves_to_def: return True return False def simulate_move(self, piece, row, col): piece_row, piece_col = piece.row, piece.col save_piece = self.Board.Board[row][col] if self.Board.Board[row][col] != 0: self.Board.Board[row][col] = 0 self.Board.Board[piece.row][piece.col], self.Board.Board[row][col] = self.Board.Board[row][col], self.Board.Board[piece.row][piece.col] king_pos = self.get_King_pos(self.Board.Board) if king_pos in self.enemies_moves(piece, self.Board): piece.row, piece.col = piece.row, piece_col self.Board[piece_row][piece_col] = piece self.Board.Board[row][col] = save_piece return False piece.row, piece.col = piece_row, piece_col self.Board.Board[piece_row][piece_col] = piece self.Board.Board[row][col] = save_piece return True def reset(self): self.Board = newBoard(Width, Height, Rows, Cols, Square, win) self.selected = None self.Black_pieces_left = 16 self.White_pieces_left = 16 self.valid_moves = [] def change_turn(self): if self.turn == White: self.turn = Black else: self.turn = White def select(self, row,col): if self.selected: move = self._move(row, col) if not move: self.selected = None self.selected(row, col) piece = self.Board.get_piece(row, col) if piece != 0 and self.turn == piece.color: self.selected = piece self.valid_moves = piece.get_available_moves(row, col, self.Board.Board) def _move(self, row, col): piece = self.Board.get_piece(row, col) if self.selected and (row, col) in self.valid_moves: if piece == 0 or piece.color != self.selected.color: if self.simulate_move(self.selected, row, col): self.remove(self.selected, row, col) self.moove(piece, row, col) self.change_turn() self.valid_moves = [] self.selected = None return True return False return False def remove(self, Board, piece, row, col): if piece != 0: Board[row][col] = 0 if piece.color == White: self.White_pieces_left -= 1 else: self.Black_pieces_left -= 1 def draw_available_moves(self): if len(self.valid_moves) > 0: for pos in self.valid_moves: row, col = pos[0], pos[1] pygame.draw.circle(self.win, Green, (col*self,Square + self.Square//2), self.Square//8) </code> <code>import pygame from .constant import * from .Board import * class Piece: def __init__(self, Square, image,color, type, row,col): self.Square = Square self.image = image self.color = color self.row = row self.col = col self.type = type self.x = 0 self.y = 0 self.availables_moves = [] def draw_piece(self, win): x = self.col * self.Square y = self.row * self.Square win.blit(self.image, (x, y)) def piece_moove(self,row,col): self.row = row self.col = col self.calc_pos() def calc_pos(self): self.x = self.col*self.Square self.y = self.row*self.Square def clear_available_moves(self): if len(self.availables_moves) > 0: self.availables_moves = [] class Pawn(Piece): def __init__(self, Square, image, color, type, row, col): super().__init__(Square, image, color, type, row, col) self.first_moove = True def draw_piece(self, win): x = self.col * self.Square y = self.row * self.Square win.blit(self.image, (x, y)) def get_available_moves(self, row, col, Board): self.clear_available_moves() if self.color == White: if row-1 >= 0: if Board[row-1][col] == 0: self.availables_moves.append((row-1, col)) if self.first_moove: if Board[row-1][col] == 0: self.availables_moves.append((row-2, col)) if col-1 >= 0: if Board[row+1][col-1] != 0: piece = Board[row+2][col-1] if piece.color != self.color: self.availables_moves.append((row+1, col-1)) if col+1 < len(Board): if Board[row+1][col+1] != 0: piece = Board[row+1][col+1] if piece.color != self.color: self.availables_moves.append((row+1,col+1)) return self.availables_moves class Rook(Piece): def __init__(self, Square, image, color, type, row, col): super().__init__(Square, image, color, type, row, col) def draw_piece(self, win): x = self.col * self.Square y = self.row * self.Square win.blit(self.image, (x, y)) def get_available_moves(self, row, col, Board): self.clear_available_moves() for i in range(row+1,8): if Board[i][col] == 0: self.availables_moves.append((i,col)) else: if Board[i][col].color != self.color: self.availables_moves.append((i,col)) break else: break for j in range(row-1,-1,-1): if Board[j][col] == 0: self.availables_moves.append((j,col)) else: if Board[j][col].color != self.color: self.availables_moves.append((j,col)) break else: break for i in range(col+1,8): if Board[row][i] == 0: self.availables_moves.append((row,i)) else: if Board[row][i].color: self.availables_moves.append((row,i)) break else: break for i in range(col-1,-1,-1): if Board[row][i] == 0: self.availables_moves.append((row,i)) else: if Board[row][i].color: self.availables_moves.append((row,i)) break else: break return self.availables_moves class Bishop(Piece): def __init__(self, Square, image, color, type, row, col): super().__init__(Square, image, color, type, row, col) def draw_piece(self, win): x = self.col * self.Square y = self.row * self.Square win.blit(self.image, (x, y)) def get_available_moves(self, row, col, Board): self.clear_available_moves() row_i = row+1 col_i = col+1 while row_i <= 7 and col_i <= 7: if Board[row_i][col_i] == 0: self.availables_moves.append((row_i,col_i)) row_i += 1 col_i += 1 else: if Board[row_i][col_i].color != self.color: self.availables_moves.append((row_i,col_i)) break else: break row_i = row-1 col_i = col-1 while row_i >= 0 and col_i >= 0: if Board[row_i][col_i] == 0: self.availables_moves.append((row_i,col_i)) row_i -= 1 col_i -= 1 else: if Board[row_i][col_i].color != self.color: self.availables_moves.append((row_i,col_i)) break else: break row_i = row+1 col_i = col-1 while row_i <= 7 and col_i >=0: if Board[row_i][col_i] == 0: self.availables_moves.append((row_i,col_i)) row_i += 1 col_i -= 1 else: if Board[row_i][col_i].color != self.color: self.availables_moves.append((row_i,col_i)) break else: break row_i = row-1 col_i = col+1 while row_i >= 0 and col_i <= 7: if Board[row_i][col_i] == 0: self.availables_moves.append((row_i,col_i)) row_i -= 1 col_i += 1 else: if Board[row_i][col_i].color != self.color: self.availables_moves.append((row_i,col_i)) break else: break return self.availables_moves class Knight(Piece): def __init__(self, Square, image, color, type, row, col): super().__init__(Square, image, color, type, row, col) def draw_piece(self, win): x = self.col * self.Square y = self.row * self.Square win.blit(self.image, (x, y)) def get_available_moves(self, row, col, Board): self.clear_available_moves() if row-2 >= 0 and col+1 < len(Board): if Board[row-2][col+1] == 0 or Board[row-2][col+1].color != self.color: self.availables_moves.append((row-2, col+1)) if row-1 >= 0 and col+2 < len(Board[0]): if Board[row-1][col+2] == 0 or Board[row-1][col+2].color != self.color: self.availables_moves.append((row-1, col+2)) if row+1 < len(Board) and col+2 < len(Board): if Board[row+1][col+2] == 0 or Board[row+1][col+2].color != self.color: self.availables_moves.append((row+1, col+2)) if row+2 < len(Board) and col+1 < len(Board): if Board[row+2][col+1] == 0 or Board[row+2][col+1].color != self.color: self.availables_moves.append((row+2, col+1)) if row+2 < len(Board) and col-1 >= 0: if Board[row+2][col-1] == 0 or Board[row+2][col-1].color != self.color: self.availables_moves.append((row+2, col-1)) if row+1 < len(Board) and col-2 >= 0: if Board[row+1][col-2] == 0 or Board[row+1][col-2].color != self.color: self.availables_moves.append((row+1, col-2)) if row-1 >= 0 and col-2 >= 0: if Board[row-1][col-2] == 0 or Board[row-1][col-2].color != self.color: self.availables_moves.append((row-1, col-2)) if row-2 >=0 and col-1 >= 0: if Board[row-2][col-1] == 0 or Board[row-2][col-1].color != self.color: self.availables_moves.append((row-2, col-1)) return self.availables_moves class Queen(Piece): def __init__(self, Square, image, color, type, row, col): super().__init__(Square, image, color, type, row, col) def draw_piece(self, win): x = self.col * self.Square y = self.row * self.Square win.blit(self.image, (x, y)) def get_available_moves(self, row, col, Board): self.clear_available_moves() row_i = row+1 col_i = col+1 while row_i <= 7 and col_i <= 7: if Board[row_i][col_i] == 0: self.availables_moves.append((row_i,col_i)) row_i += 1 col_i += 1 else: if Board[row_i][col_i].color != self.color: self.availables_moves.append((row_i,col_i)) break else: break row_i = row-1 col_i = col-1 while row_i >= 0 and col_i >= 0: if Board[row_i][col_i] == 0: self.availables_moves.append((row_i,col_i)) row_i -= 1 col_i -= 1 else: if Board[row_i][col_i].color != self.color: self.availables_moves.append((row_i,col_i)) break else: break row_i = row+1 col_i = col-1 while row_i <= 7 and col_i >=0: if Board[row_i][col_i] == 0: self.availables_moves.append((row_i,col_i)) row_i += 1 col_i -= 1 else: if Board[row_i][col_i].color != self.color: self.availables_moves.append((row_i,col_i)) break else: break row_i = row-1 col_i = col+1 while row_i >= 0 and col_i <= 7: if Board[row_i][col_i] == 0: self.availables_moves.append((row_i,col_i)) row_i -= 1 col_i += 1 else: if Board[row_i][col_i].color != self.color: self.availables_moves.append((row_i,col_i)) break else: break for i in range(row+1,8): if Board[i][col] == 0: self.availables_moves.append((i,col)) else: if Board[i][col].color != self.color: self.availables_moves.append((i,col)) break else: break for j in range(row-1,-1,-1): if Board[j][col] == 0: self.availables_moves.append((j,col)) else: if Board[j][col].color != self.color: self.availables_moves.append((j,col)) break else: break for i in range(col+1,8): if Board[row][i] == 0: self.availables_moves.append((row,i)) else: if Board[row][i].color: self.availables_moves.append((row,i)) break else: break for i in range(col-1,-1,-1): if Board[row][i] == 0: self.availables_moves.append((row,i)) else: if Board[row][i].color: self.availables_moves.append((row,i)) break else: break return self.availables_moves class King(Piece): def __init__(self, Square, image, color, type, row, col): super().__init__(Square, image, color, type, row, col) def draw_piece(self, win): x = self.col * self.Square y = self.row * self.Square win.blit(self.image, (x, y)) def get_available_moves(self, row, col, Board): self.clear_available_moves() if row-1 >= 0: if Board[row-1][col] == 0 or Board[row-1][col].color != self.color: self.availables_moves.append((row-1,col)) if row-1 >= 0 and col+1 < len(Board): if Board[row-1][col+1] == 0 or Board[row-1][col+1].color != self.color: self.availables_moves.append((row-1,col+1)) if col+1 < len(Board): if Board[row][col+1] == 0 or Board[row][col+1].color != self.color: self.availables_moves.append((row,col+1)) if row+1 <len(Board) and col+1 < len(Board): if Board[row+1][col+1] == 0 or Board[row+1][col+1].color != self.color: self.availables_moves.append((row+1,col+1)) if row+1 < len(Board): if Board[row+1][col] == 0 or Board[row+1][col].color != self.color: self.availables_moves.append((row+1,col)) if row+1 <len(Board) and col-1 >= 0: if Board[row+1][col-1] == 0 or Board[row+1][col-1].color != self.color: self.availables_moves.append((row+1,col-1)) if col-1 >=0: if Board[row][col-1] == 0 or Board[row][col-1].color != self.color: self.availables_moves.append((row,col-1)) if row-1 >= 0 and col-1 >= 0: if Board[row-1][col-1] == 0 or Board[row-1][col-1].color != self.color: self.availables_moves.append((row-1,col-1)) return self.availables_moves </code> <code>import pygame from Chess_game.constant import * from Chess_game.Game import Game from Chess_game.Board import newBoard pygame.init() clock = pygame.time.Clock() win = pygame.display.set_mode((Width, Height)) def get_position(x, y): row = y // Square col = x // Square return row, col def main(): run = True FPS = 60 Cols = 8 Rows = 8 game = Game(Width, Height, Rows, Cols, Square, win) game_over = False while run: clock.tick(FPS) game.update_window() if game.check_game(): game_over = True for event in pygame.event.get(): if event.type == pygame.QUIT: run = False quit() if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE and game_over: game.reset() game_over = False # Réinitialisez le drapeau game_over if event.type == pygame.MOUSEBUTTONDOWN and not game_over: if pygame.mouse.get_pressed()[0]: location = pygame.mouse.get_pos() row, col = get_position(location[0], location[1]) game.select(row, col) game._move(row, col) main()
Windows / Chrome 121.0.0.0
- Code source jeu d'echec python
- Code ascii - Guide
- Citizen code python - Accueil - Outils
- Mode sans echec ps4 - Guide
- Code puk bloqué - Guide
- Comment déverrouiller un téléphone quand on a oublié le code - Guide
3 réponses
Il y a à peine 750 lignes dans ton code. Tu crois qu'on va s'y retrouver?
En plus, tu ne dis pas sur quoi tu galères.
Bonjour,
Quand tu demandes de l'aide sur un forum, il faut mieux cibler un problème précis. Comme le dit Pierrot, on ne sait pas ce qui te bloque.
Avant de te lancer dans le code, il est sans doute souhaitable de faire un petit diagramme de classe pour identifier tous les objets dont tu auras besoin et comment ils interagissent entre eux. Ton enseignant t'a sans doute donné quelques bases en UML pour architecturer ton projet.
Ensuite quand tu développes un projet, il faut y aller petit à petit, et ajouter progressivement des éléments. Par exemple il n'est peut-être pas nécessaire de commencer directement avec Pygame, tu peux sans doute commencer par coder le moteur du jeu avec une interface en mode texte.
Ton diagramme de classe te permettra sans doute d'identifier les classes à développer en priorité. Par exemple, tu peux sans doute commencer par coder la notion de tour de jeu (à qui est-ce jouer), puis de plateau, et ensuite de pièces. Ensuite tu peux sans doute coder une pièce (disons le roi), vérifier qu'elle se comporte comme prévu, puis ajouter progressivement chaque type de pièce. En outre il est important de vérifier (hormis pour le cavalier, qu'une pièce n'en traverse pas une autre au cours de son mouvement, à moins bien sûr que ce soit la case qui termine le mouvement (prise). Dans ce cas, il faut vérifier que la pièce est bien dans le camp adverse.
Plus tard, tu pourras peaufiner (roque, prise en passant, interface graphique), mais si tu veux t'en sortir, il faut te focaliser sur le plus important et ne pas vouloir tout faire en même temps. Et à chaque fois que tu développes une fonctionnalité, tu la teste avant d'en ajouter une nouvelle. Ainsi, en cas de problème, l'erreur est a priori dans ce que tu viens de rajouter...
Bonne chance
Tu n'es pas obligé de recommencer, tu peux repartir d'où tu en es. Mais vu tes questions tu ne sembles plus savoir où tu en es. Donc là il faut commencer par alterner les tours de jeu entre les joueurs et les inviter à déplacer une pièce, puis contrôler que ce mouvement est valide... Si c'est le cas, on passe à l'autre joueur.
desole je n'ai pas vraiment realiser, je n'en pouvais plus de voir ce projet presque fini et de ne pas pouvoir trouver une bete erreur qui n'est surment pas tres compliquer a modifier