2048游戲輸出
項目先決條件
前提條件如下:
1. python
2. tkinter
創建main.py
代碼:
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
|
from tkinter import * from tkinter import messagebox import random class board: bg_color = { '2' : '#eee4da' , '4' : '#ede0c8' , '8' : '#edc850' , '16' : '#edc53f' , '32' : '#f67c5f' , '64' : '#f65e3b' , '128' : '#edcf72' , '256' : '#edcc61' , '512' : '#f2b179' , '1024' : '#f59563' , '2048' : '#edc22e' , } color = { '2' : '#776e65' , '4' : '#f9f6f2' , '8' : '#f9f6f2' , '16' : '#f9f6f2' , '32' : '#f9f6f2' , '64' : '#f9f6f2' , '128' : '#f9f6f2' , '256' : '#f9f6f2' , '512' : '#776e65' , '1024' : '#f9f6f2' , '2048' : '#f9f6f2' , } def __init__( self ): self .window = tk() self .window.title( 'projectgurukul 2048 game' ) self .gamearea = frame( self .window,bg = 'azure3' ) self .board = [] self .gridcell = [[ 0 ] * 4 for i in range ( 4 )] self .compress = false self .merge = false self .moved = false self .score = 0 for i in range ( 4 ): rows = [] for j in range ( 4 ): l = label( self .gamearea,text = ' ',bg=' azure4', font = ( 'arial' , 22 , 'bold' ),width = 4 ,height = 2 ) l.grid(row = i,column = j,padx = 7 ,pady = 7 ) rows.append(l) self .board.append(rows) self .gamearea.grid() def reverse( self ): for ind in range ( 4 ): i = 0 j = 3 while (i<j): self .gridcell[ind][i], self .gridcell[ind][j] = self .gridcell[ind][j], self .gridcell[ind][i] i + = 1 j - = 1 def transpose( self ): self .gridcell = [ list (t) for t in zip ( * self .gridcell)] def compressgrid( self ): self .compress = false temp = [[ 0 ] * 4 for i in range ( 4 )] for i in range ( 4 ): cnt = 0 for j in range ( 4 ): if self .gridcell[i][j]! = 0 : temp[i][cnt] = self .gridcell[i][j] if cnt! = j: self .compress = true cnt + = 1 self .gridcell = temp def mergegrid( self ): self .merge = false for i in range ( 4 ): for j in range ( 4 - 1 ): if self .gridcell[i][j] = = self .gridcell[i][j + 1 ] and self .gridcell[i][j] ! = 0 : self .gridcell[i][j] * = 2 self .gridcell[i][j + 1 ] = 0 self .score + = self .gridcell[i][j] self .merge = true def random_cell( self ): cells = [] for i in range ( 4 ): for j in range ( 4 ): if self .gridcell[i][j] = = 0 : cells.append((i, j)) curr = random.choice(cells) i = curr[ 0 ] j = curr[ 1 ] self .gridcell[i][j] = 2 def can_merge( self ): for i in range ( 4 ): for j in range ( 3 ): if self .gridcell[i][j] = = self .gridcell[i][j + 1 ]: return true for i in range ( 3 ): for j in range ( 4 ): if self .gridcell[i + 1 ][j] = = self .gridcell[i][j]: return true return false def paintgrid( self ): for i in range ( 4 ): for j in range ( 4 ): if self .gridcell[i][j] = = 0 : self .board[i][j].config(text = ' ',bg=' azure4') else : self .board[i][j].config(text = str ( self .gridcell[i][j]), bg = self .bg_color.get( str ( self .gridcell[i][j])), fg = self .color.get( str ( self .gridcell[i][j]))) class game: def __init__( self ,gamepanel): self .gamepanel = gamepanel self .end = false self .won = false def start( self ): self .gamepanel.random_cell() self .gamepanel.random_cell() self .gamepanel.paintgrid() self .gamepanel.window.bind( '<key>' , self .link_keys) self .gamepanel.window.mainloop() def link_keys( self ,event): if self .end or self .won: return self .gamepanel.compress = false self .gamepanel.merge = false self .gamepanel.moved = false presed_key = event.keysym if presed_key = = 'up' : self .gamepanel.transpose() self .gamepanel.compressgrid() self .gamepanel.mergegrid() self .gamepanel.moved = self .gamepanel.compress or self .gamepanel.merge self .gamepanel.compressgrid() self .gamepanel.transpose() elif presed_key = = 'down' : self .gamepanel.transpose() self .gamepanel.reverse() self .gamepanel.compressgrid() self .gamepanel.mergegrid() self .gamepanel.moved = self .gamepanel.compress or self .gamepanel.merge self .gamepanel.compressgrid() self .gamepanel.reverse() self .gamepanel.transpose() elif presed_key = = 'left' : self .gamepanel.compressgrid() self .gamepanel.mergegrid() self .gamepanel.moved = self .gamepanel.compress or self .gamepanel.merge self .gamepanel.compressgrid() elif presed_key = = 'right' : self .gamepanel.reverse() self .gamepanel.compressgrid() self .gamepanel.mergegrid() self .gamepanel.moved = self .gamepanel.compress or self .gamepanel.merge self .gamepanel.compressgrid() self .gamepanel.reverse() else : pass self .gamepanel.paintgrid() print ( self .gamepanel.score) flag = 0 for i in range ( 4 ): for j in range ( 4 ): if ( self .gamepanel.gridcell[i][j] = = 2048 ): flag = 1 break if (flag = = 1 ): #found 2048 self .won = true messagebox.showinfo( '2048' , message = 'you wonnn!!' ) print ( "won" ) return for i in range ( 4 ): for j in range ( 4 ): if self .gamepanel.gridcell[i][j] = = 0 : flag = 1 break if not (flag or self .gamepanel.can_merge()): self .end = true messagebox.showinfo( '2048' , 'game over!!!' ) print ( "over" ) if self .gamepanel.moved: self .gamepanel.random_cell() self .gamepanel.paintgrid() gamepanel = board() game2048 = game( gamepanel) game2048.start() |
解釋:
我們在代碼中定義了兩個類:
1.board:
變量:
- bg_color:這是一個字典,用于存儲每個單元格的背景色。
- color:這是一個字典,用于存儲每個單元的前景色。
- window:它是tkinter的主要窗口。
- gamearea:這是一個tkinter框架小部件。
- gridcell:這是一個4×4整數矩陣,存儲所有單元格的實際整數值。
- board:這是tkinter標簽小部件的4×4網格,它在tkinter窗口上顯示單元格的值。它還用于根據其gridcell值配置該單元格的背景和前景。
- score:它存儲玩家的當前分數。
其余只是標志變量。
功能:
- __init __(self):這是構造函數。它使用適當的默認值初始化所有變量,例如gridcell的默認值為“ 0”,移動,合并的默認值為false,等等。
- reverse:反轉gridcell矩陣。
- transpose:它使用zip函數并進行gridcell矩陣的轉置。
- compressgrid:它將所有非空單元格向左移動,因此可以輕松完成合并。
- mergegrid:如果兩個相鄰單元格具有相同的gridcell值,則將它們的gridcell值相加。
- random_cell:首先將所有空單元格存儲在列表中,然后從創建的列表中選擇一個隨機單元格并使其gridcell值2
- can_merge:返回一個布爾值,表示我們可以合并任意兩個單元格。當且僅當兩個單元格具有相同的gridcell值時,我們才可以合并它們。
- paintgrid:將前景和背景色分配給4×4網格中與其gridcell值相對應的每個單元。
2.game:
此類沒有很多變量,只有一些布爾變量指示游戲狀態。
功能:
- __init __(self):這是構造函數。它使用適當的默認值初始化所有變量。
- 開始:調用random_cell兩次,將'2'賦給兩個隨機單元格的gridcell值,然后繪制網格,然后,調用link_keys鏈接上,下,左和右鍵。
- link_keys:首先,它檢查游戲是贏還是輸,如果是,則不執行任何操作執行return語句。否則,它將繼續執行。
方法:
- 對于左滑動,我們將先壓縮然后合并gridcell矩陣,然后如果compress或merge為true(指示矩陣的值受前兩個函數影響),那么我們需要再次壓縮網格。
- 對于上移,我們將進行移調,然后向左輕掃,然后再次進行移調以返回原始順序。
- 向下移動與向上移動相同,但是我們需要反轉矩陣。
- 同樣,向右與向左+向后移動相同。
- 每次操作后,我們需要檢查游戲狀態,如果所有單元都被占用,我們甚至不能合并任何兩個單元,即沒有動作可以改變矩陣的狀態,則游戲結束了。
如果任何一個單元格值都達到2048,則玩家將獲勝,并且屏幕上會閃爍一個消息框,宣布獲勝者。
總結
我們已經成功地用python開發了流行的2048游戲。開發游戲而不是玩別人的游戲非常有趣,現在我們將玩自己開發的游戲。
以上就是python基于tkinter制作圖形界面的2048游戲的詳細內容,更多關于python 圖形界面2048游戲的資料請關注服務器之家其它相關文章!
原文鏈接:https://projectgurukul.org/python-2048-game/