脚本之家,脚本语言编程技术及教程分享平台!
分类导航

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/

延伸 · 阅读

精彩推荐