1
+ import tkinter as tk
2
+ import random
3
+
4
+ class Game2048 :
5
+ def __init__ (self , master ):
6
+ self .master = master
7
+ self .master .title ("2048" )
8
+ self .master .geometry ("400x400" )
9
+ self .master .bind ("<Key>" , self .handle_key )
10
+
11
+ self .grid_size = 4
12
+ self .grid = [[0 ] * self .grid_size for _ in range (self .grid_size )]
13
+ self .score = 0
14
+
15
+ self .init_grid ()
16
+ self .add_tile ()
17
+ self .update_grid ()
18
+
19
+ def init_grid (self ):
20
+ self .tiles = []
21
+ for i in range (self .grid_size ):
22
+ row = []
23
+ for j in range (self .grid_size ):
24
+ tile = tk .Label (self .master , text = "" , font = ("Helvetica" , 32 ), width = 4 , height = 2 , relief = "raised" )
25
+ tile .grid (row = i , column = j , padx = 5 , pady = 5 )
26
+ row .append (tile )
27
+ self .tiles .append (row )
28
+
29
+ def add_tile (self ):
30
+ empty_cells = [(i , j ) for i in range (self .grid_size ) for j in range (self .grid_size ) if self .grid [i ][j ] == 0 ]
31
+ if empty_cells :
32
+ i , j = random .choice (empty_cells )
33
+ self .grid [i ][j ] = 2 if random .random () < 0.9 else 4
34
+
35
+ def update_grid (self ):
36
+ for i in range (self .grid_size ):
37
+ for j in range (self .grid_size ):
38
+ value = self .grid [i ][j ]
39
+ if value == 0 :
40
+ self .tiles [i ][j ].configure (text = "" , bg = "lightgray" )
41
+ else :
42
+ self .tiles [i ][j ].configure (text = str (value ), bg = "lightblue" )
43
+ self .master .update_idletasks ()
44
+
45
+ def handle_key (self , event ):
46
+ if event .keysym in ['Up' , 'Down' , 'Left' , 'Right' ]:
47
+ self .move_tiles (event .keysym )
48
+ self .add_tile ()
49
+ self .update_grid ()
50
+ if self .check_game_over ():
51
+ print ("Game Over! Score:" , self .score )
52
+
53
+ def move_tiles (self , direction ):
54
+ if direction == 'Up' :
55
+ self .grid = self .transpose (self .grid )
56
+ self .grid = self .merge_tiles (self .grid )
57
+ self .grid = self .transpose (self .grid )
58
+ elif direction == 'Down' :
59
+ self .grid = self .reverse (self .transpose (self .grid ))
60
+ self .grid = self .merge_tiles (self .grid )
61
+ self .grid = self .transpose (self .reverse (self .grid ))
62
+ elif direction == 'Left' :
63
+ self .grid = self .merge_tiles (self .grid )
64
+ elif direction == 'Right' :
65
+ self .grid = self .reverse (self .grid )
66
+ self .grid = self .merge_tiles (self .grid )
67
+ self .grid = self .reverse (self .grid )
68
+
69
+ def merge_tiles (self , grid ):
70
+ score = 0
71
+ for i in range (self .grid_size ):
72
+ j = 0
73
+ while j < self .grid_size - 1 :
74
+ if grid [i ][j ] == grid [i ][j + 1 ] and grid [i ][j ] != 0 :
75
+ grid [i ][j ] *= 2
76
+ score += grid [i ][j ]
77
+ grid [i ][j + 1 ] = 0
78
+ j += 2
79
+ else :
80
+ j += 1
81
+ self .score += score
82
+ return grid
83
+
84
+ def check_game_over (self ):
85
+ for i in range (self .grid_size ):
86
+ for j in range (self .grid_size ):
87
+ if self .grid [i ][j ] == 0 :
88
+ return False
89
+ if j < self .grid_size - 1 and self .grid [i ][j ] == self .grid [i ][j + 1 ]:
90
+ return False
91
+ if i < self .grid_size - 1 and self .grid [i ][j ] == self .grid [i + 1 ][j ]:
92
+ return False
93
+ return True
94
+
95
+ @staticmethod
96
+ def transpose (matrix ):
97
+ return [[row [i ] for row in matrix ] for i in range (len (matrix [0 ]))]
98
+
99
+ @staticmethod
100
+ def reverse (matrix ):
101
+ return [row [::- 1 ] for row in matrix ]
102
+
103
+ def main ():
104
+ root = tk .Tk ()
105
+ game = Game2048 (root )
106
+ root .mainloop ()
107
+
108
+ if __name__ == "__main__" :
109
+ main ()
0 commit comments