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

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

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/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 欧洲喷浆乌克兰 | 免费99精品国产自在现线 | 娇妻与公陈峰姚瑶最新版 | 免费超级乱淫视频播放性 | 欧美日韩国产成人精品 | boobsmilking流奶水野战 | 国产精品一区久久精品 | 亚洲日本aⅴ片在线观看香蕉 | 亚洲国产视频网站 | 18成人在线观看 | 天天舔天天干天天操 | 日本春菜花在线中文字幕 | 成人高清视频在线观看 | 男男同gayxxx | 韩国久久 | 国产在线看片护士免费视频 | 亚洲激情偷拍 | 国产精品久久久久久福利 | 四虎影视紧急入口地址大全 | 五月天国产精品 | 嘿嘿午夜 | 欧美 亚洲 综合 卡通 另类 区 | 日韩成人影视 | 亚洲国产日韩制服在线观看 | 手机跑分排行最新排名 | 国产精品一久久香蕉产线看 | 亚洲精品一二区 | 催眠 迷j系列小说 | 含羞草传媒每天免费一次破解 | 亚洲成人国产精品 | 毛片一区二区三区提莫影院 | 色人阁导航 | 青青草视频破解版 | 2020国产精品永久在线观看 | 秋霞黄色大片 | 日本一卡=卡三卡免费 | 欧美日韩亚洲另类人人澡 | 熟睡迷j系列小说 | videojapan日本孕交孕 | 色一情一区二区三区四区 | 午夜桃色剧场 |