python制作图形界面的2048游戏, 基于tkinter


Posted in Python onApril 06, 2021

2048游戏输出

python制作图形界面的2048游戏, 基于tkinter

项目先决条件

前提条件如下:

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游戏的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
简单的Python的curses库使用教程
Apr 11 Python
Python数据分析中Groupby用法之通过字典或Series进行分组的实例
Dec 08 Python
python-opencv颜色提取分割方法
Dec 08 Python
python读取txt文件并取其某一列数据的示例
Feb 19 Python
利用python实现在微信群刷屏的方法
Feb 21 Python
Python3爬楼梯算法示例
Mar 04 Python
python 实现交换两个列表元素的位置示例
Jun 26 Python
python 整数越界问题详解
Jun 27 Python
Python unittest框架操作实例解析
Apr 13 Python
Python requests模块cookie实例解析
Apr 14 Python
关于matplotlib-legend 位置属性 loc 使用说明
May 16 Python
总结Python常用的魔法方法
May 25 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 #Python
python删除csv文件的行列
Apr 06 #Python
python使用pygame创建精灵Sprite
python 逐步回归算法
python 通过使用Yolact训练数据集
python生成随机数、随机字符、随机字符串
Apr 06 #Python
Django项目配置Memcached和Redis, 缓存选择哪个更有优势
Apr 06 #Python
You might like
在JavaScript中调用php程序
2009/03/09 PHP
php查询操作实现投票功能
2016/05/09 PHP
Prototype1.6 JS 官方下载地址
2007/11/30 Javascript
JavaScript获得选中文本内容的方法
2008/12/02 Javascript
dojo随手记 gird组件引用
2011/02/24 Javascript
Js表格万条数据瞬间加载实现代码
2014/02/20 Javascript
Javascript学习笔记之函数篇(五) : 构造函数
2014/11/23 Javascript
深入探密Javascript数组方法
2015/01/08 Javascript
JQuery+Ajax实现数据查询、排序和分页功能
2015/09/27 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
Bootstrap编写一个同时适用于PC、平板、手机的登陆页面
2016/06/30 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
JavaScript中cookie工具函数封装的示例代码
2016/10/11 Javascript
AngularJS 与Bootstrap实现表格分页实例代码
2016/10/14 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
2016/12/29 Javascript
JavaScript实现离开页面前提示功能【附jQuery实现方法】
2017/09/26 jQuery
解决Vue使用swiper动态加载数据,动态轮播数据显示白屏的问题
2018/09/27 Javascript
nodejs更新package.json中的dependencies依赖到最新版本的方法
2018/10/10 NodeJs
vue中$nextTick的用法讲解
2019/01/17 Javascript
详解jenkins自动化部署vue
2019/05/14 Javascript
layui关闭层级、简单监听的实例
2019/09/06 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
Python全局变量操作详解
2015/04/14 Python
Python实现扫描局域网活动ip(扫描在线电脑)
2015/04/28 Python
Python使用正则表达式实现文本替换的方法
2017/04/18 Python
实例讲解Python中浮点型的基本内容
2019/02/11 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
PyCharm常用配置和常用插件(小结)
2021/02/06 Python
利用CSS3的transition属性实现滑动效果
2015/08/05 HTML / CSS
"引用"与多态的关系
2013/02/01 面试题
2014年网管工作总结
2014/12/11 职场文书
2015年幼儿园中班下学期工作总结
2015/05/22 职场文书
python爬不同图片分别保存在不同文件夹中的实现
2021/04/02 Python