Disparition blocs jeu de 2048 python
Résolu/FerméPhil_1857 Messages postés 1872 Date d'inscription lundi 23 mars 2020 Statut Membre Dernière intervention 28 février 2024 - 24 juin 2023 à 18:06
- Disparition blocs jeu de 2048 python
- 94 jeu - Télécharger - Puzzle & Réflexion
- Jeu zuma - Télécharger - Jeux vidéo
- Citizen code python - Guide
- Jeux de moto: jeu de course 3d - Télécharger - Course
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
Modifié le 12 juin 2023 à 11:42
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.
Modifié le 13 juin 2023 à 17:34
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..
13 juin 2023 à 19:28
Les variables case.. sont inutiles.
for j in range(4): for k in range(4): widgets[(k,j)]=Label(root,text="",relief=RAISED,borderwidth=1,width=23, height=11,bg='white',font=('Times New Roman',9)) widgets[(k,j)].grid(row=k+1,column=j)
14 juin 2023 à 10:09
Bonjour,
Oui,, en rédigeant ma réponse, je me demandais pour quoi cette variable widgets
alors que l'on a déjà le dictionnaire case ...
15 juin 2023 à 11:20
ca réduit considérablement la longueur du code, et de plus les lignes
widgets[str(k)+str(j)].config(......
s'écrivent plus simplement:
widgets[(k,j)].config(.....
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question24 juin 2023 à 08:47
Bonjour 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()
24 juin 2023 à 09:09
Intéressant la généralisation du move, avec move_all(().
Dommage le programme n'applique pas les mêmes règles que le programme d'origine. Vois les lignes 90 et 91 du programme d'origine. Il ne faut ajouter une valeur (soit un 2, soit un 4) que si il y a eu un changement effectif.
Modifié le 24 juin 2023 à 11:23
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à
24 juin 2023 à 18:06
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