Python projet

Résolu/Fermé
MK - 12 nov. 2022 à 14:46
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 14 nov. 2022 à 13:22

Bonjour, j'ai un projet a en python a faire , faire un tictactoe 4x4 joueur vs joueur et joueur vs ia avec fonction randint() j'ai deja fini le joueur vs joueur mais je n'arrive pas a integrer joueur vs ia dans mon code. 

juste petite precision j'ai fait un menue avec if le joueur tape "joueur vs joueur" il va jouer a la version joueur versus joueur du jeux mais je n'arrive pas a faire la même choses avec joueur vs ia. Merci

voici mon code : 

from operator import truediv
from random import *
#--------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                                                        #menu
le_mec = ""

print("Bienvenue dans ce tic tac toe !")
print("Choisis le mode de jeux : ")
print("joueur vs joueur")
print("joueur vs ia")

le_mec = input("--> ")

if le_mec == "joueur vs joueur":

    # -------------------------------------------------------------------------------------------------------------------------------------------------------------------

    # I) Variable de base de notre jeux

    tictactoe = True  # Notre jeux
    joueurdebase = "X" # Le joueur de base de cette partie sera X
    gagnant = None  # pas encore de gagant
    perdant = None  # pas encore de perdant

    # -------------------------------------------------------------------------------------------------------------------------------------------------------------------

    # II) Création des joueurs

    joueur1 = str(input(" Joueur 1 Quelle est ton nom ? ")) # Nom du joueur 1

    joueur2 = str(input(" Joueur 2 Quelle est ton nom ? ")) # nom du joueur 2

    print("Bienvenue dans ce tic tac toe", joueur1,"et",joueur2) # message de bienvenue

    print(joueur1,": X","|",joueur2,": O") # Attribution des rôles 

    # --------------------------------------------------------------------------------------------------------------------------------------------------------------------

    # III) Creation du tableau 4X4 du tic tac toe

    tableau = ["","","","","","","","","","","","","","","",""] # creation de la liste tableau

    def affichage(tableau): 
        """Creation d'une fonction affichage qui prend en parametre le tableau. Chaque ligne de 4 a partire de la 16eme ligne, on crée une ligne avec des 
        tiret pour separer les lignes avec les cases. """

        print("-------")

        print(tableau[12] + " |"  + tableau[13] + " |" + tableau[14] + " |" + tableau[15])

        print("-------")

        print(tableau[8]  + " |" + tableau[9] + " |" + tableau[10] + " |" + tableau[11])

        print("-------")

        print(tableau[4]  + " |" + tableau[5] + " |" + tableau[6] + " |" + tableau[7])

        print("-------")

        print(tableau[0]  + " |" + tableau[1] + " |" + tableau[2] + " |" + tableau[3])

        print("-------")

        return tableau 

    # ----------------------------------------------------------------------------------------------------------------------------------------------------------------

    # IV) Le fonctionnement du jeux

    # a) Le mouvement du joueur

    def mouvementjoueur(): 
        """ fonction mouvementjoueur qui demande a l'utilisateur un nombre entre 0 et 16 dans le tableau si son nombre est compris entre 0 et 16 il pourra 
        placer son point et si le tableau est deja occuper par un autre point alors il pourra placer son pion sinon un message disant que un piont  est deja placer s'affichera"""

        demander = int(input("Entrez un nombre entre 0 et 16 dans le tableau "))
        if demander >= 0 and demander <= 16 and tableau[demander-1] == "": # Instruction qui nous permet de determiner si une case est occuper ou non et de placer un element dans la case
            tableau[demander-1] = joueurdebase
        else:
            print("Ce territoire est deja conquis veuillez changer !") 
        
    # -----------------------------------------------------------------------------------------------------------------------------------------------------------------

        # b) le Changement de joueur

    def changejoueur(): # Fonction changejoueur qui permet de passer du joueur X au joueur O
        global joueurdebase # Une variable appeller en dehors d'une fonction ne fonctionne pas il faut alors utiliser la fonction global qui permet de generaliser la variable  
        if joueurdebase == "X":
            joueurdebase = "O" 
        else:
            joueurdebase = "X"
        
    # -----------------------------------------------------------------------------------------------------------------------------------------------------------------
                                        # verifier si on a gagner
                        
    def gagnant_horizentale():
        global gagnant
        if tableau[0] == tableau[1] == tableau[2] == tableau[3] and tableau[2] != "":
            gagnant = tableau[0]
            return True
        elif tableau[4] == tableau[5] == tableau[6] == tableau[7] and tableau[6] != "":
            gagnant = tableau[4]
            return True
        elif tableau[7] == tableau[8] == tableau[9] == tableau[10] and tableau[8] != "":
            gagnant = tableau[7]
            return True
    
    def ligne():
        global gagnant
        if tableau[0] == tableau[4] == tableau[8] and tableau[0] != "":
            gagnant = tableau[0]
            return True
        elif tableau[1] == tableau[5] == tableau[9] and tableau[1] != "":
            gagnant = tableau[1]
            return True
        elif tableau[2] == tableau[6] == tableau[10] and tableau[2] != "":
            gagnant = tableau[2]
            return True
    
    def diagonal():
        global gagnant
        if tableau[0] == tableau[5] == tableau[10] and tableau[0] != "":
            gagnant = tableau[0]
            return True
        elif tableau[2] == tableau[5] == tableau[8] and tableau[2] != "":
            gagnant = tableau[2]
            return True
        elif tableau[2] == tableau[6] == tableau[10] and tableau[2] != "":
            gagnant = tableau[2]
            return True
    

    def gagnantconditioon():
        global gagnant
        if gagnant_horizentale():
            print("Le gagnant est ",gagnant,"!")
        elif ligne():
            print("Le gagnant est ",gagnant, "!")
        elif diagonal():
            print("Le gagnant est",gagnant,"!")


    def nulle():
        global tictactoe
        if "" not in tableau:
            affichage(tableau)
            print("Desoler mais il n'y a plus d'issu c'est TIE !")
            tictactoe  = False

    
    def robot():
        while joueurdebase == "O":
            position = randint(1,17)
            if tableau[position] == "":
                tableau[position] = "O"
                changejoueur()


    def robot():
        global position
        while joueurdebase == "O":
            position = randint(1,17)
            if tableau[position] == "":
                tableau[position] = "O"
                changejoueur()
    
    def robot():
        global position
        while joueurdebase == "O":
            position = randint(1,17)
            if tableau[position] == "":
                tableau[position] = "O"
                changejoueur()



while tictactoe:
    affichage(tableau)
    mouvementjoueur()
    changejoueur() 
    gagnant_horizentale()  
    ligne()
    diagonal()
    gagnantconditioon()
    nulle()
    




Macintosh / Chrome 107.0.0.0

6 réponses

Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 12 nov. 2022 à 16:47

Bonjour,

Déjà pas pratique de taper des phrases comme choix dans un menu, moi, je ferais ça:

menu = '''
1	Joueur vs joueur
2	Joueur vs IA
3	Quitter
> '''
le_mec = ''

while(not le_mec in [1,2,3]):
    os.system('cls' if os.name=='nt' else 'clear')
    print('\n' + '''Bienvenu dans le Tic Tac Toe'''.center(50,'*'))
    le_mec = int(input(menu))

if(le_mec == 1):
    etc ...

Il y a juste à taper un chiffre ...

Ensuite, pas top de mettre les fonctions dans un if

En général, on fait:

imports

fonctions

programme principal:

initialisations 

saisies

boucle de jeu

from operator import truediv
from random import *
import os

def affichage(tableau): 
    ''' Creation d'une fonction affichage qui prend en parametre le tableau.
        Chaque ligne de 4 a partire de la 16eme ligne, on crée une ligne avec des 
        tiret pour separer les lignes avec les cases. '''

    print("-------")
    print(tableau[12] + " |"  + tableau[13] + " |" + tableau[14] + " |" + tableau[15])
    print("-------")
    print(tableau[8]  + " |" + tableau[9] + " |" + tableau[10] + " |" + tableau[11])
    print("-------")
    print(tableau[4]  + " |" + tableau[5] + " |" + tableau[6] + " |" + tableau[7])
    print("-------")
    print(tableau[0]  + " |" + tableau[1] + " |" + tableau[2] + " |" + tableau[3])
    print("-------")

    return tableau

