一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - python基于tkinter制作圖形界面的2048游戲

python基于tkinter制作圖形界面的2048游戲

2021-10-04 00:11projectgurukul Python

這篇文章主要介紹了python基于tkinter制作圖形界面的2048游戲的方法,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下

2048游戲輸出

python基于tkinter制作圖形界面的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/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产自一区 | 亚洲国产情侣一区二区三区 | 国产午夜一区二区在线观看 | 11 13加污女qq看他下面 | 久久AV喷吹AV高潮欧美 | 国产精品美女久久久久 | 亚洲成人99 | 2021日本三级理论影院 | 人成午夜免费大片在线观看 | 侵犯小男生免费视频网站 | 我被男人下药添得好爽 | 桥本有菜在线四虎福利网 | 精品国产原创在线观看视频 | 欧美三级不卡在线观线看高清 | 久久电影精品久久99久久 | 成人一级黄色大片 | 午夜第九达达兔鲁鲁 | 午夜福利08550 | 久久国产香蕉 | 免费特黄一级欧美大片在线看 | 日日碰日日操 | 亚洲国产综合精品 | 国产精品永久免费视频 | h肉动漫在线视频无修无遮挡 | 亚洲毛片网 | 日本免费一区二区三区 | 国产福利不卡视频在免费 | 国产精品久久久久久久免费大片 | 天海翼三级 | 亚洲男人天堂影院 | 精品免费久久久久久成人影院 | 亚洲AV无码偷拍在线观看 | 日日草视频 | 舔穴吸奶 | 加勒比京东热 | 高人先生免费观看全集 | 久久精品中文騷妇女内射 | 国产精品久久久久久久免费大片 | 大奶喷水 | 免费看打屁股视频的软件 | 男男gaygays国内 |