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 :

recursivité python et grille pour démineurs


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Août 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 11
    Par défaut recursivité python et grille pour démineurs
    Bonjour tout le monde j'aurai besoin d'aide sur mon programme.
    En effet je n'arrive pas à mettre en place la récursivité sur ma fonction traitement_affiche(grille,clic_grille,x,y,n)

    type grille: liste
    type clic_grille: liste
    type x: int
    type y : int
    type n: int
    arg grille: ma grille de demineur avec l'emplacement des bombes et les chiffre
    arg clic_grille: montrent les zones decouverte '*' pour cacher et '/' pour montrer
    arg x: coordonées x de la grille que le joueur joue
    arg y: coordonées y de la grille que le joueur joue
    arg n: longueur de la grille (carré)

    les bombes sont codées par 'b' dans la liste grille.

    et voila mon code :
    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
     
    from tkinter import *
    from random import choice,randint
     
    def crea_tableaux(n):
        grille=[]
        for i in range(n):
            deux=[]
            for i in range(n):
                deux.append(0)
            grille.append(deux)
        return grille
     
    def vu_grille(n):
        grille=[]
        for i in range(n):
            deux=[]
            for i in range(n):
                deux.append('*')
            grille.append(deux)
        return grille
     
    def case_vide(grille):
        liste=[]
        n=len(grille)
        for i in range(n):
            for j in range(n):
                if grille[i][j]!='b':
                    liste.append([i,j])
        return liste
     
     
    def place_bombe(grille,nb):
        for i in range(nb):
            x,y=choice(case_vide(grille))
            grille[x][y]='b'
        return grille
    def affiche(grille,clic_grille,n):
        for i in range(n):
            for j in range(n):
                if clic_grille[i][j]!='*':
                    print(grille[i][j],end='  ')
                else:
                    print('*',end='  ')
            print()
     
    def init(n,nb_bombe):
        global grille
        grille=crea_tableaux(n)
        grille=place_bombe(grille,nb_bombe)
        clic_grille=vu_grille(n)
        #affiche(grille,clic_grille,n)
        while True:
            x,y=input_r()
            if grille[x][y]=='b':
                print('vous avez perdu')
                break
            else:
                clic_grille=traitement_affiche(grille,clic_grille,x,y,n)
                #affiche(grille,clic_grille,n)
     
     
    def traitement_affiche(grille,clic_grille,x,y,n):
        print(n)
        if x in range(n) and y in range(n):
            print(grille[x][y])
            if grille[x][y]!=0:
                print('in')
                clic_grille[x][y]='/'
                return clic_grille
     
            elif grille[x][y]==0:
     
                print('out')
                clic_grille[x][y]='/'         
                clic_grille=traitement_affiche(grille,clic_grille,x-1,y-1,n)
                clic_grille=traitement_affiche(grille,clic_grille,x-1,y,n)
                clic_grille=traitement_affiche(grille,clic_grille,x+1,y-1,n)
                clic_grille=traitement_affiche(grille,clic_grille,x+1,y,n)
                clic_grille=traitement_affiche(grille,clic_grille,x,y-1,n)
                clic_grille=traitement_affiche(grille,clic_grille,x-1,y+1,n)
                clic_grille=traitement_affiche(grille,clic_grille,x,y+1,n)
                clic_grille=traitement_affiche(grille,clic_grille,x+1,y+1,n)
                return clic_grille
        return clic_grille    
    def input_r():
        entry=input('spécifiez les coordonées x et y séparées d'+"'"+'un espace\n').split()
        try :
            entry[0],entry[1]=int(entry[0]),int(entry[1])
        except ValueError:return input_r()
        return entry
     
     
    def bombe_proxi(grille,x,y,n):
        if grille[x][y]!='b':
            if x>0 and y>0:
                if grille[x-1][y-1]=='b':
                    grille[x][y]+=1
                if grille[x-1][y]=='b':
                    grille[x][y]+=1
            if x<n and y>0:   
                if grille[x+1][y-1]=='b':
                    grille[x][y]+=1
            if x<n:
                if grille[x+1][y]=='b':
                    grille[x][y]+=1
            if y>0:
                if grille[x][y-1]=='b':
                    grille[x][y]+=1
            if x>0 and y<n:
                if grille[x-1][y+1]=='b':
                    grille[x][y]+=1
            if y<n:
                if grille[x][y+1]=='b':
                    grille[x][y]+=1
     
            if x<n and y<n:
                if grille[x+1][y+1]=='b':
                    grille[x][y]+=1
        return grille
     
    def test_bombe(grille):
        n=len(grille)
        print(n)
        for i in range(n):
            for j in range(n):
                grille=bombe_proxi(grille,i,j,n-1)
        return grille
    et si vous avez des question n'hésitez je sais que je ne suis pas toujours claire dans mes explication, en vous remerciant

  2. #2
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Pour placer tes mines sans refaire la liste des cases vide, utilise un set.
    ex.:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def set_mines():
        # nx et ny = largeur et hauter du plateau
        mined = set([])
        while len(mined) < nombre_mines:
            x = random.randrange(nx)
            y = random.randrange(ny)
            mined.add((x, y))
        return mined
    Pour l"expansion" des cases vides voisines de celle choisie par l'utilisateur, utilise une pile.
    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
     
    stack = []
     
    def on_click(x, y):
        global grille, stack
        value = grille[y][x]
        if value == 'b':
            game_over()
     
        elif not value:
            # ici on ajoute dans la pile la case si elle est vide
            stack.append((y, x))
     
        afficher_contenu_case(y, x) 
        check_stack()
     
    def check_stack():
        global grille, stack
        # offsets = Nord-Ouest, Nord, Nord-Est, Ouest, Est, Sud-Ouest, Sud-Est
        offsets = ((-1, -1), (-1, 0), (-1, 1),
                   (0, -1), (0, 1),
                   (1, -1), (1, 0), (1, 1))
     
        # Tant que la pile n'est pas vide
        while stack:
            coor = stack.pop(0)
            for of in offsets:
                y, x = coor[0] + of[0], coor[1] + of[1]
     
                if not grille[y][x]:
                    # case voisine vide: on l'affiche et on l'ajoute à la pile
                    afficher_contenu_case(y, x)
                    stack.append((y, x))

  3. #3
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Août 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 11
    Par défaut
    Citation Envoyé par VinsS Voir le message
    Salut,

    Pour placer tes mines sans refaire la liste des cases vide, utilise un set.
    ex.:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    def set_mines():
        # nx et ny = largeur et hauter du plateau
        mined = set([])
        while len(mined) < nombre_mines:
            x = random.randrange(nx)
            y = random.randrange(ny)
            mined.add((x, y))
        return mined

    Mais ne risque t'on pas d'avoir deux fois les même coordonées avec randrange ?


    Pour l"expansion" des cases vides voisines de celle choisie par l'utilisateur, utilise une pile.

    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
     
    stack = []
     
    def on_click(x, y):
        global grille, stack
        value = grille[y][x]
        if value == 'b':
            game_over()
     
        elif not value:
            # ici on ajoute dans la pile la case si elle est vide
            stack.append((y, x))
     
        afficher_contenu_case(y, x) 
        check_stack()
     
    def check_stack():
        global grille, stack
        # offsets = Nord-Ouest, Nord, Nord-Est, Ouest, Est, Sud-Ouest, Sud-Est
        offsets = ((-1, -1), (-1, 0), (-1, 1),
                   (0, -1), (0, 1),
                   (1, -1), (1, 0), (1, 1))
     
        # Tant que la pile n'est pas vide
        while stack:
            coor = stack.pop(0)
            for of in offsets:
                y, x = coor[0] + of[0], coor[1] + of[1]
     
                if not grille[y][x]:
                    # case voisine vide: on l'affiche et on l'ajoute à la pile
                    afficher_contenu_case(y, x)
                    stack.append((y, x))
    je n'ai pas encore vu les pile mais je comprend un peu prés...
    on fait une pile d'execution qui s'execute tant que la pile 'stack' n'est pas vide or on rajoute des coordonnées dans la pile à chaque fois que l'on trouve une case vide ais-je raison ?

  4. #4
    Membre éclairé
    Homme Profil pro
    Cocher moderne
    Inscrit en
    Septembre 2006
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Oman

    Informations professionnelles :
    Activité : Cocher moderne

    Informations forums :
    Inscription : Septembre 2006
    Messages : 50
    Par défaut
    Citation Envoyé par marien50470 Voir le message
    Mais ne risque t'on pas d'avoir deux fois les même coordonées avec randrange ?
    Non !
    => https://docs.python.org/3/tutorial/datastructures.html, chapitre 5.4

  5. #5
    Membre averti
    Homme Profil pro
    etudiant
    Inscrit en
    Août 2016
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : etudiant

    Informations forums :
    Inscription : Août 2016
    Messages : 11
    Par défaut
    Citation Envoyé par LandReagan Voir le message
    au fait salut et merci !!! ^^

    mais ce que tu me donne c'est pour pop() qui agit sur les liste et ca je les vu en faisant quelque test

    ma question portée sur randrange(n) dans la fonction set_mines() que tu m'a donné. Normalent avec randrange(n) on tire un nombre au hasard de 0 a n et donc on pourrait tiré deux fois les même coordonés ?

  6. #6
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut,

    Oui, randrange peut évidemment retourner les mêmes valeurs, donc des doublons, mais ce qui garanti l'unicité dans le script de VinsS est le set dans lequel ces coordonnées sont ajoutées, un set ne peut contenir de doublons.

Discussions similaires

  1. Création d'une Grille pour création d'un Schema
    Par ben_ghost dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 15/10/2007, 16h08
  2. quelle table/grille pour beaucoup de données
    Par biozaxx dans le forum AWT/Swing
    Réponses: 12
    Dernier message: 11/10/2007, 22h13
  3. Python ou Ruby pour débuter ?
    Par TallyHo dans le forum Débuter
    Réponses: 17
    Dernier message: 02/08/2007, 22h32
  4. Utiliser Python et PostGresql pour créer un site Web
    Par rvweb dans le forum Réseau/Web
    Réponses: 8
    Dernier message: 22/10/2006, 20h03
  5. Réponses: 5
    Dernier message: 20/07/2006, 01h17

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