【上期回顾:Tkinter模块GUI界面化编程实战(二)——计算器】

        这篇博客介绍了如何用Python Tkinter模块编写一个界面化的2048小游戏,在博客下面有完整的源码,源码中有超详细的注释,帮助大家理解代码(最后还有附件可以免费下载)

【注:下载文件100%可以运行,因为下载文件中包含打包了的Python程序(exe文件)!】


【前两期我都用了ttkbootstrap模块进行了界面美化,但总用别人写好的模块去美化GUI界面让我觉得心里不舒服,而且这个模块要自己pip安装,很麻烦,后续我就不用了】

用Tkinter模块编写一个2048小游戏

【先来看看效果图】

【要注意哦,鼠标移到这个按钮上,按钮会变颜色哦(事件绑定)】

【再来看看源代码】

【这个可以直接复制代码并运行,没有需pip的模块】

from tkinter import *
from random import *
from tkinter.messagebox import *game = Tk()#基本框架
game.title('Game-2048')
game.geometry('305x205+500+250')
game.resizable(0,0)def base():numdict = {1:{},2:{},3:{},4:{}}for key in numdict.keys():numdict[key] = {1:'',2:'',3:'',4:''}while 1:x1,x2,y1,y2 = randint(1,4),randint(1,4),randint(1,4),randint(1,4)if x1 != x2 or y1 !=y2:numdict[x1][y1],numdict[x2][y2] = 2,2;breakframe  = Frame(game,bg='#BBADA0').place(width=205,height=205)frame2 = Frame(game,bg='orange' ).place(width=100,height=205,x=205)frame3 = Frame(frame2,bg='#FAF8EF' ).place(x=210,y=5,width=90,height=195)(score := StringVar()).set('Score\n\n0');(score_value := StringVar()).set('0')Label(frame3,textvariable=score,font=('consolas',15),bg='yellow').place(x=215,y=10,width=80,height=100)helpbutton = Button(frame2,text='Help',font=('consolas',15),bd=0,bg='lightgreen',command=lambda: gamehelp());helpbutton.place(x=215,y=160,width=80,height=30)playbutton = Button(frame2,text='Play',font=('consolas',15),bd=0,bg='lightgreen',command=lambda:gamestart());playbutton.place(x=215,y=120,width=80,height=30)n14 = StringVar();n24 = StringVar();n34 = StringVar();n44 = StringVar()n13 = StringVar();n23 = StringVar();n33 = StringVar();n43 = StringVar()n12 = StringVar();n22 = StringVar();n32 = StringVar();n42 = StringVar()n11 = StringVar();n21 = StringVar();n31 = StringVar();n41 = StringVar()for sy in [5,55,105,155]:#放置格子for sx,i in zip([5,55,105,155],[n14,n24,n34,n44,n13,n23,n33,n43,n12,n22,n32,n42,n11,n21,n31,n41][4*(sy-5)//50:4*(sy+45)//50]):Label(frame,bg='#CDC1B4',textvariable=i,font=('consolas',15)).place(width=45,height=45,y=sy,x=sx)def initialization():#初始化for x in range(1,5):for y,i in zip(range(1,5),[n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44][4*(x-1):4*x]):i.set(numdict[x][y])def gamewin():#游戏胜利for value in numdict.values():if 2048 in value:frame_win = Frame(game,bg='yellow').place(width=305,height=205)Label(frame_win,text='You Win!',font=('consolas',30),fg='red',bg='yellow').place(width=305,height=60)Button(frame_win,bd=0,bg='lightgreen',font=('consolas',15),text='Again!',command=lambda:base()).place(width=80,height=30,y=150,x=45)Button(frame_win,bd=0,bg='lightgreen',font=('consolas',15),text='Quit!',command=lambda:quit()).place(width=80,height=30,y=150,x=180)Label(frame,font=('consolas',15),text='You have got to\n2048!',bg='yellow').place(width=205,height=60,y=60,x=50)game.after(100,gamewin)def gameover():#游戏结束frame_over = Frame(game,bg='yellow').place(width=305,height=205)Label(frame_over,text='Game Over!',font=('consolas',30),fg='red',bg='yellow').place(width=305,height=60)Button(frame_over,bd=0,bg='lightgreen',font=('consolas',15),text='Again!',command=lambda:base()).place(width=80,height=30,y=150,x=45)Button(frame_over,bd=0,bg='lightgreen',font=('consolas',15),text='Quit!',command=lambda:quit()).place(width=80,height=30,y=150,x=180)Label(frame,font=('consolas',50),textvariable=score_value,bg='yellow').place(width=205,height=60,y=60,x=50)def move(way,count=0):#操作函数if way in ['w','s','a','d']:#判断是否为正确的操作if way == 'w':for x in range(1,5):numdict[x][5] = 0for y in range(1,5):if numdict[x][y] == numdict[x][y+1] and numdict[x][y] != '':numdict[x][y] = '';numdict[x][y+1] *= 2elif numdict[x][y] != '' and numdict[x][y+1] == '':numdict[x][y],numdict[x][y+1]=numdict[x][y+1],numdict[x][y]del numdict[x][5]if way == 's':for x in range(1,5):numdict[x][0] = 0for y in range(4,0,-1):if numdict[x][y] == numdict[x][y-1] and numdict[x][y] != '':numdict[x][y] = '';numdict[x][y-1] *= 2elif numdict[x][y] != '' and numdict[x][y-1] == '':numdict[x][y],numdict[x][y-1]=numdict[x][y-1],numdict[x][y]del numdict[x][0]if way == 'd':numdict[5] = {1:0,2:0,3:0,4:0}for y in range(1,5):for x in range(1,5):if numdict[x][y] == numdict[x+1][y] and numdict[x][y] != '':numdict[x][y] = '';numdict[x+1][y] *= 2elif numdict[x][y] != '' and numdict[x+1][y] == '':numdict[x][y],numdict[x+1][y]=numdict[x+1][y],numdict[x][y]del numdict[5]if way == 'a':numdict[0] = {1:0,2:0,3:0,4:0}for y in range(1,5):for x in range(4,0,-1):if numdict[x][y] == numdict[x-1][y] and numdict[x][y] != '':numdict[x][y] = '';numdict[x-1][y] *= 2elif numdict[x][y] != '' and numdict[x-1][y] == '':numdict[x][y],numdict[x-1][y]=numdict[x-1][y],numdict[x][y]del numdict[0]for x in range(1,5):for y,i in zip(range(1,5),[n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44][4*(x-1):4*x]):i.set(numdict[x][y])if numdict[x][y] == '':count = 1if count == 0:gameover();return None#决定是否结束游戏while 1:#随机再产生一个数x,y = randint(1,4),randint(1,4)if numdict[x][y] == '':numdict[x][y] = choice([2,4]);break[n11,n12,n13,n14,n21,n22,n23,n24,n31,n32,n33,n34,n41,n42,n43,n44][4*x+y-5].set(numdict[x][y])def gamehelp():showinfo(title='Help of 2048',message='Press "w" to up!\nPress "s"  to down!\nPress "d" to right!\nPress "a"  to left!')#游戏帮助def scorevalue(value=0):#计分板for x in range(1,5):for y in range(1,5):if numdict[x][y] != '':value += numdict[x][y]score.set('Score\n\n%s'%value);score_value.set(str(value));game.after(10,scorevalue)def gamestart():#游戏开始game.bind_all('<Any-KeyPress>',lambda event:move(event.char))#键盘关联initialization()#初始化scorevalue()#开始计分gamewin()#检测胜利def enter(event):event.widget['bg']='springgreen'def leave(event):event.widget['bg']='lightgreen'for i in [helpbutton,playbutton]:i.bind('<Enter>',lambda event:enter(event));i.bind('<Leave>',lambda event:leave(event))base()
game.mainloop()

