Aide programme

Sh3perd Messages postés 74 Date d'inscription   Statut Membre Dernière intervention   -  
jee pee Messages postés 41517 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
Alors je suis en terminale et j'ai un code à rendre pour lundi, et il est quasiment terminé mais un problème me gène.
Je dois coder le 'flood it!' un jeu que vous connaissez sûrement. Alors en réalité il ne me manque que le principe du jeu c'est à dire la répartition des couleurs sur la grille en fonction de la couleur choisie. Le problème vient de ma fonction jeu(grillejeu) qui ne fonctionne que sur les couleurs en périphéries dans un petit rayon. Et moi, ce qu'il me faut, c'est que toutes les couleurs adjacentes à celle en haut à gauche changent en fonction du choix utilisateur. Le principe du flood it, en gros.
Je vous met mon code à disposition et j'espère que vous pourrez m'aider.
Je vous remercie par avance !!!!
import random
import sys

def grille(x):
    x=int(x)
    grillejeu=[]
    grille2=[]
    if x==2:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>2:
                del grille2[-1]
    if x==6:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>6:
                del grille2[-1]
    if x==10:
        while len(grille2)!=10:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>10:
                del grille2[-1]
    if x==14:
        while len(grille2)!=14:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>14:
                del grille2[-1]
    if x==18:
        while len(grille2)!=18:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>18:
                del grille2[-1]
    if x==22:
        while len(grille2)!=22:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>22:
                del grille2[-1]
    if x==26:
        while len(grille2)!=26:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>26:
                del grille2[-1]
    for i in range(x):
        grillejeu.append([])
    for n in range(len(grillejeu)):
        for p in grille2:
            random.shuffle(grille2)
            grillejeu[n].append(p)

    for k in range(len(grillejeu)):
        print(grillejeu[k])
    jeu(grillejeu)
    for k in range(len(grillejeu)):
        print(grillejeu[k])
    print('test')

def jeu(grillejeu):
    grille=['r','j','b','v','o']
    print('jeu')
    p=input("Choisissez une couleur : ")
    while p not in grille:
        p=input("Veuillez choisir entre r, j, b, v ou o : ")
    if p=='v':
        possibilite(grillejeu,p)
        if grillejeu[0][1]==grillejeu[0][0]:
            grillejeu[0][1]='v'
            
        if grillejeu[1][0]==grillejeu[0][0]:
            grillejeu[1][0]='v'
        if grillejeu[1][1]==grillejeu[0][0]:
            grillejeu[1][1]='v'
        grillejeu[0][0]='v'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)
    if p=='r':
        possibilite(grillejeu,p)
        if grillejeu[0][1]==grillejeu[0][0]:
            grillejeu[0][1]='r'
        if grillejeu[1][0]==grillejeu[0][0]:
            grillejeu[1][0]='r'
        if grillejeu[1][1]==grillejeu[0][0]:
            grillejeu[1][1]='r'
        grillejeu[0][0]='r'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)
    if p=='b':
        possibilite(grillejeu,p)
        if grillejeu[0][1]==grillejeu[0][0]:
            grillejeu[0][1]='b'
        if grillejeu[1][0]==grillejeu[0][0]:
            grillejeu[1][0]='b'
        if grillejeu[1][1]==grillejeu[0][0]:
            grillejeu[1][1]='b'
        grillejeu[0][0]='b'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)
    if p=='j':
        possibilite(grillejeu,p)
        if grillejeu[0][1]==grillejeu[0][0]:
            grillejeu[0][1]='j'
        if grillejeu[1][0]==grillejeu[0][0]:
            grillejeu[1][0]='j'
        if grillejeu[1][1]==grillejeu[0][0]:
            grillejeu[1][1]='j'
        grillejeu[0][0]='j'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)
    if p=='o':
        possibilite(grillejeu,p)
        if grillejeu[0][1]==grillejeu[0][0]:
            grillejeu[0][1]='o'
        if grillejeu[1][0]==grillejeu[0][0]:
            grillejeu[1][0]='o'
        if grillejeu[1][1]==grillejeu[0][0]:
            grillejeu[1][1]='o'
        grillejeu[0][0]='o'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)

def interface(x):
    return x    
            
def possibilite(grillejeu,p):
    liste_r=[]
    liste.append(1)
    for index in grillejeu[0]:
        liste_r.append(index)
    try:
        if liste_r[0]==liste_r[1]==liste_r[2]==liste_r[3]==liste_r[4]==liste_r[5]==liste_r[6]==liste_r[7]==liste_r[8]==liste_r[9]==liste_r[10]==liste_r[11]==liste_r[12]==liste_r[13]==liste_r[14]==liste_r[15]==liste_r[16]==liste_r[17]==liste_r[18]==liste_r[19]==liste_r[20]==liste_r[21]:
            print('\n*****FIN DU JEU*****\n')
            print('Vous avez terminé le jeu en',sum(liste)/2,'coups')
            sys.exit()
    except IndexError:
        print('\n*****FIN DU JEU*****\n')
        x=sum(liste)/2
        x=int(x)
        print('Vous avez terminé le jeu en',x,'coups')
        sys.exit()
            
        

    
        
        
if __name__=='__main__':
    liste=[]
    print('\n\t   **************************************************')
    print('\t   **************************************************')
    print('\n\t->\t************   FLOOD IT!   *************         <-\n')
    print('\t   **************************************************')
    print('\t   **************************************************')
    print('\n   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   \n')
    print('\n\t    De quelle dimension souhaitez vous votre grille ? ')
    q='''
            2x2                                       : 2
            6x6                                       : 6
            10x10                                     : 10
            14x14                                     : 14
            18x18                                     : 18
            22x22                                     : 22
            26x26                                     : 26
    
    '''
    print(q)
    x=interface(input('-------> '))
    grille(x)
    print('')
    grille(x)



Configuration: Windows / Chrome 88.0.4324.190

4 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
beaucoup de lignes de code pour ne pas faire grand chose!
en réalité il te manque presque tout, je ne vois pas grand chose d'utile dans ton code.
je suggère que tu fasses ceci:
réfléchir à ce que le programme doit faire, et nous expliquer cela.
0
Sh3perd Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
Ah mais très clairement, ducoup je me suis concentré sur l'interface utilisateur, l'esthétique.....
Mais je ne sais pas sinon je n'aurai pas posé de questions ici...
L'objectif est lorsqu'une couleur est rentrée, exemple : v (vert) toute les couleurs adjacentes à la première couleur en haut à gauche , changent pour vert dans la mesure où elles sont identiques à la case d'en haut à gauche . Exemple si la grille est telle :

v v v j b r
v v r o b b
v b r o j j

Si j'entre 'r' pour rouge, alors tout les v adjacents changent pour r. Mais je n'y parvient pas c'est pour ça que mon dernier recours est ici.
En espérant d'avoir été plus clair.
Merci.
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Sh3perd Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
le moment est venu de te concentrer sur le plus important et le plus difficile.
c'est bien la spécialité que tu as choisie?

montre nous la situation avant/après.

réfléchis à comment tu ferais, à la main, pour changer les couleurs.

comment vas-tu apprendre et progresser, en faisant chaque fois appel à d'autres?
0
jee pee Messages postés 41517 Date d'inscription   Statut Modérateur Dernière intervention   9 717
 
Bonjour,

Tu en es où de ta stratégie pour solutionner le problème ?

En lisant la question je me suis laissé tenté à essayer d'y répondre. Ne connaissant pas ce jeu, je n'ai trouvé que des versions online plus opérationnelles puisqu'utilisant Adobe Flash Player disparu il y a un mois. Il y avait au moins les règles.

J'ai imaginé, avant de me lancer dans le code, plusieurs solutions, traiter les lignes une par une, traiter en démarrant par les 4 coins, ... mais le soucis c'est comment traiter une suite de cases en escargot, ici le o :

 o r v j j j b j j j j b b r j r r 
o v j r b j v b v v b b v v b j j
o b o o o o o o o o o o o o o o o
o v o v v j r b j r b v r b r r o
o j o r o o o o o o o o o o o b o
o j o v o r v v b r v b j j o v o
o r o v o v o o o o o o o v o b o
o r o j o j o j v v r b o b o v o
o r o r o j o b o o o r o r o r o
o b o r o j o j r j o b o r o b o
o b o v o b o o o o o v o j o v o
o j o b o r b r j b r j o r o j o
o b o b o o o o o o o o o b o b o
o r o j v b v v v j b v j r o j o
o r o o o o o o o o o o o o o v o
o r j b j j j j b b b j j v b j o
o o o o o o o o o o o o o o o o o


J'ai une solution qui me plait bien, mais sur un grand tableau le temps d'exécution est asymptotique sur l'infini. Il faut que je debug pour trouver pourquoi.

J'ai une remarque de fond sur le code que tu as posté, remplir le tableau et l'afficher cela reste indispensable, autant commencer par ça. Mais tu n'utilises pas la puissance du code informatique pour le faire, tu dupliques les lignes à l'infini pour traiter les tableaux suivant leur taille, et tu traites les couleurs une par une à la main suivant la réponse de l'utilisateur.

Remplir et afficher le tableau devrait prendre 10/15 lignes, il t'en faut une centaine.
Une boucle sur la taille du tableau pour le remplir, une boucle sur la taille du tableau pour l'afficher. Traiter une variable avec la réponse de l'utilisateur pour la nouvelle couleur à comparer avec la couleur en grille[0][0].

Un code informatique est terminé quand on ne peut plus enlever de lignes, pas quand on ne peut plus en ajouter ;-)

A te lire.

0
Sh3perd Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
Oui j'y pense, mais j'ai du mal, je suis justement en train d'étudier la question pour l'instant sans succès...
0
Sh3perd Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
J'ai récupéré une fonction qui me permet de parer à mon problème, mais je ne parviens pas totalement à l'implémenter, j'ai généré une grille plus informatiquement parlant mais moins esthétique (car print au lieu d'un return) , pouvez vous m'aider ? le code :
import random
import sys

def grille(x):
    x=int(x)
    grillejeu=[]
    grille2=[]
    if x==2:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>2:
                del grille2[-1]
    if x==6:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>6:
                del grille2[-1]
    if x==10:
        while len(grille2)!=10:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>10:
                del grille2[-1]
    if x==14:
        while len(grille2)!=14:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>14:
                del grille2[-1]
    if x==18:
        while len(grille2)!=18:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>18:
                del grille2[-1]
    if x==22:
        while len(grille2)!=22:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>22:
                del grille2[-1]
    if x==26:
        while len(grille2)!=26:
#        grille2=['r','j','b','v','o','r','j','b','v','o']
            grille2.append('r')
            grille2.append('j')
            grille2.append('b')
            grille2.append('v')
            grille2.append('o')
            while len(grille2)>26:
                del grille2[-1]
    for i in range(x):
        grillejeu.append([])
    for n in range(len(grillejeu)):
        for p in grille2:
            random.shuffle(grille2)
            grillejeu[n].append(p)
    listevrai=[]
    for k in range(len(grillejeu)):
        listevrai.append(grillejeu[k])
    print(listevrai)
    jeu(grillejeu)
    for k in range(len(grillejeu)):
        print(grillejeu[k])
    print('test')

def jeu(grillejeu):
    grille=['r','j','b','v','o']
    print('jeu')
    p=input("Choisissez une couleur : ")
    while p not in grille:
        p=input("Veuillez choisir entre r, j, b, v ou o : ")
    if p=='v':
        possibilite(grillejeu,p)
        floodfill(grille,0,0)
#        if grillejeu[0][1]==grillejeu[0][0]:
#            grillejeu[0][1]='v'
#            
#        if grillejeu[1][0]==grillejeu[0][0]:
#            grillejeu[1][0]='v'
#        if grillejeu[1][1]==grillejeu[0][0]:
#            grillejeu[1][1]='v'
#        grillejeu[0][0]='v'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)
    if p=='r':
        possibilite(grillejeu,p)
        if grillejeu[0][1]==grillejeu[0][0]:
            grillejeu[0][1]='r'
        if grillejeu[1][0]==grillejeu[0][0]:
            grillejeu[1][0]='r'
        if grillejeu[1][1]==grillejeu[0][0]:
            grillejeu[1][1]='r'
        grillejeu[0][0]='r'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)
    if p=='b':
        possibilite(grillejeu,p)
        if grillejeu[0][1]==grillejeu[0][0]:
            grillejeu[0][1]='b'
        if grillejeu[1][0]==grillejeu[0][0]:
            grillejeu[1][0]='b'
        if grillejeu[1][1]==grillejeu[0][0]:
            grillejeu[1][1]='b'
        grillejeu[0][0]='b'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)
    if p=='j':
        possibilite(grillejeu,p)
        if grillejeu[0][1]==grillejeu[0][0]:
            grillejeu[0][1]='j'
        if grillejeu[1][0]==grillejeu[0][0]:
            grillejeu[1][0]='j'
        if grillejeu[1][1]==grillejeu[0][0]:
            grillejeu[1][1]='j'
        grillejeu[0][0]='j'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)
    if p=='o':
        possibilite(grillejeu,p)
        if grillejeu[0][1]==grillejeu[0][0]:
            grillejeu[0][1]='o'
        if grillejeu[1][0]==grillejeu[0][0]:
            grillejeu[1][0]='o'
        if grillejeu[1][1]==grillejeu[0][0]:
            grillejeu[1][1]='o'
        grillejeu[0][0]='o'
        for k in range(len(grillejeu)):
            print(grillejeu[k])
        possibilite(grillejeu,p)
        return jeu(grillejeu)
    
def interface(x):
    return x
            
def possibilite(grillejeu,p):
    liste_r=[]
    liste.append(1)
    for index in grillejeu[0]:
        liste_r.append(index)
    try:
        if liste_r[0]==liste_r[1]==liste_r[2]==liste_r[3]==liste_r[4]==liste_r[5]==liste_r[6]==liste_r[7]==liste_r[8]==liste_r[9]==liste_r[10]==liste_r[11]==liste_r[12]==liste_r[13]==liste_r[14]==liste_r[15]==liste_r[16]==liste_r[17]==liste_r[18]==liste_r[19]==liste_r[20]==liste_r[21]:
            print('\n*****FIN DU JEU*****\n')
            print('Vous avez terminé le jeu en',sum(liste)/2,'coups')
            sys.exit()
    except IndexError:
        print('\n*****FIN DU JEU*****\n')
        x=sum(liste)/2
        x=int(x)
        print('Vous avez terminé le jeu en',x,'coups')
        sys.exit()
            
        

    
def floodfill(grille, x, y):
    #"hidden" stop clause - not reinvoking for "c" or "b", only for "a".
    if grille[x][y] == 'r':  
        grille[x][y] = 'v' 
        #recursively invoke flood fill on all surrounding cells:
        if x > 0:
            floodfill(grille,x-1,y)
        if x < len(grille[y]) - 1:
            floodfill(grille,x+1,y)
        if y > 0:
            floodfill(grille,x,y-1)
        if y < len(grille) - 1:
            floodfill(grille,x,y+1)
if __name__=='__main__':
    liste=[]
    print('\n\t   **************************************************')
    print('\t   **************************************************')
    print('\n\t->\t************   FLOOD IT!   *************         <-\n')
    print('\t   **************************************************')
    print('\t   **************************************************')
    print('\n   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~   \n')
    print('\n\t    De quelle dimension souhaitez vous votre grille ? ')
    q='''
            2x2                                       : 2
            6x6                                       : 6
            10x10                                     : 10
            14x14                                     : 14
            18x18                                     : 18
            22x22                                     : 22
            26x26                                     : 26
    
    '''
    print(q)
    x=interface(input('-------> '))
    grille(x)
    print('')
    grille(x)
0
Sh3perd Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
jai l'erreur : TypeError: 'str' object does not support item assignment
pourtant quand je test la fonction dans un programme vierge, cela fonctionne..
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Sh3perd Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
excellente idée d'utiliser ainsi une fonction récursive!
peux-tu, cependant, préciser "python" quand tu utilises les balises de code?
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > Sh3perd Messages postés 74 Date d'inscription   Statut Membre Dernière intervention  
 
à quelle ligne de code as-tu l'erreur?
0
jee pee Messages postés 41517 Date d'inscription   Statut Modérateur Dernière intervention   9 717
 
le floodfill() c'est une bonne idée, mais attention, il faudrait mémoriser les positions déjà traitées car si tu passes de (0,0) à (0,1), tu vas revenir avec y-1 à (0,0)

Après il faudrait que globalement tu changes ton programme pour ne pas traiter "à la main" les couleurs une par une.

Si dans p tu as la prochaine couleur, tu devrais récupérer par exemple dans a l'ancienne couleur de position (0,0) et après tu ne traites que 2 variables p et a, sans te soucier de leur contenu.

0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
je pense qu'il n'est pas nécessaire de mémoriser les positions traitées, elles ne risquent pas de s'étendre, puisqu'on en change la couleur.
on peut également utiliser une liste de cases à traiter, plutôt qu'une récurrence.
0
jee pee Messages postés 41517 Date d'inscription   Statut Modérateur Dernière intervention   9 717 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
dans ce que j'ai imaginé, j'ai les positions traitées, afin de ne pas revenir en arrière, car en (0,1) il ne sert à rien de revenir à (0,0) et ses subséquents, et je traite effectivement, les positions futures à traiter, pour avancer pas à pas (mon escargot)

j'ai trouvé un site online du jeu : https://unixpapa.com/floodit/?sz=6&nc=4

il faut que je révise mon programme car à partir d'une position, je traitais les 8 cases autour, avec les positions en diagonale, alors qu'il semble que l'on ne traite que les 4 cases touchantes sur les cotés.

le site est un bon exemple de ce que l'on pourrait développer en solution graphique, une fois la solution trouvée en mode caractère
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > jee pee Messages postés 41517 Date d'inscription   Statut Modérateur Dernière intervention  
 
floodfill est bien écrit et avorte immédiatement tout retour en arrière.
0
jee pee Messages postés 41517 Date d'inscription   Statut Modérateur Dernière intervention   9 717
 
Alors, où en es-tu dans ton code ?

J'ai repris ta fonction floodfill dans le mien, cela marche impec, et c'est simple.
0