IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> Python趣味项目,它来了 -> 正文阅读

[Python知识库]Python趣味项目,它来了

2048这个游戏当年风靡全球,游戏规则极其简单,玩起来也是相当简单,但是要想最后拼出2048,也绝非是一件容易的事。并且玩起来,也很有意思,总想一把一把的挑战。

2048游戏风格相似的是,它的代码实现起来也是非常简洁,代码只有区区不到200行,并且是纯Python,不用任何第三方包的情况下。

1 Python实现的2048游戏界面

我们先来一览最终实现的游戏界面,顺带帮助不了解2048游戏的读者,熟悉下它。

游戏主界面:

游戏基本规则:

  1. 键盘中上、下、左、右四个箭头,对应4个漂流方向

  2. 合并。数值相等的两个方格可以合并为1个方格,且值乘以2,如下图左下角,两个2方格可合并为一个4方格

合并后,最左下角就是4方格:

但是为什么它的上方又多了2方格呢?注意,这是第三个规则:

  1. 随机2方格。发生合并操作时,会从灰色的单元格中随机选择一个,并创建出2方格

  2. 漂流。再有1个好玩的操作,我称它为漂流,紧邻上图,我如果按下右箭头,两个左下角的4方格根据规则2首先合并为8方格。同时,所有方格整体向右漂流(沿着箭头方向)。因为发生了合并操作,根据规则3,再生成一个2方格。因此得到了如下界面:

这就是游戏的规则,大家下载我的完整代码后,玩耍一下后,理解规应该会更深,玩起来真的贼爽。

2 项目环境

本项目不使用任何第三方包,全都是Python自带的模块,且只用到2个模块,可见2048游戏的魅力,实现的代码都毫不费力。

一个模块是Tkinter,用来做界面,还用到的随机模块random

3 项目代码讲解

不到200行代码,是个小框架。主要包括2个类:

  • Board

  • Game

下面逐一介绍。

3.1?Board

主要提供三个能力,分别对应上面的三个规则:

  • 合并规则,对应Board类的方法merge_grid

  • 随机创建2方格,对应Board类的方法random_cell

  • 漂流,对应Board类的方法drifting_left

3.2?Game

主要提供Tkinter的键盘消息和事件处理能力,对应方法event_handlers,比较简单,所以主要讲解Board

merge_grid方法

编写merge_grid方法的逻辑,假定是在按下左箭头时,为什么这样假定,后面我会重点分析,这是理解这套代码的核心。基于此,合并邻近的两个非零相等单元格,实现逻辑很简单:

????def?merge_grid(self):
????????"""
????????向左移动,合并邻近的两个非零相等单元格
????????:return:
????????"""
????????self.merge?=?False
????????for?i?in?range(4):
????????????for?j?in?range(3):
????????????????if?self.grid_cell[i][j]?==?self.grid_cell[i][j?+?1]?and?self.grid_cell[i][j]?!=?0:
????????????????????self.grid_cell[i][j]?*=?2
????????????????????self.grid_cell[i][j?+?1]?=?0
????????????????????self.score?+=?self.grid_cell[i][j]
????????????????????self.merge?=?True

random_cell方法

实现random_cell方法就更简单了,随机从灰色(没有数字的方格)方格中,挑选一个,并赋值为2就行:

????def?random_cell(self):
????????"""
????????从零单元格中随机产生一个2号单元格
????????:return:
????????"""
????????i,?j?=?random.choice([(i,?j)?for?i?in?range(4)?for?j?in?range(4)?if?self.grid_cell[i][j]?==?0])
????????self.grid_cell[i][j]?=?2

drifting_left方法

实现漂流drifting_left方法,使用的是最基本的快慢指针,cnt是慢指针,j是快指针。

????def?drifting_left(self):
????????"""
????????向左偏流,消除0方格
????????:return:
????????"""
????????self.compress?=?False
????????temp?=?[[0]?*?4?for?_?in?range(4)]
????????for?i?in?range(4):
????????????# cnt:慢指针,j:?快指针
????????????cnt?=?0
????????????for?j?in?range(4):
????????????????if?self.grid_cell[i][j]?!=?0:
????????????????????temp[i][cnt]?=?self.grid_cell[i][j]
????????????????????if?cnt?!=?j:
????????????????????????self.compress?=?True
????????????????????cnt?+=?1

????????self.grid_cell?=?temp

3.3 代码核心

2048游戏会有4个漂流方向,分别为上、下、左、右。

而上面代码,假定漂流是向左,并基于此编写了向左漂流的逻辑。

这正是此套代码实现的高明之处,其他上、下、右三方向的漂流,经过reverse(反转)或transpose(转秩)后,都可以转成向左漂流的逻辑。这两个中间操作也都在Board类里提供了。

比如,实现向右漂流时,先执行一次reverse,然后执行drifting_left,再执行一次reverse,就实现了右漂。

实现上漂时,先转秩,再左漂,再转秩。

这个变化思路,大家纸上画一画,一看便知。

在这里还是要推荐下我自己建的Python学习Q群:831804576,群里都是学Python的,如果你想学或者正在学习Python ,欢迎你加入,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),
包括我自己整理的一份2022最新的Python进阶资料和零基础教学,欢迎进阶中和对Python感兴趣的小伙伴加入!

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-05-16 11:18:33  更:2022-05-16 11:18:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 13:36:49-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码