def mouvementjoueur(): 
    ''' fonction mouvementjoueur qui demande a l'utilisateur un nombre entre 0 et 16
        dans le tableau si son nombre est compris entre 0 et 16 il pourra 
        placer son point et si le tableau est deja occuper par un autre point alors
        il pourra placer son pion sinon un message disant que un piont  est deja placer s'affichera '''

    demander = int(input("Entrez un nombre entre 0 et 16 dans le tableau "))
    if demander >= 0 and demander <= 16 and tableau[demander-1] == "": # Instruction qui nous permet de determiner si une case est occuper ou non et de placer un element dans la case
        tableau[demander-1] = joueurdebase
    else:
        print("Ce territoire est deja conquis veuillez changer !") 

def changejoueur():
    ''' Fonction changejoueur qui permet de passer du joueur X au joueur O '''

    global joueurdebase # Une variable appeller en dehors d'une fonction ne fonctionne pas il faut alors utiliser la fonction global qui permet de generaliser la variable  

    if joueurdebase == "X":
        joueurdebase = "O" 
    else:
        joueurdebase = "X"

def gagnant_horizontale():
    global gagnant

    if tableau[0] == tableau[1] == tableau[2] == tableau[3] and tableau[2] != "":
        gagnant = tableau[0]

    elif tableau[4] == tableau[5] == tableau[6] == tableau[7] and tableau[6] != "":
        gagnant = tableau[4]

    elif tableau[7] == tableau[8] == tableau[9] == tableau[10] and tableau[8] != "":
        gagnant = tableau[7]
    return True

def ligne():
    global gagnant

    if tableau[0] == tableau[4] == tableau[8] and tableau[0] != "":
        gagnant = tableau[0]
    elif tableau[1] == tableau[5] == tableau[9] and tableau[1] != "":
        gagnant = tableau[1]

    elif tableau[2] == tableau[6] == tableau[10] and tableau[2] != "":
        gagnant = tableau[2]

    return True

def diagonal():
    global gagnant

    if tableau[0] == tableau[5] == tableau[10] and tableau[0] != "":
        gagnant = tableau[0]
    elif tableau[2] == tableau[5] == tableau[8] and tableau[2] != "":
        gagnant = tableau[2]
    elif tableau[2] == tableau[6] == tableau[10] and tableau[2] != "":
        gagnant = tableau[2]

    return True

def gagnantconditioon():
    global gagnant

    if gagnant_horizontale():
        print("Le gagnant est ",gagnant,"!")
    elif ligne():
        print("Le gagnant est ",gagnant, "!")
    elif diagonal():
        print("Le gagnant est",gagnant,"!")

def nulle():
    global tictactoe

    if "" not in tableau:
        affichage(tableau)
        print("Desoler mais il n'y a plus d'issu c'est TIE !")
        tictactoe  = False

def robot():
    while joueurdebase == "O":
        position = randint(1,17)
        if tableau[position] == "":
            tableau[position] = "O"
            changejoueur()

menu = '''
1	Joueur vs joueur
2	Joueur vs IA
3	Quitter
> '''
le_mec = ''

while(not le_mec in [1,2,3]):
    os.system('cls' if os.name=='nt' else 'clear')
    print('\n' + '''Bienvenu dans le Tic Tac Toe'''.center(50,'*'))
    le_mec = int(input(menu))

if(le_mec == 1):
    ''' Joueur contre joueur '''

    tictactoe = True  # Notre jeux
    joueurdebase = "X" # Le joueur de base de cette partie sera X
    gagnant = None  # pas encore de gagant
    perdant = None  # pas encore de perdant
    tableau = ["","","","","","","","","","","","","","","",""]

    joueur1 = str(input(" Joueur 1 Quel est ton nom ? ")) # Nom du joueur 1
    joueur2 = str(input(" Joueur 2 Quel est ton nom ? ")) # nom du joueur 2

    print("Bienvenue dans ce tic tac toe", joueur1,"et",joueur2) # message de bienvenue
    print(joueur1,": X","|",joueur2,": O") # Attribution des rôles 

elif(le_mec == 2):
    '''Joueur contre IA '''

	pass

if(le_mec != 3):
    while tictactoe:
        affichage(tableau)
        mouvementjoueur()
        changejoueur() 
        gagnant_horizontale()  
        ligne()
        diagonal()
        gagnantconditioon()
        nulle()
0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 13 nov. 2022 à 10:08

Après suppression des 'return' inutiles dans les fonctions car les valeurs de retour ne sont pas exploitées:

from operator import truediv
from random import *
import os

def affichage(tableau): 
    ''' Creation d'une fonction affichage qui prend en parametre le tableau.
        Chaque ligne de 4 a partire de la 16eme ligne, on crée une ligne avec des 
        tiret pour separer les lignes avec les cases. '''

    print("-------")
    print(tableau[12] + " |"  + tableau[13] + " |" + tableau[14] + " |" + tableau[15])
    print("-------")
    print(tableau[8]  + " |" + tableau[9] + " |" + tableau[10] + " |" + tableau[11])
    print("-------")
    print(tableau[4]  + " |" + tableau[5] + " |" + tableau[6] + " |" + tableau[7])
    print("-------")
    print(tableau[0]  + " |" + tableau[1] + " |" + tableau[2] + " |" + tableau[3])
    print("-------")

def mouvementjoueur(): 
    ''' fonction mouvementjoueur qui demande a l'utilisateur un nombre entre 0 et 16
        dans le tableau si son nombre est compris entre 0 et 16 il pourra 
        placer son point et si le tableau est deja occuper par un autre point alors
        il pourra placer son pion sinon un message disant que un piont  est deja placer s'affichera '''

    demander = int(input("Entrez un nombre entre 0 et 16 dans le tableau "))
    if demander >= 0 and demander <= 16 and tableau[demander-1] == "": # Détermine si une case est occupée ou non place un élément dans la case
        tableau[demander-1] = joueurdebase
    else:
        print("Ce territoire est deja conquis veuillez changer !") 

def changejoueur():
    ''' Permet de passer du joueur X au joueur O '''

    global joueurdebase

    if joueurdebase == "X":
        joueurdebase = "O" 
    else:
        joueurdebase = "X"

def gagnant_horizontale():
    global gagnant

    if tableau[0] == tableau[1] == tableau[2] == tableau[3] and tableau[2] != "":
        gagnant = tableau[0]
    elif tableau[4] == tableau[5] == tableau[6] == tableau[7] and tableau[6] != "":
        gagnant = tableau[4]
    elif tableau[7] == tableau[8] == tableau[9] == tableau[10] and tableau[8] != "":
        gagnant = tableau[7]

def ligne():
    global gagnant

    if tableau[0] == tableau[4] == tableau[8] and tableau[0] != "":
        gagnant = tableau[0]
    elif tableau[1] == tableau[5] == tableau[9] and tableau[1] != "":
        gagnant = tableau[1]
    elif tableau[2] == tableau[6] == tableau[10] and tableau[2] != "":
        gagnant = tableau[2]

def diagonal():
    global gagnant

    if tableau[0] == tableau[5] == tableau[10] and tableau[0] != "":
        gagnant = tableau[0]
    elif tableau[2] == tableau[5] == tableau[8] and tableau[2] != "":
        gagnant = tableau[2]
    elif tableau[2] == tableau[6] == tableau[10] and tableau[2] != "":
        gagnant = tableau[2]

def gagnantconditioon():
    global gagnant

    if gagnant_horizontale():
        print("Le gagnant est ",gagnant,"!")
    elif ligne():
        print("Le gagnant est ",gagnant, "!")
    elif diagonal():
        print("Le gagnant est",gagnant,"!")

