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é !")