python基于tkinter制作图形界面的2048游戏
程序员文章站
2022-06-23 08:37:43
2048游戏输出项目先决条件前提条件如下:1. python2. tkinter创建main.py代码:from tkinter import *from tkinter import message...
2048游戏输出
项目先决条件
前提条件如下:
1. python
2. tkinter
创建main.py
代码:
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游戏的资料请关注其它相关文章!
上一篇: 接口幂等性处理方案
下一篇: js - 前序,中序遍历二叉搜索树非递归