说明一下,这个2048的游戏规则可能和我们平时玩的不太一样,因为博主在编写这个之前并没有充分地了解游戏规则(ToT),游戏规则就是(你玩了就知道了),用‘w’、‘s’、‘a’、‘d’几个键去控制,祝你好运!


【 原创不易,大家都看到这里了,莫非还想白嫖诶?】

完整程序及源码下载链接【蓝奏云】:2048Game.zip【密码:8bt7

【下期预告:Python Tkinter编写随机点名小程序】【下期链接:随机点名小程序】

Tkinter模块GUI界面化编程实战(三)——2048小游戏(含详解及完整源码、完整程序下载链接)相关推荐

  1. Tkinter模块GUI界面化编程实战(四)——随机点名小程序(含详解及完整源码、完整程序下载链接)

    [上期回顾:Tkinter模块GUI界面化编程实战(三)--2048小游戏]  这篇博客介绍了如何用Python Tkinter模块编写一个界面化的随机点名小程序,在博客下面有完整的源码,源码中有超详 ...

  2. Tkinter模块GUI界面化编程实战(五)——大鱼吃小鱼游戏(含超详解及完整源码、完整程序免费下载链接)

    [上期回顾:Tkinter模块GUI界面化编程实战(四)--随机点名小程序] 这篇博客介绍了如何用Python Tkinter模块编写一个界面化的大鱼吃小鱼游戏,在博客下面有完整的源码,源码中有超详细 ...

  3. Tkinter模块GUI界面化编程实战(六)——超级游戏盒子(含超详解及完整源码、完整程序免费下载链接)

    [上期回顾:Tkinter模块GUI界面化编程实战(五)--大鱼吃小鱼游戏] 这篇博客介绍了如何用Python Tkinter模块编写一个界面化的超级游戏盒子,在博客下面有完整的源码,源码中有详细的注 ...

  4. 【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码

    前言 大家好,我是阿光. 本专栏整理了<PyTorch深度学习项目实战100例>,内包含了各种不同的深度学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集. 正在更新 ...

  5. 【机器学习项目实战10例目录】项目详解 + 数据集 + 完整源码

    前言 大家好,我是阿光. 本专栏整理了<机器学习项目实战10例>,内包含了各种不同的入门级机器学习项目,包含项目原理以及源码,每一个项目实例都附带有完整的代码+数据集. 正在更新中~ ✨

  6. cocos creator 2.4.5消除小游戏新玩法消星星源码H5+安卓+IOS三端源码

    cocos creator 2.4.5消除小游戏新玩法消星星源码H5+安卓+IOS三端源码,开发脚本为typeScript方便扩展和阅读,支持cocos creator2.X版本,完整的源码可直接运营 ...

  7. 使用Python的tkinter模块实现界面化的批量修改文件名(续)

      之前的<使用Python的tkinte模块实现界面化的批量修改文件名>主要实现了批量移除文件名中的指定字符串,无法进行替换,本文在前面工作的基础上,增加批量替换文件名中指定字符串的功能 ...

  8. Swift实战之2048小游戏

    上周在图书馆借了一本Swift语言实战入门,入个门玩一玩^_^正好这本书的后面有一个2048小游戏的实例,笔者跟着实战了一把. 差不多一周的时间,到今天,游戏的基本功能已基本实现,细节我已不打算继续完 ...

  9. Visual C++实现俄罗斯方块游戏实战三:核心算法设计与实现(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.主游戏类的设计 俄罗斯方块的主游戏类负责显示游戏界面,方块游戏等级等内容,同时还要管理游戏的输入操作 可以分为以下几个模块 1:游戏界面和方块的 ...

  10. 组件化开发之路由器模块详解(ActivityRouter源码详解)

    路由器的作用是什么?通俗的讲,路由器的作用就是一根网线满足多人上网的需求.而在开发中路由器模块的作用就是实现中转分发,也就是说将原来有关系的模块(有依赖的模块分开),产生一个中间的模块,让原来依赖的两 ...

最新文章

  1. 贝叶斯方法与连续值离散化
  2. 高项2015年下半年培训随堂作业(10月日)
  3. 获取frame_用Python获取可能是全网最全的杰尼龟表情包(第一弹)
  4. [YTU]_2865( 结构体--日期计算)
  5. cropbox php,jQuery用户头像裁剪插件cropbox.js实例分享
  6. java填写xls模板_Java 新建excle文件并填充模版内容
  7. laravel5.5中间件
  8. python综合管理系统_Python-20 (信息系统-框架/循环/增删/综合应用)
  9. qt5.9.0调试如何查看变量的值_深入了解 Java 调试
  10. 实体框架(Entity Framework)快速入门
  11. 笔记本电脑键盘切换_有哪些好用的办公键盘
  12. SSM整合配置文件总结
  13. [算法]用Python实现十大排序算法
  14. map和foreach的区别和应用场景_面试官:说说UDP和TCP的区别及应用场景
  15. Java JDK11的下载与安装
  16. kux格式怎么转换成mp3_怎么把kux格式转换mp4、mp3?视频转换技巧介绍
  17. 如何搭建一个asp网站(具体操作流程——详细步骤+图)(Windows server2003 和 Windows server2008)
  18. java web应用开发期末考试_JavaWeb期末考试A卷
  19. yum rpm 命令
  20. 直接耦合的互补输出级

热门文章

  1. 阿里Sophix 集成
  2. bmi055六轴传感器获取数据
  3. 项目启动管理、需求分析、可行性方案论证  IT项目管理
  4. 二建 机电工程常用材料及工程设备
  5. 代码:灰度重心法提取线激光条纹中心线(CPP+OpenCV)
  6. 有权图的单源最短路算法
  7. 用电机进行简单的PID参数整定
  8. 2020网易游戏测试面试二面面经(上海春招)
  9. 离线语音空调插座设计应用案例
  10. xshell上传文件到虚拟机Linux服务器