def nulle():
    global tictactoe

    if "" not in tableau:
        affichage(tableau)
        print("Desolé mais il n'y a plus d'issue c'est TIE !")
        tictactoe  = False

def robot():
    while joueurdebase == "O":
        position = randint(1,17)
        if tableau[position] == "":
            tableau[position] = "O"
            changejoueur()

menu = '''
1	Joueur vs joueur
2	Joueur vs IA
3	Quitter
> '''
le_mec = ''

while(not le_mec in [1,2,3]):
    os.system('cls' if os.name=='nt' else 'clear')
    print('\n' + '''Bienvenue dans le Tic Tac Toe'''.center(50,'*'))
    le_mec = int(input(menu))

if(le_mec == 1):
    ''' Joueur vs joueur '''

    tictactoe = True  # Notre jeu
    joueurdebase = "X" # Le joueur de base de cette partie sera X
    gagnant = None  # pas encore de gagnant
    perdant = None  # pas encore de perdant
    tableau = ["","","","","","","","","","","","","","","",""]

    joueur1 = str(input(" Joueur 1 Quel est ton nom ? "))
    joueur2 = str(input(" Joueur 2 Quel est ton nom ? "))

    print("Bienvenue dans ce tic tac toe", joueur1,"et",joueur2)
    print(joueur1,": X","|",joueur2,": O")

elif(le_mec == 2):
    ''' Joueur vs IA '''

	pass

if(le_mec != 3):
    while tictactoe:
        affichage(tableau)
        mouvementjoueur()
        changejoueur() 
        gagnant_horizontale()  
        ligne()
        diagonal()
        gagnantconditioon()
        nulle()
0

Bonjour déjà merci infiniment pour ta réponse ça m'a beaucoup aider, mais quand je met le chiffre 2 dans le menue pour avoir le mode joueur vs IA ça me met une erreur : NameError: name 'tictactoe' is not defined 

cette erreur est revenue Plusieurs fois lors de certaines de mes tentatives pour faire le mode joueur vs IA tout seul je n'ai toujours pas la solution si tu pourrais m'aider ça serais vraiment gentille de ta part .

ensuite je voudrais savoir a quoi sert le mot clés os.system et autre choses mis a la ligne 105 à 106.

Merci

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
Modifié le 13 nov. 2022 à 11:05

Bonjour,

"si tu pouvais m'aider, ce serait vraiment gentil de ta part"   :-)

Normal que tu aies cette erreur car dans le cas où le_mec = 2, je n'ai rien écrit, il ne se passe rien,

c'est à toi d'y mettre ce qu'il faut pour ce cas-là, comme tu l'as fait si le_mec = 1

A toi de jouer ! Toi seul sait ce que tu veux mettre dans cette IA

Pour commencer, à défaut d'IA et pour tester la mécanique, on pourrait faire que l'ordi joue avec un chiffre

tiré au hasard, et affiner ensuite ...

Ensuite, pour ce qui est des lignes 105 à 106:

la méthode os.system() permet d'exécuter une commande système, dans une fenêtre invite de commande,

quand on tape cls, ça efface tout, donc ici, on efface l'écran en passant cette commande à os.system()

Résultat:

Dans cette boucle while, tant qu'on n'a pas tapé 1,2 ou 3, on efface l'écran et on pose la question à nouveau

Si la réponse est bonne, on sort de la boucle et on peut donc exploiter ce qui est dans le_mec

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

Merci beaucoup j'ai réussi en mettant la même condition que si l'utilisateur taper 3 mais pour 2 et j'insérer juste ma fonction robot() vraiment merci infiniment.

0
Phil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 168
14 nov. 2022 à 13:22

Bonjour,

Tu pourrais même mettre l'effacement d'écran os.system('cls' if os.name=='nt' else 'clear')

en fin de fonction mouvementjoueur(), comme ça au lieu d'avoir une suite de grilles au fur et à mesure

du jeu, tu n'aurais qu'une seule grille affichée qui se mettrait à jour après chaque saisie ...

0