Created
November 13, 2021 07:53
-
-
Save LoanCB/cb332423566f980519e9f5aecb6057fc to your computer and use it in GitHub Desktop.
Projet algorithmique de première année de bachelor informatique à ESGI Lyon ~ Printemps 2021
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
############################################## Librairies ################################################# | |
import os, platform, colorama, random | |
from colorama import Fore, Style | |
############################################################################################################# | |
############################################## Fonctions ################################################## | |
# Suppression de l'écran | |
def clearCmd(): | |
if platform.system() == "Windows": | |
os.system("cls") | |
else: | |
os.system("clear") | |
# Afficher le tableau | |
def afficherPlateau(): | |
for ligne in plateau: | |
for x in ligne: | |
print(x[0][0:6], " ", end=" ") | |
print("\n") | |
#Phrases de l'initialisation du tour | |
def afficherInitialisation(): | |
clearCmd() | |
print(Style.BRIGHT + "**********\n* Joueur *\n**********\n" + Style.RESET_ALL) | |
print("C'est au tour de " + Style.BRIGHT + joueur + Style.RESET_ALL + " de jouer\n") | |
print(Style.BRIGHT + "*********\n* Pions *\n*********\n\n" + Style.RESET_ALL + couleurJ1 + joueur1 + Style.RESET_ALL + ":\nPetit pions : " + Style.BRIGHT + str(listePionsJ1[1]) + Style.RESET_ALL + " ; Moyen pions : " + Style.BRIGHT + str(listePionsJ1[2]) + Style.RESET_ALL + " ; Grand pions : " + Style.BRIGHT + str(listePionsJ1[3]) + Style.RESET_ALL + "\n\n" + couleurJ2 + joueur2 + Style.RESET_ALL + ":\nPetit pions : " + Style.BRIGHT + str(listePionsJ2[1]) + Style.RESET_ALL + " ; Moyen pions : " + Style.BRIGHT + str(listePionsJ2[2]) + Style.RESET_ALL + " ; Grand pions : " + Style.BRIGHT + str(listePionsJ2[3]) + Style.RESET_ALL + "\n\n") | |
print(Style.BRIGHT + "***********\n* plateau *\n***********\n" + Style.RESET_ALL) | |
afficherPlateau() | |
print(Style.BRIGHT + "\n**********\n* Action *\n**********\n" + Style.RESET_ALL) | |
#Test du placement d'un pion sur le plateau | |
def testPlacementPion(listePions, choixTaille, plateau, choixLigne, choixColonne, choixLigneAncien, choixColonneAncien, choixAction, couleurJ, nombreJoueur): | |
afficherInitialisation() | |
if listePions[choixTaille] > 0: | |
if int(plateau[choixLigne][choixColonne][0][5]) < choixTaille: | |
if choixAction == "ajouter": | |
listePions[choixTaille] -= 1 | |
elif choixAction == "deplacer": | |
plateau[choixLigneAncien][choixColonneAncien].pop(0) | |
else: | |
print("Erreur : Test emplacement + taille : accepter emplacement pion") | |
exit() | |
plateau[choixLigne][choixColonne].insert(0, couleurJ + str(choixTaille) + nombreJoueur + Style.RESET_ALL) | |
ok = "position9" | |
ok2 = "position1" | |
else: | |
if choixAction == "ajouter": | |
print("Vous ne pouvez pas poser un pion de cette taille !") | |
ok = "position6" | |
ok2 = "position1" | |
elif choixAction == "deplacer": | |
print("Vous ne pouvez pas deplacer votre pion ici car sa taille ne le permet pas !") | |
ok = "position8" | |
ok2 = "position1" | |
else: | |
print(Fore.RED + "Erreur : Test emplacement + taille : refus emplacement pion" + Style.RESET_ALL) | |
exit() | |
else: | |
print("Vous n'avez plus de pieces de cette taille") | |
ok = "position6" | |
ok2 = "position1" | |
return ok, ok2 | |
############################################################################################################# | |
####################################### Initialisation des variables ###################################### | |
#Variables qui ne doit être initialisé qu'une seule fois | |
programme = True | |
couleurJ1 = Fore.BLUE | |
couleurJ2 = Fore.GREEN | |
reglesDeplacement = "oui" | |
joueurAlea = "oui" | |
while programme: | |
plateau = [ | |
[[Fore.WHITE + "/"], [Fore.WHITE + "A"], [Fore.WHITE + "B"], [Fore.WHITE + "C"]], | |
[[Fore.WHITE + "3"], [Fore.WHITE + "00"], [Fore.WHITE + "00"], [Fore.WHITE + "00"]], | |
[[Fore.WHITE + "2"], [Fore.WHITE + "00"], [Fore.WHITE + "00"], [Fore.WHITE + "00"]], | |
[[Fore.WHITE + "1"], [Fore.WHITE + "00"], [Fore.WHITE + "00"], [Fore.WHITE + "00"]] | |
] | |
jeu, menu, start, regles, option = True, True, True, False, False | |
cases = ["A1", "B1", "C1", "A2", "B2", "C2", "A3", "B3", "C3"] | |
tailles = [1, 2, 3] | |
listeColonne = ["0", "A", "B", "C"] | |
listeLigne = ["0", "3", "2", "1"] | |
listePionsJ1 = [0, 2, 2, 2] | |
listePionsJ2 = [0, 2, 2, 2] | |
listeCouleurs = [Fore.RED, Fore.GREEN, Fore.YELLOW, Fore.BLUE, Fore.MAGENTA, Fore.CYAN] | |
choixLigneAncien, choixColonneAncien = 0, 0 | |
############################################################################################################# | |
################################################### Start ################################################### | |
while start: | |
clearCmd() | |
# Menu | |
while menu: | |
ok = "position20" | |
print(Style.BRIGHT + "********\n* menu *\n********\n" + Style.RESET_ALL) | |
print("Jouer") | |
print("Regles") | |
print("Options") | |
print("Quitter\n") | |
# Position 20 : Choix dans le menu | |
while ok == "position20": | |
choixMenu = input("Veuillez indiquer ce que vous voulez faire : ") | |
if choixMenu == "jouer": | |
menu, start, debut = False, False, True | |
ok = "positionEnd" | |
elif choixMenu == "regles": | |
menu, regles = False, True | |
ok = "positionEnd" | |
elif choixMenu == "options": | |
menu, option = False, True | |
ok = "positionEnd" | |
elif choixMenu == "quitter": | |
print("Arret du jeu") | |
print("Cree par Loan CB") | |
exit() | |
else: | |
print("Veuillez rentrer une commande valide (tout en minuscule)") | |
clearCmd() | |
# Règles | |
while regles: | |
print(Style.BRIGHT + "*************\n* BIENVENUE *\n*************\n" + Style.RESET_ALL) | |
print("Découvrez les règles du morpion amélioré ! Idéal pour passer le temps entre petits et grands.\n") | |
print(Style.BRIGHT + "**************\n* LES REGLES *\n**************\n" + Style.RESET_ALL) | |
print("Comment jouer ?\n") | |
print("Pour jouer une partie de morpion amélioré c’est très simple.\n\n Chacun des joueurs possède 6 pions de tailles différentes commençant par petit, puis moyen et enfin grand.\nLes deux joueurs auront donc 2 pions de chaque taille. Le but du jeu est d'aligner avant son adversaire 3 pions \nidentiques hozizontalement, verticalement ou en diagonale.Les deux joueurs possèdent une couleur unique pour les \ndifférencier. La partie se termine lorsque l'un des joueurs réussi à aligner ses pions.\n\n Néanmoins il y a une petite variante sur ce mode de jeu, comme dit précédemment un joueur possède 3 pions de différente taille, ce qui lui permet de manger le pion adverse si et seulement si le pion à manger est plus petit. Par exemple le joueur 1 possède un grand pion il peut donc manger un pion de taille moyenne et un petit pion.\nPour plus de stratégie vous pouvez également manger votre propre pion si celui-ci est de taille inférieure à celui que vous désirez placer.\n") | |
print("Pour finir vous pouvez entrer \"retour\" si vous voulez retourner en arriere pour changer l'emplacement du pion par exemple. Bonne chance !\n") | |
input("Appuyez sur entrer pour continuer") | |
regles = False | |
menu = True | |
# Option | |
while option: | |
ok = "position21" | |
print(Style.BRIGHT + "**********\n* Options *\n**********\n" + Style.RESET_ALL) | |
print("Ici vous pouvez modifier des propriete du jeu. Entrez le numero indiquer au debut pour changer sa propriete. Entrez \"retour\" pour revenir au menu\n") | |
print("1 - Changer la couleur des joueurs") | |
print("2 - Desactiver la regle permettant de deplacer des pieces du plateau") | |
print("3 - Choix du joueur qui commence\n") | |
# Position 21 : Choix des options | |
while ok == "position21": | |
choixPropriete = input("\nVotre choix : ") | |
if choixPropriete == "1": | |
print("\nVous avez choisi de changer la couleur des joueurs. Chaque couleur est representee par un chiffre, il vous suffit d'entrer le chiffre correspondant a la couleur que vous voulez.\n") | |
print("1 : rouge ; 2 : vert ; 3 : jaune ; 4 : bleu ; 5 : violet ; 6 : turquoise\n") | |
ok2 = "position20" | |
# Position 20 b : Changement de couleurs | |
while ok2 == "position20": | |
try: | |
couleurJ1 = int(input("Entrez la couleur du joueur 1 : ")) | |
couleurJ2 = int(input("Entrez la couleur du joueur 2 : ")) | |
except: | |
print("Veuillez entrer des chiffres !") | |
if couleurJ1 == couleurJ2: | |
print("Veuillez choisir 2 couleurs differentes !") | |
elif (couleurJ1 < 1 and couleurJ1 > 7 ) or (couleurJ2 > 7 and couleurJ2 < 1): | |
print("L'une des couleurs choisie n'existe pas") | |
else: | |
couleurJ1 = listeCouleurs[couleurJ1 - 1] | |
couleurJ2 = listeCouleurs[couleurJ2 - 1] | |
option = False | |
ok2 = "positionEnd" | |
elif choixPropriete == "2": | |
if reglesDeplacement == "oui": | |
print("La regle permettant de deplacer les pions vient d'etre desactivee") | |
reglesDeplacement = "non" | |
option = False | |
elif reglesDeplacement == "non": | |
print("La regle permettant de deplacer les pions vient d'etre reactivee") | |
reglesDeplacement = "oui" | |
option = False | |
else: | |
print(Fore.RED + "Erreur : Position 20 propriete 2" + Style.RESET_ALL) | |
exit() | |
elif choixPropriete == "3": | |
if joueurAlea == "oui": | |
print("Le joueur qui commence est choisi par les joueurs") | |
joueurAlea = "non" | |
elif joueurAlea == "non": | |
print("Le joueur qui commence est choisi aleatoirement") | |
joueurAlea = "oui" | |
else: | |
print(Fore.RED + "Erreur : position 20 propriete 3" + Style.RESET_ALL) | |
elif choixPropriete == "retour": | |
option = False | |
menu = True | |
ok = "positionEnd" | |
else: | |
print("Aucune propriete ne possede ce numero") | |
############################################################################################################# | |
######################################## Initialisation des joueurs ####################################### | |
ok, ok2 = "position1", "position1" | |
while debut: | |
# Position 1 : Choix des noms | |
while ok == "position1": | |
clearCmd() | |
print(Style.BRIGHT + "******************************\n* INITIALISATION DES JOUEURS *\n******************************\n" + Style.RESET_ALL) | |
joueur1 = input("Veuillez entrer le nom du premier joueur : ") | |
joueur2 = input("Veuillez entrer le nom du second joueur : ") | |
if joueur1 == joueur2: | |
print("Veuiller choisir 2 noms de joueur différent !") | |
else: | |
ok = "position2" | |
# Position 2 : Choix du premier joueur | |
if joueurAlea == "non": | |
while ok == "position2": | |
joueur = input("Veuillez indiquer le nom du joueur qui commence : ") | |
if joueur == "retour": | |
ok = "position1" | |
elif joueur != joueur1 and joueur != joueur2: | |
print("Veuillez indiquer un nom de joueur existant !") | |
else: | |
ok = "position3" | |
debut = False | |
elif joueurAlea == "oui": | |
if random.randint(1, 2) == 1: | |
joueur = joueur1 | |
else: | |
joueur = joueur2 | |
ok = "position3" | |
debut = False | |
############################################################################################################# | |
############################################## Début du jeu ############################################### | |
while jeu: | |
# Position 1B : Actions du joueurs | |
while ok2 == "position1": | |
# Position 3 : Initialisation du tour | |
while ok == "position3": | |
afficherInitialisation() | |
if reglesDeplacement == "oui": | |
ok = "position4" | |
elif reglesDeplacement == "non": | |
ok = "position5" | |
choixAction = "ajouter" | |
else: | |
print(Fore.RED + "Erreur : Position 3" + Style.RESET_ALL) | |
exit() | |
# Position 4 : Choix de l'action | |
while ok == "position4": | |
choixAction = input("Choisissez l'action à réaliser : ") | |
if choixAction == "ajouter": | |
ok = "position5" | |
elif choixAction == "deplacer": | |
ok = "position7" | |
elif choixAction == "retour": | |
print("Vous ne pouvez pas executer cette commande ici") | |
else: | |
print("Veillez indiquer une action existante : ajouter, deplacer") | |
# Position 5 : Choix de l'emplacement {Ajouter} | |
while ok == "position5": | |
choixCase = input("Choisissez une case : ") | |
if choixCase in cases: | |
choixColonne = listeColonne.index(choixCase[0]) | |
choixLigne = listeLigne.index(choixCase[1]) | |
ok = "position6" | |
elif choixCase == "retour": | |
ok = "position3" | |
else: | |
print("Cette case n'existe pas ! Commencez par écrire la lettre (colonne) puis le chiffre (ligne) sans espace et faites attention aux majuscules\n") | |
# Position 6 : Choix de la taille {Ajouter} | |
while ok == "position6": | |
choixTaille = input("Choisissez une taille de pion : ") | |
if choixTaille == "retour": | |
afficherInitialisation() | |
ok = "position5" | |
else: | |
try: | |
choixTaille = int(choixTaille) | |
ok = "positionEnd" | |
ok2 = "position2" | |
except: | |
print("Veuillez entrer un chiffre !") | |
# Position 7 : Ancien emplacement {Déplacer} | |
while ok == "position7": | |
choixCase = input("Choisissez l'emplacement du pion à déplacer : ") | |
if choixCase in cases: | |
choixColonneAncien = listeColonne.index(choixCase[0]) | |
choixLigneAncien = listeLigne.index(choixCase[1]) | |
if joueur == joueur1: | |
if plateau[choixLigneAncien][choixColonneAncien][0][6] == "1": | |
pion = plateau[choixLigneAncien][choixColonneAncien][0] | |
ok = "position8" | |
else: | |
print("Vous ne pouvez pas déplacer un pion qui ne vous appartient pas !") | |
elif joueur == joueur2: | |
if plateau[choixLigneAncien][choixColonneAncien][0][6] == "2": | |
pion = plateau[choixLigneAncien][choixColonneAncien][0] | |
ok = "position8" | |
else: | |
print("Vous ne pouvez pas déplacer un pion qui ne vous appartient pas !") | |
else: | |
print(Fore.RED + "Erreur : Position 7" + Style.RESET_ALL) | |
exit() | |
elif choixCase == "retour": | |
ok = "position3" | |
else: | |
print("Cette case n'existe pas ! Commencez par écrire la lettre (colonne) puis le chiffre (ligne) sans espace et faites attention aux majuscules\n") | |
# Position 8 : Nouvel emplacement {Déplacer} | |
while ok == "position8": | |
choixCase = input("Choisissez le nouvel emplacement du pion : ") | |
if choixCase in cases: | |
choixColonne = listeColonne.index(choixCase[0]) | |
choixLigne = listeLigne.index(choixCase[1]) | |
choixTaille = int(pion[5]) | |
ok = "positionEnd" | |
ok2 = "position2" | |
elif choixCase == "retour": | |
afficherInitialisation() | |
ok = "position7" | |
else: | |
print("Cette case n'existe pas ! Commencez par écrire la lettre (colonne) puis le chiffre (ligne) sans espace et faites attention aux majuscules\n") | |
# Test emplacement + taille | |
if choixTaille in tailles: | |
if joueur == joueur1: | |
ok, ok2 = testPlacementPion(listePionsJ1, choixTaille, plateau, choixLigne, choixColonne, choixLigneAncien, choixColonneAncien, choixAction, couleurJ1, "1")[0], testPlacementPion(listePionsJ1, choixTaille, plateau, choixLigne, choixColonne, choixLigneAncien, choixColonneAncien, choixAction, couleurJ1, "1")[1] | |
elif joueur == joueur2: | |
ok, ok2 = testPlacementPion(listePionsJ2, choixTaille, plateau, choixLigne, choixColonne, choixLigneAncien, choixColonneAncien, choixAction, couleurJ2, "2")[0], testPlacementPion(listePionsJ2, choixTaille, plateau, choixLigne, choixColonne, choixLigneAncien, choixColonneAncien, choixAction, couleurJ2, "2")[1] | |
else: | |
print(Fore.RED + "Erreur : Test emplacement + taille : Condition joueur" + Style.RESET_ALL) | |
exit() | |
else: | |
print("Veuillez renseigner une taille existante : 1, 2 ou 3 !") | |
ok = "position6" | |
ok2 = "position1" | |
# Test condition de victoire | |
for i in range(1, 4): | |
if (plateau[i][1][0][6] == plateau[i][2][0][6] == plateau[i][3][0][6] != "0")\ | |
or (plateau[1][i][0][6] == plateau[2][i][0][6] == plateau[3][i][0][6] != "0")\ | |
or (plateau[1][1][0][6] == plateau[2][2][0][6] == plateau[3][3][0][6] != "0")\ | |
or (plateau[3][1][0][6] == plateau[2][2][0][6] == plateau[1][3][0][6] != "0"): | |
jeu = False | |
gagnant = joueur | |
ok = "positionVictoire" | |
# Test match nul | |
if (listePionsJ1 == listePionsJ2 == [0, 0, 0, 0]) and (reglesDeplacement == "non"): | |
jeu = False | |
ok = "positionNul" | |
# Position 9 : Changement de joueur | |
if ok == "position9": | |
joueur = joueur2 if joueur == joueur1 else joueur1 | |
ok = "position3" | |
# Position End : Erreur dans le code | |
if ok == "positionEnd": | |
print(Fore.RED + "Erreur : position end activée" + Style.RESET_ALL) | |
exit() | |
clearCmd() | |
print(Style.BRIGHT + "************\n* Resultat *\n************\n" + Style.RESET_ALL) | |
afficherPlateau() | |
# Position Victoire : Un joueur a gagné | |
if ok == "positionVictoire": | |
print(f"\nBravo à {Style.BRIGHT + gagnant + Style.RESET_ALL} d'avoir remporté la partie !") | |
# Position Nul : Match nul | |
elif ok == "positionNul": | |
print("Match nul : Il ne reste plus de pions disponible :(") | |
else: | |
print(Fore.RED + "Erreur : position Victoire & Nul" + Style.RESET_ALL) | |
exit() | |
input("\nAppyer sur entrer pour continuer") | |
start, menu = True, True | |
############################################################################################################# |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment