Disparition blocs jeu de 2048 python
RésoluPhil_1857 Messages postés 1872 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je suis en train de coder un jeu de 2048 en python, j'ai fini mon code sauf que quand je l’exécute, tout se passe bien jusqu'à que certains blocs disparaissent quand j'effectue un déplacement. Je ne comprends pas d'ou vient le problème, merci d'avance
Voici mon code :
from tkinter import * from random import * import copy def droite(event): global temp,grille temp = copy.deepcopy(grille) for i in range(4): for j in range(-1,-5,-1): if grille[i][j] == 0: pass else: non_vide = grille[i][j] for k in range(j+5,4): if grille[i][k] == 0: grille[i][k] = non_vide grille[i][k-1] = 0 widgets[str(i)+str(k)].config(text=non_vide,bg=couleurs[str(non_vide)],font=('Times New Roman',9)) widgets[str(i)+str(k-1)].config(text='',bg='white') elif grille[i][k] == non_vide: grille[i][k] = non_vide*2 grille[i][k-1] = 0 widgets[str(i)+str(k)].config(text=non_vide*2,bg=couleurs[str(non_vide*2)],font=('Times New Roman',9)) widgets[str(i)+str(k-1)].config(text='',bg='white') if temp != grille: generator() def gauche(event): global temp,grille temp = copy.deepcopy(grille) for i in range(4): for j in range(4): if grille[i][j] == 0: pass else: non_vide = grille[i][j] for k in range(j-5,-5,-1): if grille[i][k] == 0: grille[i][k+4] = non_vide grille[i][k+5] = 0 widgets[str(i)+str(k+4)].config(text=str(non_vide),bg=couleurs[str(non_vide)],font=('Times New Roman',9)) widgets[str(i)+str(k+5)].config(text='',bg='white') elif grille[i][k] == non_vide: grille[i][k+4] = non_vide*2 grille[i][k+5] = 0 widgets[str(i)+str(k+4)].config(text=str(non_vide*2),bg=couleurs[str(non_vide*2)],font=('Times New Roman',9)) widgets[str(i)+str(k+5)].config(text='',bg='white') if temp != grille: generator() def haut(event): global temp,grille temp = copy.deepcopy(grille) for i in range(4): for j in range(4): if grille[i][j] == 0: pass else: non_vide= grille[i][j] for k in range(i-5,-5,-1): if grille[k][j] == 0: grille[k+4][j] = non_vide grille[k+5][j] = 0 widgets[str(k+4)+str(j)].config(text=str(non_vide),bg=couleurs[str(non_vide)],font=('Times New Roman',9)) widgets[str(k+5)+str(j)].config(text='',bg='white') elif grille[k][j] == non_vide: grille[k][j] = non_vide*2 grille[k+1][j] = 0 widgets[str(k+4)+str(j)].config(text=str(non_vide*2),bg=couleurs[str(non_vide*2)],font=('Times New Roman',9)) widgets[str(k+5)+str(j)].config(text='',bg='white') if temp != grille: generator() def bas(event): global temp,grille temp = copy.deepcopy(grille) for i in range(-1,-5,-1): for j in range(4): if grille[i][j] == 0: pass else: non_vide= grille[i][j] for k in range(i+5,4): if grille[k][j] == 0: grille[k][j] = non_vide grille[k-1][j] = 0 widgets[str(k)+str(j)].config(text=str(non_vide),bg=couleurs[str(non_vide)],font=('Times New Roman',9)) widgets[str(k-1)+str(j)].config(text='',bg='white') elif grille[k][j] == non_vide: grille[k][j] = non_vide*2 grille[k-1][j] = 0 widgets[str(k)+str(j)].config(text=str(non_vide*2),bg=couleurs[str(non_vide*2)],font=('Times New Roman',9)) widgets[str(k-1)+str(j)].config(text='',bg='white') if temp != grille: generator() def generator(): while True: a,b = randint(0,3),randint(0,3) if grille[a][b] == 0: break num = choice([4,2,2,2,2]) grille[a][b] = num widgets[str(a)+str(b)].config(text=num,bg=couleurs[str(num)]) return def retourfonction(event): global grille,temp grille = copy.deepcopy(temp) for ligne in range(3): for case in range(3): if grille[ligne][case] != 0: widgets[str(ligne)+str(case)].config(text=str(grille[ligne][case]),bg=couleurs[str(grille[ligne][case])],font=('Times New Roman',9)) elif grille[ligne][case] == 0: widgets[str(ligne)+str(case)].config(text="",bg=couleurs[str(grille[ligne][case])],font=('Times New Roman',9)) widgets = {} ##Création des élements Tkinter root = Tk() case00=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case00.grid(row=1,column=0) widgets["00"]=case00 case01=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case01.grid(row=1,column=1) widgets["01"]=case01 case02=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case02.grid(row=1,column=2) widgets["02"]=case02 case03=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case03.grid(row=1,column=3) widgets["03"]=case03 case10=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case10.grid(row=2,column=0) widgets["10"]=case10 case11=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case11.grid(row=2,column=1) widgets["11"]=case11 case12=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case12.grid(row=2,column=2) widgets["12"]=case12 case13=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case13.grid(row=2,column=3) widgets["13"]=case13 case20=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case20.grid(row=3,column=0) widgets["20"]=case20 case21=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case21.grid(row=3,column=1) widgets["21"]=case21 case22=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case22.grid(row=3,column=2) widgets["22"]=case22 case23=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case23.grid(row=3,column=3) widgets["23"]=case23 case30=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case30.grid(row=4,column=0) widgets["30"]=case30 case31=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case31.grid(row=4,column=1) widgets["31"]=case31 case32=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case32.grid(row=4,column=2) widgets["32"]=case32 case33=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case33.grid(row=4,column=3) widgets["33"]=case33 retour = Button(root,text="\u21b6",font=('Times New Roman',30)) #\u21ba fleche recomencer retour.grid(column=2,row=0) nom=Label(root,text="2048",font=('Times New Roman',50)) nom.grid(row=0,column=0) root.bind("<Key-Left>",gauche) root.bind("<Key-Right>",droite) root.bind("<Key-Up>",haut) root.bind("<Key-Down>",bas) retour.bind("<Button-1>",retourfonction) ## Affectation des variables couleurs = {"0":"#ffffff","2":"#eee4da","4":"#ede0c8","8":"#f2b179","16":"#f59563","32":"#f67c5f","64":"#f65e3b","128":"#eccf71","256":"#eecc62","512":"#edc950","1024":"#eec340","2048":"#edc12d","4096":"#ff3d3d" ,"8192":"#000000","16384":"#000000","32768":"#000000","65536":"#000000","131072":"#000000"} grille = [[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]] ## Génération de deux nombres sur la grille num1 = choice([4,2,2,2,2]) a1,b1= randint(0,3),randint(0,3) grille[a1][b1] = num1 widgets[str(a1)+str(b1)].config(text=num1,bg=couleurs[str(num1)]) while True: a,b = randint(0,3),randint(0,3) if grille[a][b] == 0: break num = choice([4,2,2,2,2]) grille[a][b] = num widgets[str(a)+str(b)].config(text=num,bg=couleurs[str(num)]) temp=grille mainloop()
Windows / Firefox 114.0
- Disparition blocs jeu de 2048 python
- 94 jeu - Télécharger - Puzzle & Réflexion
- Citizen code python avis - Accueil - Outils
- 94 degrés jeu - Télécharger - Divers Jeux
- Jeu zuma - Télécharger - Jeux vidéo
- Logo jeu - Télécharger - Jeux vidéo
6 réponses
Salut.
Ton code demande à être revu, notamment :
Utiliser une fonction générique pour les fonctions droite, gauche, haut, bas qui font sensiblement la même chose.
Utiliser une liste au lieu de n variables case00, ..., case32
Ne pas oublier que dans un range, le stop n'est pas un inclus, donc dans ta fonction retourfonction, le stop des range devraient être à 4, et non 3.
les
if grille[i][j] == 0: pass
ne servent strictement à rien, autant simplement faire
if grille[i][j]: # mettre le code du else
Pourquoi avoir utiliser un dict pour widgets au lieu d'un tableau de list comme pour grille ?
Cela éviterait tout ces transtypages inutiles.
Sans doute que ce que j'ai énuméré ne résout pas ton problème, mais en revoyant ton code et suivant ces conseils, peut aider à identifier d'où provient ton souci.
Je vais faire ça merci :)
Pour la fonction générique je ne vois pas comment faire étant donné que je parcours la liste différement en fonction du déplacement : de -1 à -4 pour droite, de 0 à 3 pour gauche...
"Utiliser une liste au lieu de n variables case00, ..., case32"
-> Pour la liste au lieu des variables je n'ai pas vraiment compris ce que tu voulais dire étant donné que c'est des labels tk
Et pour les range(3) je sais que le stop n'est pas inclus j'avais juste fait une erreur :/
Edit : J'ai trouvé le problème il suffisait de mettre cela :
def bas(event): global temp,grille temp = copy.deepcopy(grille) for i in range(-1,-5,-1): for j in range(4): if grille[i][j]: non_vide= grille[i][j] for k in range(i+5,4): if grille[k][j] == 0: grille[k][j] = non_vide grille[k-1][j] = 0 widgets[str(k)+str(j)].config(text=str(non_vide),bg=couleurs[str(non_vide)],font=('Times New Roman',9)) widgets[str(k-1)+str(j)].config(text='',bg='white') elif grille[k][j] == non_vide: grille[k][j] = non_vide*2 grille[k-1][j] = 0 widgets[str(k)+str(j)].config(text=str(non_vide*2),bg=couleurs[str(non_vide*2)],font=('Times New Roman',9)) widgets[str(k-1)+str(j)].config(text='',bg='white') else: break if temp != grille: generator()
J'ai rajouté le else : break qui permet que le programme arrête de parcourir la ligne si le bloc à coté de lui n'est pas un 0 ou alors n'est pas le même chiffre
bonjour,
voici un exemple que ton programme ne calcule pas correctement:
Si la grille contient
[[8, 4, 4, 4], [4, 8, 16, 8], [2, 0, 0, 2], [0, 4, 0, 0]]
et que l'utilisateur choisit de monter, ton programme calcule
[[8, 8, 4, 4], [4, 0, 16, 8], [2, 4, 0, 2], [0, 0, 0, 2]]
ce qui est faux.
Bonjour,
Pour la liste au lieu des variables je n'ai pas vraiment compris ce que tu voulais dire étant donné que c'est des labels tk
En fait, tu aurais pu raccourcir ton code comme ceci:
widgets = {} case = {} for k in range(4): case[k]=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) case[k].grid(row=1,column=k) widgets[k]=case[k]
Idem pour case10, case11, case12, case13, etc..
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionBonjour Louis,
Une version sans toute cette série de labels, mais avec un Canvas sur lequel on trace
une grille et des chiffres:
# -*- coding:Utf-8 -*- import random from tkinter import * from tkinter import messagebox def move_line(patterns_r, line): ''' Déplace tout ''' line_pat = '' for k in range(SIZE): s = '0' if(line[k] == 0) else 'x' line_pat += s pattern = patterns_r[patterns.index(line_pat)] n_line = [0,0,0,0] n = -1 for k in range(SIZE): if(pattern[k] != '0'): for j in range(SIZE): if(j > n and line[j] != 0): n_line[k] = line[j] n = j break for k in range(SIZE): line[k] = n_line[k] return(line) def add_figures(line): ''' Additionne les chiffres contigus identiques ''' for k in range(SIZE-1): if(line[k] != 0): if(line[k+1] == line[k]): line[k+1] *= 2 line[k] = 0 return(line) def move_all(evt, delta_r, delta_c, grid): ''' Déplace tout suivant la direction choisie ''' if(delta_r > 0 or delta_c > 0): patterns_r = patterns_plus elif(delta_r < 0 or delta_c < 0): patterns_r = patterns_minus if(delta_c != 0): # déplacement horizontal for row in range(SIZE): line = [] for col in range(SIZE): line.append(grid[row][col]) if(0 in line): line = move_line(patterns_r, line) line = add_figures(line) if(0 in line): line = move_line(patterns_r, line) for k in range(SIZE): grid[row][k] = line[k] elif(delta_r != 0): # déplacement vertical for col in range(SIZE): line = [] for row in range(SIZE): line.append(grid[row][col]) if(0 in line): line = move_line(patterns_r, line) line = add_figures(line) if(0 in line): line = move_line(patterns_r, line) for k in range(SIZE): grid[k][col] = line[k] #Ajoute un 2 dans une case au hasard t = 99 while(t != 0): r, c = random.randint(0, SIZE-1), random.randint(0, SIZE-1) t = grid[r][c] grid[r][c] = 2 display_grid(grid) def coords_from_row_col(row,col): ''' Retourne les coordonnées du centre de la case en fonction des no de colonne et de ligne ''' x1,y1 = x0+SQUARE*col, y0+SQUARE*row x2,y2 = x1+SQUARE, y1+SQUARE xc,yc = x1+(x2-x1)/2, y1+(y2-y1)/2 return(xc,yc) def display_empty_grid(): ''' Affiche la grille vide ''' graph_area.delete('all') graph_area.create_rectangle(x0, y0, x0+SIZE*SQUARE, y0+SIZE*SQUARE, width = _width, outline = col) for k in range(1,SIZE): graph_area.create_line(x0+k*SQUARE, y0, x0+k*SQUARE, y0+SIZE*SQUARE, width = _width, fill = col) graph_area.create_line(x0, y0+k*SQUARE, x0+SIZE*SQUARE, y0+k*SQUARE, width = _width, fill = col) def display_grid(grid): ''' Affiche la grille avec les chiffres ''' display_empty_grid() for row in range(SIZE): for col in range(SIZE): xc,yc = coords_from_row_col(row, col) t = '' if(grid[row][col] == 0) else str(grid[row][col]) graph_area.create_text(xc, yc, text = t, fill = 'chocolate1', font = ('bold')) def init_grid(grid): ''' Initialise la grille avec 2 chiffres 2 au hasard ''' r, c1 = random.randint(0, SIZE-1), random.randint(0, SIZE-1) grid[r][c1] = 2 c2 = c1 while(c2 == c1): c2 = random.randint(0, SIZE-1) grid[r][c2] = 2 WIDTH, HEIGHT = 330, 330 SIZE, SQUARE = 4,70 x0, y0 = 10,10 col, _width = 'green2', 5 grid = [[0 for j in range(SIZE)] for k in range(SIZE)] patterns = ['xxxx','0000', 'x0xx', '0xxx', '00xx', '000x', 'xxx0', 'xx00', 'x000', 'x0x0', '0x0x', '0xx0', 'x00x', '00x0', '0x00', 'xx0x'] patterns_plus = ['xxxx','0000', '0xxx', '0xxx', '00xx', '000x', '0xxx', '00xx', '000x', '00xx', '00xx', '00xx', '00xx', '000x', '000x', '0xxx'] patterns_minus = ['xxxx','0000', 'xxx0', 'xxx0', 'xx00', 'x000', 'xxx0', 'xx00', 'x000', 'xx00', 'xx00', 'xx00', 'xx00', 'x000', 'x000', 'xxx0'] main_win = Tk() main_win.geometry(str(WIDTH)+'x'+str(HEIGHT)+'+600+50') main_win.title('2048') main_win.bind("<Key-Left>", lambda evt, r=0, c=-1, g=grid: move_all(evt, r, c, g)) main_win.bind("<Key-Right>", lambda evt, r=0, c=1, g=grid: move_all(evt, r, c, g)) main_win.bind("<Key-Up>", lambda evt, r=-1, c=0, g=grid: move_all(evt, r, c, g)) main_win.bind("<Key-Down>", lambda evt, r=1, c=0, g=grid: move_all(evt, r, c, g)) graph_area = Canvas(main_win, width = WIDTH-30, height = HEIGHT-30, bg = 'ivory') graph_area.place(x=10, y = 10) init_grid(grid) display_grid(grid) main_win.mainloop()
Bonjour yg_be,
Oui, tu as raison, je connaissais le jeu mais je n'y avais jamais joué, et donc,
ce que tu vois ici, c'est ce que j'en ai compris (sans vraiment approfondir :-) :-) )
En tout cas, le principe est là
J'ai donc ajouté ceci:
en début de fonction move_all()
screenshot = copy.deepcopy(grid)
et en fin de fonction:
if(screenshot != grid): possible_nb = [2,4] nb = random.choice(possible_nb) content = 99 while(content != 0): r, c = random.randint(0, SIZE-1), random.randint(0, SIZE-1) content = grid[r][c] grid[r][c] = nb