Projet Puissance 4 - Correction


def genere_grille()->list:
    '''Fonction qui initialise la grille du jeu
    Entrée :
        aucune
    Sortie :
        le tableau de tableaux représentant la grille du jeu initialisée
    '''
    grille = [['o' for j in range(7)] for i in range(6)]

    return grille


def affiche_grille(grille: list):
    '''Fonction qui affiche la grille du jeu.
    'x' = case vide, 'R' = pion rouge, 'J' = pion jaune ( par exemple ).
    Les numéros de colonne de 1 à 7 doivent apparaître au dessus de la grille.
    Entrée :
        grille = le tableau de tableau représentant la grille du jeu
    Sortie :
        aucune
    '''
    for i in range(1, 8):
        print(i, end = " ")
    print()

    for ligne in grille:
        for colonne in ligne:
            print(colonne, end = ' ')
        print()



def est_jouable(grille: list, colonne: int)->int:
    """Fonction qui détermine si un pion peut être placé dans une colonne donnée.
    Entrées :
        grille = le tableau de tableau représentant la grille du jeu
        colonne = le numéro de la colonne où placer un pion
    Sorties :
        le numéro de la ligne où le pion se placera, -1 si la colonne est pleine
    """
    if grille[0][colonne-1] != 'o' or colonne < 1 or colonne > 7:  # colonne pleine ou valeur de colonne invalide
        ligne = -1
    else:
        ligne = 0
        while ligne < 5 and grille[ligne+1][colonne-1] == 'o': # Tant que l'on n'a pas atteint la dernière ligne ET que la case est vide ( TEST sur le numéro de ligne à faire en premier !!! )
            ligne += 1	# alors on descend d'une ligne

    return ligne


def place_pion(grille: list, joueur: int, colonne: int)->list:
    '''Fonction qui place le pion d'un joueur dans une case de la grille
    Entrée :
        grille = le tableau de tableaux représentant la grille du jeu
        joueur = le numéro du joueur
        colonne = le numéro de colonne dans laquelle le joueur souhaite placer un pion
    Sortie :
        le tableau de tableaux modifié par le placement du pion
    '''
    ligne = est_jouable(grille, colonne)

    if ligne == -1:
        print("Coup impossible.")
    else:
        if joueur == 1:
            grille[ligne][colonne-1] = 'R'
        else:
            grille[ligne][colonne-1] = 'J'
    return grille

def alignement_ligne(grille: list)->int :
    '''Fonction qui détermine si une suite de 4 pions d'une même couleur se trouve sur une des lignes de la grille.
    Entrée :
        grille = le tableau de tableau représentant la grille du jeu
    Sortie :
        une information ( un entier par exemple ) indiquant si un joueur est gagnant ( 1 ou 2 par exemple ) ou  si il n'y a pas de gagnant (-1 par exemple )
    '''
    for i in range(6) :
        nb_rouge = 0
        nb_jaune = 0

        for j in range(7) :
            if grille[i][j] == 'R' :
                nb_rouge += 1
                nb_jaune = 0
                if nb_rouge == 4:
                    return 'R'
            elif grille[i][j] == 'J' :
                nb_jaune += 1
                nb_rouge = 0
                if nb_jaune == 4:
                    return 'J'
            else:
                nb_rouge = 0
                nb_jaune = 0

    return -1

def alignement_colonne(grille: list)->int :
    '''Fonction qui détermine si une suite de 4 pions d'une même couleur se trouve sur une des colonnes de la grille.
    Entrée :
        grille = le tableau de tableau représentant la grille du jeu
    Sortie :
        une information ( un entier par exemple ) indiquant si un joueur est gagnant ( 1 ou 2 par exemple ) ou  si il n'y a pas de gagnant (-1 par exemple )
    '''
    for j in range(7) :
        nb_rouge = 0
        nb_jaune = 0

        for i in range(6) :
            if grille[i][j] == 'R' :
                nb_rouge += 1
                nb_jaune = 0
                if nb_rouge == 4:
                    return 'R'
            elif grille[i][j] == 'J' :
                nb_jaune += 1
                nb_rouge = 0
                if nb_jaune == 4:
                    return 'J'
            else:
                nb_rouge = 0
                nb_jaune = 0

    return -1


def alignement_descendant(grille: list)->int :
    '''Fonction qui détermine si une suite de 4 pions d'une même couleur se trouve sur une des diagonales descendantes de la grille.
    Entrée :
        grille = le tableau de tableau représentant la grille du jeu
    Sortie :
        une information ( un entier par exemple ) indiquant si un joueur est gagnant ( 1 ou 2 par exemple ) ou  si il n'y a pas de gagnant (-1 par exemple )
    '''
    for i in range(3) :
        nb_rouge = 0
        nb_jaune = 0
        x = 0
        y = i

        while x < 7 and y < 6:
            if grille[y][x] == 'R' :
                nb_rouge += 1
                nb_jaune = 0
                if nb_rouge == 4:
                    return 'R'
            elif grille[y][x] == 'J' :
                nb_jaune += 1
                nb_rouge = 0
                if nb_jaune == 4:
                    return 'J'
            else:
                nb_rouge = 0
                nb_jaune = 0

            x += 1
            y += 1

    for j in range(4) :
        nb_rouge = 0
        nb_jaune = 0
        x = j
        y = 0

        while x < 7 and y < 6:
            if grille[y][x] == 'R' :
                nb_rouge += 1
                nb_jaune = 0
                if nb_rouge == 4:
                    return 'R'
            elif grille[y][x] == 'J' :
                nb_jaune += 1
                nb_rouge = 0
                if nb_jaune == 4:
                    return 'J'
            else:
                nb_rouge = 0
                nb_jaune = 0

            x += 1
            y += 1

    return -1


def alignement_ascendant(grille: list)->int :
    '''Fonction qui détermine si une suite de 4 pions d'une même couleur se trouve sur une des diagonales ascendantes de la grille.
    Entrée :
        grille = le tableau de tableau représentant la grille du jeu
    Sortie :
        une information ( un entier par exemple ) indiquant si un joueur est gagnant ( 1 ou 2 par exemple ) ou  si il n'y a pas de gagnant (-1 par exemple )
    '''
    for i in range(3, 6) :
        nb_rouge = 0
        nb_jaune = 0
        x = 0
        y = i

        while x < 7 and y > -1:
            if grille[y][x] == 'R' :
                nb_rouge += 1
                nb_jaune = 0
                if nb_rouge == 4:
                    return 'R'
            elif grille[y][x] == 'J' :
                nb_jaune += 1
                nb_rouge = 0
                if nb_jaune == 4:
                    return 'J'
            else:
                nb_rouge = 0
                nb_jaune = 0

            x += 1
            y -= 1

    for j in range(4) :
        nb_rouge = 0
        nb_jaune = 0
        x = j
        y = 0

        while x < 7 and y > -1:
            if grille[y][x] == 'R' :
                nb_rouge += 1
                nb_jaune = 0
                if nb_rouge == 4:
                    return 'R'
            elif grille[y][x] == 'J' :
                nb_jaune += 1
                nb_rouge = 0
                if nb_jaune == 4:
                    return 'J'
            else:
                nb_rouge = 0
                nb_jaune = 0

            x += 1
            y -= 1

    return -1

###############################
# PROGRAMME PRINCIPAL
##############################

gagnant = None # variable qui stockera le gagnant quand il y en aura un : 1 = joueur ROUGE , 2 = joueur JAUNE
joueur = 1 # joueur qui joue en premier ( ROUGE )

grille = genere_grille() # génération de la grille ( vide )

while gagnant == None: # tant qu'il n'y a pas de gagnant

    affiche_grille(grille) # affichage du jeu

    # demande de la colonne à jouer selon le joueur
    if joueur == 1:
        colonne = int(input("Entrez la colonne Joueur ROUGE :"))
    else:
        colonne = int(input("Entrez la colonne Joueur JAUNE :"))

    # placement du pion
    grille = place_pion(grille, joueur, colonne)

    # résultats de la recherche d'un alignement de 4 pions en ligne, colonne, diagonale descendante/ascendante
    g1 = alignement_ligne(grille)
    g2 = alignement_colonne(grille)
    g3 = alignement_descendant(grille)
    g4 = alignement_ascendant(grille)

    # test si il y a un gagnant
    if g1 != -1:
        gagnant = g1
    elif g2 != -1:
        gagnant = g2
    elif g3 != -1:
        gagnant = g3
    elif g4 != -1:
        gagnant = g4

    # on change de joueur
    if joueur == 1:
        joueur = 2
    else:
        joueur = 1




affiche_grille(grille)
print("Le joueur", gagnant, " a gagné !")