Mon script ne marche pas

Fermé
Plixon_ - Modifié le 17 avril 2023 à 19:01
 grimoire_gris - 17 avril 2023 à 08:39

Bonjour,

Je ne comprends pas le problème avec mon script. Quand je le lance un simple écran noir apparaît, j'ai fait ce code sur PyCharm. Si vous avez des solution je suis vraiment preneur.

Le but est qu'un bot fasse du morpion pour après lui ait appris à jouer grâce au machine Learning ou autre, mais ça, c'est pour après. Déjà il faudrait que l'interface du morpion marche. 

Voici tout le code que j'ai pour l'instant (j'utilise pygame comme bibliothèque)

import pygame

# Initialisation de Pygame
pygame.init()

# Définition des couleurs
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)

# Définition de la taille de la fenêtre
WINDOW_SIZE = (500, 500)

# Définition de la police de caractères
FONT = pygame.font.Font(None, 50)

# Création de la fenêtre
screen = pygame.display.set_mode(WINDOW_SIZE)
pygame.display.set_caption("Morpion")

# Initialisation de la matrice du jeu
game_matrix = [['', '', ''], ['', '', ''], ['', '', '']]

# Définition du joueur courant
player = 'X'

# Définition de l'état du tour de jeu
player_turn = True

# Fonction pour dessiner la grille
def draw_grid():
    # Dessiner les lignes verticales
    pygame.draw.line(screen, BLACK, (166, 0), (166, 500), 5)
    pygame.draw.line(screen, BLACK, (332, 0), (332, 500), 5)

    # Dessiner les lignes horizontales
    pygame.draw.line(screen, BLACK, (0, 166), (500, 166), 5)
    pygame.draw.line(screen, BLACK, (0, 332), (500, 332), 5)

# Fonction pour dessiner une croix ou un rond
def draw_XO(row, col):
    # Calculer les coordonnées du centre de la case
    x = col * 166 + 83
    y = row * 166 + 83

    # Dessiner une croix ou un rond en fonction du joueur courant
    if player == 'X':
        pygame.draw.line(screen, BLACK, (x - 50, y - 50), (x + 50, y + 50), 5)
        pygame.draw.line(screen, BLACK, (x + 50, y - 50), (x - 50, y + 50), 5)
    else:
        pygame.draw.circle(screen, BLACK, (x, y), 50, 5)

# Fonction pour vérifier si le jeu est terminé
def check_game_over():
    global running, winner
    if player_turn:
        for event in pygame.event.get():
            if event.type == pygame.MOUSEBUTTONDOWN:
                # Récupérer la position de la souris
                pos = pygame.mouse.get_pos()
                row = pos[1] // 166
                col = pos[0] // 166

                # Vérifier si la case est vide
                if game_matrix[row][col] == '':
                    # Marquer la case avec le symbole du joueur
                    game_matrix[row][col] = player

                    # Vérifier s'il y a un gagnant
                    if check_win():
                        winner = player
                        print(f"Le joueur {winner} a gagné !")
                        running = False

                    # Changer de joueur
                    player = 'O' if player == 'X' else 'X'
                    player_turn = False


# Fonction pour vérifier s'il y a un gagnant
def check_win():
    # Vérifier les lignes
    for row in range(3):
        if game_matrix[row][0] == game_matrix[row][1] == game_matrix[row][2] != '':
            return True

    # Vérifier les colonnes
    for col in range(3):
        if game_matrix[0][col] == game_matrix[1][col] == game_matrix[2][col] != '':
            return True

    # Vérifier les diagonales
    if game_matrix[0][0] == game_matrix[1][1] == game_matrix[2][2] != '':
        return True
    if game_matrix[0][2] == game_matrix[1][1] == game_matrix[2][0] != '':
        return True

    # Aucun gagnant
    return False

# Boucle principale du jeu
winner = None
running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if player_turn:
                # Récupérer la position de la souris
                pos = pygame.mouse.get_pos()
                row = pos[1] // 166
                col = pos[0] // 166

                # Vérifier si la case est vide
                if game_matrix[row][col] == '':
                    # Marquer la case avec le symbole du joueur
                    game_matrix[row][col] = player

                    # Vérifier s'il y a un gagnant
                    if check_win():
                        winner = player
                        print(f"Le joueur {winner} a gagné !")
                        running = False

                    # Changer de joueur
                    player = 'O' if player == 'X' else 'X'
                    player_turn = False

                    # Appel de la fonction pour vérifier si le jeu est terminé
                    check_game_over()

            # Dessiner le symbole sur la grille
            draw_grid()
            draw_XO(row, col)

        # Mettre à jour l'affichage
        pygame.display.update()

    # Si le jeu est terminé, afficher le message de fin
    if winner:
        font = pygame.font.Font(None, 36)
        text = font.render(f"Le joueur {winner} a gagné !", True, BLACK)
        text_rect = text.get_rect(center=(screen.get_width() // 2, screen.get_height() // 2))
        screen.blit(text, text_rect)
        pygame.display.flip()
        pygame.time.delay(3000)  # Attendre 3 secondes avant de fermer la fenêtre
        running = False

# Quitter Pygame
pygame.quit()
A voir également:

1 réponse

Bonjour,

Si tu dessines des lignes noires sur un écran noir, ça risque de ne pas se voir ;)
De plus, chaque fois qu'une croix ou un rond sera ajouté, il faudra que tu redessines tout, toute ta matrice comprise.

# Boucle principale du jeu
winner = None
running = True
# pré-affichage
screen.fill(WHITE)
draw_grid()
pygame.display.update()
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if player_turn:
                # Récupérer la position de la souris
                pos = pygame.mouse.get_pos()
                row = pos[1] // 166
                col = pos[0] // 166
                # Vérifier si la case est vide
                if not game_matrix[row][col]:
                    # Marquer la case avec le symbole du joueur
                    game_matrix[row][col] = player

                    # Vérifier s'il y a un gagnant
                    if check_win():
                        winner = player
                        print(f"Le joueur {winner} a gagné !")
                        running = False

                    # Changer de joueur
                    player = 'O' if player == 'X' else 'X'
                    player_turn = False

                    # Appel de la fonction pour vérifier si le jeu est terminé
                    # check_game_over() ?
                    screen.fill(WHITE)
                    # Dessiner le symbole sur la grille
                    draw_grid()
                    for i, line in enumerate(game_matrix):
                        for j, el in enumerate(line):
                            x = 83 + 166 * j
                            y = 83 + 166 * i
                            if el == 'X':
                                pygame.draw.line(screen, BLACK, (x - 50, y - 50), (x + 50, y + 50), 5)
                                pygame.draw.line(screen, BLACK, (x + 50, y - 50), (x - 50, y + 50), 5)
                            elif el == 'O':
                                pygame.draw.circle(screen, BLACK, (x, y), 50, 5)
                    # Mettre à jour l'affichage
                    pygame.display.update()

    # Si le jeu est terminé, afficher le message de fin
    if winner:
        font = pygame.font.Font(None, 36)
        text = font.render(f"Le joueur {winner} a gagné !", True, BLACK)
        text_rect = text.get_rect(center=(screen.get_width() // 2, screen.get_height() // 2))
        screen.blit(text, text_rect)
        pygame.display.flip()
        pygame.time.delay(3000)  # Attendre 3 secondes avant de fermer la fenêtre
        running = False
        pygame.display.update()


Il est fortement déconseillé de faire plusieurs appels à display.update dans un code.

Ta fonction draw_XO devient caduque, sans doute faire une fonction matrix_draw, quant à check_game_over ?

Bonne continuation.

1