IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Soucis au niveau d'une vérification dans un puissance 4


Sujet :

Python

  1. #1
    Candidat au Club Avatar de MinyMiny
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Soucis au niveau d'une vérification dans un puissance 4
    Bonjour,
    alors voilà, je suis actuellement en train de programmer un jeu Puissance 4 (avec l'aide de deux camarades), cependant j'ai un problème récurrent pour mettre en place le niveau 3 du jeu. Voilà le principe :
    Lorsque le joueur place 3 jetons alignés horizontalement, verticalement ou encore diagonalement, (c'est là que les vérifications entrent en jeu) et bien l'ordinateur joue le 4ième jeton au bout afin d'éviter que le joueur gagne. Jusque là rien de très compliqué, seulement j'ai programmé ces vérifs avec des "for i in range ..." et "for j in range ..." du coup quand l'occasion se présente et que deux vérifs sont validés, l'ordinateur joue deux fois, ce qui est problématique... J'ai toutefois essayé de placer un interrupteur qui passe en ON quand 3 jetons sont alignés horizontalement (par exemple) et une fois qu'il est en ON, il empêche les autres vérifs de s'effectuer seulement, quand il valide une fois la vérif horizontalement (par exemple), les 3 jetons du joueur étant toujours alignés, l'interrupteur reste toujours en ON ce qui empêche l'ordinateur de jouer aléatoirement (car quand l'interrupteur est en OFF, l'ordi joue aléatoirement) et ainsi il ne joue pas. En résumé, comment faire pour que mon interrupteur fonctionne une fois pour une vérif puis se désactive ensuite quand il n'y a plus 3 jetons d'alignés pour jouer aléatoirement. J'espère vraiment avoir été assez clair, si ce n'est pas le cas, n'hésitez pas à me poser des questions. J'espère réussir à trouver une solution à ce problème ! Cordialement,
    MinyMiny

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    je pense qu'un bout de code (suffisamment complet pour qu'on puisse tester) sera plus efficace qu'un pavé d'explications sans saut de ligne

  3. #3
    Candidat au Club Avatar de MinyMiny
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    J'ai raccourci mon programme pour que seul le niveau 3 tourne. J'espère que vous comprendrez mon charabia, je suis pas vraiment expert en la matière. ^^ Si quelqu'un peut m'aider en direct par Skype, je veux bien l'ajouter !
    Voici le programme (raccourci) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    import random
     
     
    #-------------------FONCTIONS----------------------
     
     
     
    def joueurIA3() :
        """tant que la partie n'est pas gagnée, permet de faire jouer un joueur puis l'ordi au niveau 3"""
        p = 1
        gagne = False
        while not(gagne):
            ialvl3(p)
            gagne = verif (p)
            p = 3 - p
     
    def afficher_grille():
        """afficher la grille"""
        for ligne in grille:
            print(ligne)
     
    grille = [[0 for j in range(7)] for i in range(6)]
     
     
    def jouer(p):
        """demande au joueur de jouer dans quelle colonne il veut jouer + si coup impossible, fait rejouer le joueur"""
        print ("C'est au joueur",p,"de jouer :")
        j = int(input("Joueur "+str(p)+", dans quelle colonne voulez-vous jouer ? "))
        if j>6 or j <0 :
            print ("Impossible, veuillez choisir une colonne entre 0 et 6 !")
            return jouer(p)
        if grille[0][j]!= 0:
                print ("Impossible, veuillez jouer dans une autre colonne !")
                return jouer(p)
     
        i=0
        while i<6 and grille[i][j] == 0:
            i = i+1
        grille[i-1][j] = p
        return afficher_grille()
     
     
    def verif_hori (p):
        """Vérifie si il y a 4 pièces alignés horizontalement"""
        for i in range (6):
            for j in range (4):
                if grille[i][j]==grille[i][j+1]==grille[i][j+2]==grille[i][j+3]==p:
                    return True
        return False
     
     
    def verif_verti(p):
        """Vérifie si il y a 4 pièces alignés verticalement"""
        for i in range (3):
            for j in range (7):
                if grille[i][j]==p and grille[i+1][j]==p and grille[i+2][j]==p and grille[i+3][j]==p:
                    return True
     
        return False
     
     
     
    def verif_diago (p):
        """Vérifie si il y a 4 pièces alignés diagonalement"""
        for i in range (3):
            for j in range (4):
                if grille[i][j]==grille[i+1][j+1]==grille[i+2][j+2]==grille[i+3][j+3]==p:
                    return True
        for i in range (3):
            for j in range (3,7):
                if grille[i][j]==grille[i+1][j-1]==grille[i+2][j-2]==grille[i+3][j-3]==p:
                    return True
        return False
     
     
     
     
    def verif (p):
        """Si une vérif est OK alors on affiche le joueur qui a gagné"""
        gagne = False
     
        if verif_hori(p)== True :
            print("Le joueur", p,"a gagné !")
            gagne = True
     
     
        elif verif_verti(p)== True :
            print("Le joueur", p,"a gagné !")
            gagne = True
     
     
        elif verif_diago(p)== True :
            print("Le joueur", p,"a gagné !")
            gagne = True
     
        return gagne
     
     
    def choix_adv ():
        """permet de choisir contre qui le joueur veut jouer ainsi que les niveaux de difficulté (contre l'ordinateur)"""
        adv=int(input("Contre qui souhaitez-vous jouer : l'ordinateur ? (tapez 1) un autre joueur ? (tapez 2) "))
        if adv != 1 and adv != 2 :
            print("Veuillez choisir un nombre entre 1 et 2 !")
            choix_adv()
     
        if adv==1:
            ia=int(input("Quel niveau de difficulté voulez-vous ? (1/2/3): "))
            if ia != 1 and ia != 2 and ia != 3 :
                print ("Veuillez choisir un niveau entre 1 et 3 !")
                choix_adv()
            if ia==1 :
                joueurIA1()
            if ia==2 :
                joueurIA2()
            if ia ==3 :
                joueurIA3()
     
        if adv==2:
            return joueur()
     
     
     
    def ialvl3(p):
        global i, j
        """demande au joueur de jouer + fait jouer l'ordinateur (niveau 3)"""
     
        if p == 1 :
            print ("C'est à vous de jouer :")
            j = int(input("Dans quelle colonne voulez-jouer ?"))
            if j>6 :
                print ("impossible, veuillez rejouer !")
                return ialvl3(p)
            i=0
     
            while i<6 and grille[i][j] == 0:
                i = i+1
            grille[i-1][j] = p
            return afficher_grille()
     
        else:
            print("L'ordinateur joue :")
     
            i = 0
            Ajoue = False
     
    #VERIF HORIZONTALE 
            for i in range (5,6):
                for j in range (5):
                    if grille[i][j]==grille[i][j+1]==1 and not(Ajoue):
                         if grille[i][j+2]==2:
                            grille[i][j-1]=p
                            Ajoue = True
                         else :
                            grille[i][j+2]=p
                            Ajoue = True
     
     
            for i in range (6):
                for j in range (5):
                   if grille[i][j]==grille[i][j+1]==1 and not(Ajoue) :
                       if grille[i][j+2]==2 and i+1<6 and grille[i+1][j-1]!=0:
                           grille[i][j-1]=p
                           Ajoue = True
                       elif i+1<6 and grille[i+1][j+2]!=0:
                           grille[i][j+2]=p
                           Ajoue = True
     
    #VERIF VERTICALE
            for i in range (4):
                for j in range(7):
                   if grille[i][j]==grille[i+1][j]==grille[i+2][j]==1 and not(Ajoue):
                       grille[i-1][j]=p
                       Ajoue = True
     
    #VERIF DIAGONALE
            for i in range (3):
                for j in range (4):
                    if grille[i][j]==grille[i+1][j+1]==grille[i+2][j+2]==p and not(Ajoue) :
                        grille[i+3][j+3]==p
                        Ajoue = True
     
            for i in range (3):
                for j in range (3,7):
                    if grille[i][j]==grille[i+1][j-1]==grille[i+2][j-2]==p and not(Ajoue):
                        grille[i+3][j-3]==p
                        Ajoue = True
     
     
     
            if not(Ajoue):
                j = random.randint(0,6)
     
     
                while i<6 and grille[i][j] == 0:
                    i = i+1
                grille[i-1][j] = p
            return afficher_grille()
     
     
     
    #-------------------CORPS DU PROGRAMME----------------------
     
    choix_adv()

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    c'est la cata ton code je serai toi je le referai quasi entièrement parcequ'en faisant comme tu fais actuellement tu vas jamais t'en sortir

    les points qui me semblent essentiels :

    • éviter comme la peste les tournures récursives du genre :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      def toto():
        if not ok:
          toto()
      à chaque appel on grignote la pile, c'est mal. à la place il suffit d'une tournure à base de while :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      reponse = ''
      while reponse not in ['y', 'n']:
         reponse = raw_input('rejouer ? (y/n) : ')
      if reponse == 'y':
         on rejoue
      else:
         on quitte
    • éviter les global, à la place on transmet des paramètres aux fonctions, ça doit participer de la cohérence de l'ensemble

      par exemple une fonction coupValide() aurait pour but de vérifier si le coup du joueur (ou de l'ordi) est valide ou non, le cas échéant elle renverrait soit True soit False ("oui le coup est valide" ou "non le coup n'est pas valide") et prendrait un unique paramètre colonne (puisque quand on joue, on choisit uniquement la colonne dans laquelle on veut jouer), tout ça prend du sens au premier coup d'oeil sur le code

    • enfin tu ne peux pas te permettre de faire 1 fonction pour chaque coup joué, le but est d'avoir 1 fonction et une seule pour permettre à l'IA de jouer tous les coups, c'est clairement le plus gros souci de ton code vu d'ici

  5. #5
    Candidat au Club Avatar de MinyMiny
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2016
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci pour ces conseils, je vais tenter de corriger ça. Mais auriez-vous un début de solution à mon problème ?

  6. #6
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par MinyMiny Voir le message
    Merci pour ces conseils, je vais tenter de corriger ça. Mais auriez-vous un début de solution à mon problème ?
    comme expliqué, ton problème n'existe que dans un contexte particulier; celui d'un programme mal construit où tu cherches à vérifier des cas particuliers de coups gagnants au bout de X coups joués (en l'occurrence 5 ou 6 tours pour ialvl3 donc), avec un code mieux construit tu n'aurais pas ce problème spécifique (à la place tu aurais un problème plus complexe mais qui une fois résolu fonctionne dans toutes les situations)

    en revanche si la question porte uniquement sur comment sortir de deux boucles for imbriquées je te renvoie vers n'importe quel bon tutoriel, et notamment sur le mot-clé break :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    for y:
       for x:
          if machin:
             break
       if machin:
          break

Discussions similaires

  1. Souci d'affichage d'une requête dans une table
    Par natalie75 dans le forum Bases de données
    Réponses: 3
    Dernier message: 11/04/2015, 17h26
  2. Réponses: 15
    Dernier message: 31/03/2009, 22h22
  3. Souci avec une variable dans une requete
    Par polianita dans le forum Requêtes et SQL.
    Réponses: 15
    Dernier message: 21/06/2006, 17h05
  4. [VB] soucis au niveau de la conception d'une dll activeX
    Par Viorika dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 16/06/2006, 11h35
  5. [MySQL] Soucis avec une insertion dans une base
    Par Ludo75 dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 27/01/2006, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo