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字符编码判断方法分析
Jul 01 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
Nov 01 Python
python指定写入文件时的编码格式方法
Jun 07 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
python爬虫之自制英汉字典
Jun 24 Python
python下PyGame的下载与安装过程及遇到问题
Aug 04 Python
如何用Python来理一理红楼梦里的那些关系
Aug 14 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
python生成器/yield协程/gevent写简单的图片下载器功能示例
Oct 28 Python
详解Django CAS 解决方案
Oct 30 Python
如何在Django中使用聚合的实现示例
Mar 23 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
《忧国的莫里亚蒂》先导宣传图与STAFF公开
2020/03/04 日漫
《魔兽争霸3:重制版》翻车了?你想要的我们都没有
2019/11/07 魔兽争霸
用PHP制作静态网站的模板框架(三)
2006/10/09 PHP
PHP 强制性文件下载功能的函数代码(任意文件格式)
2010/05/26 PHP
PHP开发制作一个简单的活动日程表Calendar
2016/06/20 PHP
PHP APP微信提现接口代码
2018/09/30 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
TP5框架安全机制实例分析
2020/04/05 PHP
Js nodeType 属性全面解析
2013/11/14 Javascript
js使用removeChild方法动态删除div元素
2014/08/01 Javascript
jQuery统计指定子元素数量的方法
2015/03/17 Javascript
js网页滚动条滚动事件实例分析
2015/05/05 Javascript
跟我学习JScript的Bug与内存管理
2015/11/18 Javascript
p5.js入门教程之图片加载
2018/03/20 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
jQuery解析json格式数据示例
2018/09/01 jQuery
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
通过JQuery,JQueryUI和Jsplumb实现拖拽模块
2019/06/18 jQuery
python Django模板的使用方法(图文)
2013/11/04 Python
Python3实现的画图及加载图片动画效果示例
2018/01/19 Python
Python使用win32com模块实现数据库表结构自动生成word表格的方法
2018/07/17 Python
使用PyQtGraph绘制精美的股票行情K线图的示例代码
2019/03/14 Python
Python Matplotlib实现三维数据的散点图绘制
2019/03/19 Python
python conda操作方法
2019/09/11 Python
Python 串口通信的实现
2020/09/29 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
h5调用摄像头的实现方法
2016/06/01 HTML / CSS
c语言常见笔试题总结
2016/09/05 面试题
同学聚会老师邀请函
2014/01/28 职场文书
公司活动方案范文
2014/03/06 职场文书
放飞中国梦演讲稿
2014/04/23 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
汽车销售员工作总结
2015/08/12 职场文书
《风筝》教学反思
2016/02/23 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
如何用Laravel包含你自己的帮助函数
2021/05/27 PHP