基于Python的PyGame的俄罗斯方块游戏设计与实现
摘 要
近年来,随着游戏产业的突飞猛进,游戏玩家的技术也是与日俱增,当你看见游戏高手完美的表演时,你是否想过我也能达到那种水平,本程序用Python语言编写俄罗斯方块,左侧显示正在运行的游戏,右边显示下一个出现的形状、等级和积分等。游戏运行时随着等级的提高而速度加快,这需要玩家快速操作。因此,本程序主要意义是为高手玩家提供训练平台。其次也可为刚踏入游戏领域的新手们,有助于反应能力的提升。本程序利用Python设计实现俄罗斯方块游戏的算法、游戏内部功能、游戏区域的绘图的程序设计。对于每个俄罗斯方块各自的形态变化改变到下一个形态利用数组来实现。
关键词 :游戏;Python;俄罗斯方块;算法;功能
第一章 绪论
1.1 任务概述
1.1.1 软件功能
该俄罗斯方块是有Python编写而成的。它具有对游戏的正常操作,可以控制方块下落位置、下落时改变方向,以及对方块的直接下落。该游戏分左右两个界面,左边显示游戏的运行状态,右边显示游戏下一个即将出现的方块,以及游戏的等级类别和当前分数、消过得方块行数等。
1.1.2 运行环境
程序运行于Anoconda,将Anoconda安装于Windows系统上。然后在Anoconda Prompt 上安装pygame组件。
Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。Anaconda利用工具/命令conda来进行package和environment的管理,并且已经包含了Python和相关的配套工具。
这里先解释下conda、anaconda这些概念的差别。conda可以理解为一个工具,也是一个可执行命令,其核心功能是包管理与环境管理。包管理与pip的使用类似,环境管理则允许用户方便地安装不同版本的python并可以快速切换。Anaconda则是一个打包的集合,里面预装好了conda、某个版本的python、众多packages、科学计算工具等等,所以也称为Python的一种发行版。其实还有Miniconda,顾名思义,它只包含最基本的内容——python与conda,以及相关的必须依赖项,对于空间要求严格的用户,Miniconda是一种选择。
进入下文之前,说明一下conda的设计理念——conda将几乎所有的工具、第三方包都当做package对待,甚至包括python和conda自身!因此,conda打破了包管理与环境管理的约束,能非常方便地安装各种版本python、各种package并方便地切换。
Anaconda的下载页参见官网下载,Linux、Mac、Windows均支持。
安装时,会发现有两个不同版本的Anaconda,分别对应Python 2.7和Python 3.5,两个版本其实除了这点区别外其他都一样。后面我们会看到,安装哪个版本并不本质,因为通过环境管理,我们可以很方便地切换运行时的Python版本。(由于我常用的Python是2.7和3.4,因此倾向于直接安装Python 2.7对应的Anaconda)
下载后直接按照说明安装即可。这里想提醒一点:尽量按照Anaconda默认的行为安装——不使用root权限,仅为个人安装,安装目录设置在个人主目录下(Windows就无所谓了)。这样的好处是,同一台机器上的不同用户完全可以安装、配置自己的Anaconda,不会互相影响。
对于Mac、Linux系统,Anaconda安装好后,实际上就是在主目录下多了个文件夹(~/anaconda)而已,Windows会写入注册表。安装时,安装程序会把bin目录加入PATH(Linux/Mac写入~/.bashrc,Windows添加到系统变量PATH),这些操作也完全可以自己完成。以Linux/Mac为例,安装完成后设置PATH的操作是
```shell
将anaconda的bin目录加入PATH,根据版本不同,也可能是~/anaconda3/bin
echo 'export PATH="~/anaconda2/bin:$PATH"' >> ~/.bashrc
更新bashrc以立即生效
source ~/.bashrc ```
配置好PATH后,可以通过which conda或conda --version命令检查是否正确。假如安装的是Python 2.7对应的版本,运行python --version或python -V可以得到Python 2.7.12 :: Anaconda 4.1.1 (64-bit),也说明该发行版默认的环境是Python 2.7。
Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。包含图像、声音。
Pygame建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。基于这样一个设想,所有需要的游戏功能和理念都(主要是图像方面)都完全简化为游戏逻辑本身,所有的资源结构都可以由高级语言提供,如Python。
1.2 需求分析
1.2.1 游戏界面
1.2.2 菜单操作
打开Anoconda Prompt,安装pygame组件。安装完成后就会显示 如图5.1所示的界面。点击Play!,将进入游戏,点击Quit将退出程序。
1.2.3 游戏操作
进入游戏后,可以用键盘上下左右键控制方块的下落方向,速度。当选好下落的位置后,按下空格键将快速下降到需要填充的地方。当游戏中方块积累的和游戏最上面相平时,此局游戏将结束。
1.3 设计目的
这款游戏设计的主要目的是为了应用自己已学过的编程语言更好的去应运到实际中,同时对小游戏的开发有助于提升自己的编程能力,还能更好的找出自身存在的一些缺陷问题,加以及时的弥补。这款游戏也能供玩家适当缓解压力,提高思维能力和反应能力。
第二章 相关技术及开发工具
2.1 python介绍
Python (英国发音:/ˈpaɪθən/ 美国发音:/ˈpaɪθɑːn/), 是一种面向对象的解释型计算机程序设计语言,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。
Python是纯粹的自由软件, 源代码和解释器CPython遵循 GPL(GNU General Public License)协议。Python语法简洁清晰,特色之一是强制用空白符(white space)作为语句缩进。
Python具有丰富和强大的库。它常被昵称为胶水语言,能够把用其他语言制作的各种模块(尤其是C/C++)很轻松地联结在一起。常见的一种应用情形是,使用Python快速生成程序的原型(有时甚至是程序的最终界面),然后对其中有特别要求的部分,用更合适的语言改写,比如3D游戏中的图形渲染模块,性能要求特别高,就可以用C/C++重写,而后封装为Python可以调用的扩展类库。需要注意的是在您使用扩展类库时可能需要考虑平台问题,某些可能不提供跨平台的实现。
Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。
Python 的设计具有很强的可读性,相比其他语言经常使用英文关键字,其他语言的一些标点符号,它具有比其他语言更有特色语法结构。
Python 是一种解释型语言: 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。
Python 是交互式语言: 这意味着,您可以在一个Python提示符,直接互动执行写你的程序。
Python 是面向对象语言: 这意味着Python支持面向对象的风格或代码封装在对象的编程技术。
Python 是初学者的语言:Python 对初级程序员而言,是一种伟大的语言,它支持广泛的应用程序开发,从简单的文字处理到 WWW 浏览器再到游戏。
2.2 Python 发展历史
Python 是由 Guido van Rossum 在八十年代末和九十年代初,在荷兰国家数学和计算机科学研究所设计出来的。
Python 本身也是由诸多其他语言发展而来的,这包括 ABC、Modula-3、C、C++、Algol-68、SmallTalk、Unix shell 和其他的脚本语言等等。
像 Perl 语言一样,Python 源代码同样遵循 GPL(GNU General Public License)协议。 现在 Python 是由一个核心开发团队在维护,Guido van Rossum 仍然占据着至关重要的作用,指导其进展。
2.3 Python 特点
-
易于学习:Python有相对较少的关键字,结构简单,和一个明确定义的语法,学习起来更加简单
-
易于阅读:Python代码定义的更清晰
-
易于维护:Python的成功在于它的源代码是相当容易维护的
-
一个广泛的标准库:Python的最大的优势之一是丰富的库,跨平台的,在UNIX,Windows和Macintosh兼容很好
-
互动模式:互动模式的支持,您可以从终端输入执行代码并获得结果的语言,互动的测试和调试代码片断
-
可移植:基于其开放源代码的特性,Python已经被移植(也就是使其工作)到许多平台
-
可扩展:如果你需要一段运行很快的关键代码,或者是想要编写一些不愿开放的算法,你可以使用C或C++完成那部分程序,然后从你的Python程序中调用
-
数据库:Python提供所有主要的商业数据库的接口
-
GUI编程:Python支持GUI可以创建和移植到许多系统调用
-
可嵌入: 你可以将Python嵌入到C/C++程序,让你的程序的用户获得"脚本化"的能力
2.4 python开发环境构建
首先下载Visual Studio Code,Anaconda安装包,安装在Windows电脑,打开Visual Studio Code导入需要的Python 库,搭建环境,建立新的项目。
第三章 概要设计
本游戏的设计采用MVC模式(Model -View -Controller),即把本游戏的输入、处理、输出流程按照Model、View、Controller的方式进行分离,这样本游戏的设计被分成三个层—模型层、视图层、控制层。MVC模型图如下所示:
3.1 程序流程
3.1.1 程序主流程
3.1.2 游戏视图
3.1.3 游戏控制流程
3.2 模块说明
3.2.1 游戏模块
3.2.2 辅助模块
通过图形工厂随机产生方块的某种状态,这里运用了工厂设计模式,这种设计模式是为了实现高内聚低耦合而存在的,这种设计模式的通俗解释就是:你想要一个产品,你需要让工厂给你生产一个,你要告诉工厂你要生产什么产品,就把你需要生产的这个产品当做参数传给工厂类的生产产品的方法,然后根据你传进来的产品,而决定工厂人生产什么产品,产生出来产品后,最后要返回您要的这个东西。
3.3 重要数据
3.3.1 存储型
最高分Highscore(记录玩家最高得分)、Lines(显示本局游戏所消除的行数总和)、Score(显示本局游戏的所得分数)
3.3.2 控制型
等级Levels(根据不同等级调整游戏的不同速度)。
第四章 详细设计
4.1 界面设计
4.1.1 窗口创建
定义矩阵的宽、高、边框宽度、块大小然后计算出页面的宽度、高度。
页面宽度:
c++
WIDTH = MATRIX_WIDTH*BLOCKSIZE + BORDERWIDTH*2 + MATRIS_OFFSET*2 + LEFT_MARGIN
页面高度:
c++
HEIGHT = (MATRIX_HEIGHT-2)*BLOCKSIZE + BORDERWIDTH*2 + MATRIS_OFFSET*2
可见矩阵宽度:
c++
VISIBLE_MATRIX_HEIGHT = MATRIX_HEIGHT - 2
4.1.2 菜单设计
定义了Menu类,定义main(self, screen)函数,设置“Play!”“Quit”两个菜单,对其进行绘制,着色,当点击“Play!”时,游戏开始;点击“Quit”时,游戏结束。定义construct_highscoresurf(self)来显示游戏最高得分。
4.1.3 区域着色
定义fo_surf (self)函数,有矩阵和矩阵的边框进行着色。定义construct_nightmare(size)函数,对菜单背景进行随机颜色设置。
4.1.4 方块设计
方块共设计了7中形状,分别设置不同的颜色,分别为“(blue)一字形”、“(red)Z字形”、“(green)反Z字形”、“(pink)反T字形”、“(orange)7字形”、“(cyan)反7字形”、“(yellow)田字形”。
4.2 常量变量
4.2.1 常量
页面的大小,游戏行列格数目,不同方框的颜色是不变的。
4.2.2 变量
随机下落的方块形状,游戏的等级Level、消掉的行数Lines 、游戏的得分Score,最高分数Highscore。
4.3 重要函数
4.3.1 游戏状态
定义renderpair(text, val)函数,当游戏行数消除时,右边的Score、Level、Lines、Combo都有一定的变化。
4.3.2 游戏控制
定义了Menu类,定义main(self, screen)函数,设置“Play!”“Quit”两个菜单,对其进行绘制,当点击“Play!”时,游戏开始;点击“Quit”时,游戏结束。
4.4 重要算法
4.4.1 判定
定义lock_tetromino(self)函数,当游戏“死亡”之后,所有方块都会被记录,并且清除所有方块,会回到菜单界面。
4.4.2 变换
定义了request_movement(self, direction)函数,当玩家在键盘上按上下左右不同的键时,游戏界面的方块会有所变化。
第五章 调试与测试
5.1 调试分析
游戏在编辑过程中遇到了很多的Bug,已经解决了大部分发现的,可能尚存在部分Bug。
5.1.1 问题与解决
游戏第一版出现偶尔闪退现象。经过调试,现在已经找到问题所在,并予以修改Bug。
5.1.2 性能分析
- “控制”菜单测试
-
点击“游戏”-->“Play!”
- 输出:游戏开始
- 结果:正常
-
点击“游戏”-->“Quit”
- 输出:控制菜单退出
- 结果:正常
-
“游戏”菜单测试
-
游戏消除一行-->“Score”
- 输出:在游戏面板右侧分数面板增加100
- 结果:正常
-
游戏消除一行-->“Lines”
- 输出:在游戏面板右侧的消除行数增加1
- 结果:正常
-
游戏每消除1500分-->“Level”
- 输出:在游戏面板右侧的等级加1
- 结果:正常
5.1.3 程序不足
经过测试,本游戏实现了基本的功能,不过整体功能还不是很强大,作为开发的第一个版本,游戏在很多方面还需要进一步完善。
5.2 测试结果
5.2.1 游戏截图
第六章 结论
俄罗斯方块从最初的简单的黑白画面发展到后期追求图像的华丽,一直不断有人们的优化和改进。为了满足大众用户精神娱乐的需求,基于Python语言的俄罗斯方块游戏的设计,基本上已经达到了预期的目标。分析了俄罗斯方块游戏开发中Python语言程序算法、逻辑设计等一些关键技术,实现了游戏过程中游戏的消行和重得分的设置,该应用程序的主要功能已基本完善,是一款值得推荐的益智游戏。
在系统分析阶段,针对俄罗斯方块游戏,初步地定下了要实现的功能,并将整个游戏分成若干个部分,逐步解决过程中遇到的每一个问题,最终实现所想要的效果。此程序的用户界面已基本实现了俄罗斯方块游戏的一些基本的控制操作,但由于时间和能力有限,程序难免存在许多不足之处,很多功能还没有完全实现。若要实现游戏的扩展,设计出更加具有可玩性和好玩性的俄罗斯方块游戏,就要靠以后更多和更深入的学习,对此程序进行进一步的完善。
参考文献
[1] Michael Dawson. Python编程初学者指南[M]. 人民邮电出版社, 2014.10.
[2] Mark Lutz. Python编程(第四版)[M]. 中国电力出版社,2014.12.
[3] Jonathan Harbour. 人民邮电出版社[M]. 人民邮电出版社,2015.1.
[4] Robert Sedgewick Kevin Wayne[M]. 人民邮电出版社,2012.10
参考文献
- WebGIS的应用与研究(大连交通大学·张茹)
- 在线旅游管理信息系统的设计与实现(电子科技大学·任缘)
- 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐)
- 基于Cocos2d-JS引擎的手机网页游戏设计与实现(武汉邮电科学研究院·赵甜)
- 基于.NET平台的游戏门户系统设计与实现(电子科技大学·余胜鹏)
- 网络游戏虚拟物品交易系统设计与实现(吉林大学·李云峰)
- WebGIS的应用与研究(大连交通大学·张茹)
- 一种基于LBS的O2O解谜类游戏框架的设计与实现(中国科学院大学(工程管理与信息技术学院)·于菲)
- 基于J2EE/XML的分布式WebGIS平台系统设计与实现(西北大学·郑建功)
- 基于J2EE的MMORPG手机游戏框架的设计与实现(哈尔滨工业大学·李永金)
- 基于B/S架构的酷跑社区系统的设计与实现(内蒙古大学·张晓乐)
- 网络游戏虚拟物品交易系统设计与实现(吉林大学·李云峰)
- 基于JSF的Web GIS设计与实现(昆明理工大学·刘波)
- 3D云游戏平台的设计与实现(北京交通大学·闫璐)
- 基于PBL的初中Python教学案例开发与应用研究(佛山科学技术学院·刘星成)
本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:代码货栈 ,原文地址:https://m.bishedaima.com/yuanma/35295.html