python做流程图_少⼉Python编程_第⼗四讲:开发游戏
⽆论哪⼀种编程语⾔,实现图形界⾯程序的⽅法都⼤同⼩异。本讲介绍⽤Python开发⼩游戏的⽅法,从中学习使⽤Python编写图形界⾯的程序,图形图像的基础知识,以及在图形界⾯程序中与⽤户交互。最后部分还将学习使⽤版本管理⼯具下载他⼈的代码。
14.1 图形化应⽤程序
之前学习过的程序都相对简单:程序顺序执⾏,如图14.1左侧流程图所⽰,程序⽤字符显⽰输出信息。⽽带窗⼝界⾯的程序,⽆论是⼯具界⾯(如记事本),还是图像界⾯(如游戏),程序都包括三部分:
初始化 初始化界⾯绘制模块,设置窗⼝属性(如:长、宽)、做装载图⽚和声⾳⽂件等准备⼯作。
主循环 主循环等待接收⽤户输⼊的信息(⿏标或键盘输⼊),并对⽤户输⼊做出反馈(在界⾯上显⽰)。同时不断执⾏程序(如推进游戏过程)。
退出 退出程序关闭已打开的窗⼝、释放申请的资源等等。
带界⾯的程序启动后⼀直运⾏,直到⽤户关闭窗⼝或者在界⾯上选择退出时程序结束,如图14.1右侧流程图所⽰。
图14.1 程序流程图
14.2 绘图区域
在电脑或者⼿机设备上显⽰的图⽚是由MxN个点组成的,其中的每⼀个点也叫做像素。每个像素⼤⼩⼀致,颜⾊不同。描述颜⾊的⽅法也有很多,在计算机中最常⽤红(RED)、绿(GREEN)、蓝(BLUE)描述⼀个像素点的颜⾊,它们分别代表每种颜⾊的亮度,也称为RGB。
Python编程时,颜⾊常写成含有三个元素的元组,如(0,0,0)的RGB三个值都为0不发光,即⿊⾊,⽽(255,255,255)三个值都为其最⼤值255最强光,即⽩⾊。255是⽤8位⼆进制数所能描述的最⼤值,也就是说每⼀位颜⾊⽤⼀个字节(8位)表⽰,⼀般3个字节描述⼀个像素点,有时也⽤四个值描述,如(255,255,255,255),前三位是颜⾊,最后⼀位是透明度,透明度的范围也是0-255,255为不透明,0为完全透明。
Python编程时,⼀般将窗⼝作为画布绘图,窗⼝左上⾓位置为 (0,0),横坐标在前,纵坐标在后,越向右侧横坐标值越⼤,越向下纵坐标值越⼤。横向常⽤x表⽰,纵向常⽤y表⽰,即(x,y),如图14.2所⽰。
注意:起始坐标从0开始,⽽不是1。
图14.2 绘图区域图⽰
图中的颜⾊区域被描述为 (4,2,3,2),依次是起始横坐标4,起始纵坐标2,宽度3,⾼度2。
14.3 Pygame
在Python环境下编写游戏⽐较简单,三⽅库pygame是常⽤的Python游戏编程⼯具,提供了图像、声⾳的⽀持。
使⽤前需要先安装pygame模块,在Windows下打开:开始->所有程序->Anaconda3的Anaconda Prompt命令⾏,使⽤以下命令安装模块:
01 $ pip install pygame
本讲也通过编写pygame游戏了解图形图像程序的编写过程。下例将在窗⼝中绘制矩形,并根据⽤户输⼊的上下左右按键移动矩形的位置。
01
第01-02⾏引⼊模块。
第04⾏初始化pygame模块。
第05⾏设置窗⼝⼤⼩。
第07-08⾏创建变量⽤于设置和存储矩形位置。
第09⾏为主循环,确保窗⼝⼀直显⽰,直到程序退出。
第10-22⾏响应⽤户操作。
第11⾏响应退出事件,当⽤户关闭游戏窗⼝时,此事件被触发。
第12⾏释放游戏资源。
第13⾏退出程序。
第14⾏响应键盘按下事件。
第15-22⾏对键盘的上下右左右四个按钮分别处理,改变x,y值。
第23⾏将窗⼝背景绘制为⿊⾊。
第24⾏设置⼀个矩形区域,四个参数分别指定矩形起点的x坐标、y坐标、宽度和⾼度分别为100。
第25⾏在窗⼝上绘制该矩形,函数的第⼀个参数指向绘制窗⼝,第⼆个参数指定颜⾊为红⾊,第三个参数指定绘制位置,第四个参数指定区域内部填充颜⾊。
第26⾏⽤flip⽅法更新显⽰区域,此时绘制出来的图像被显⽰在窗⼝之中。
第27⾏y值增加,使得在⽤户不按键的情况下,红⾊矩形也向下移动。
本例中的程序类似于游戏“俄罗斯⽅块”,下⼀讲将从⽹络下载真正的“俄罗斯⽅块”游戏代码,进⼀步学习编写此类⼩游戏的技能。
课后练习:(练习答案见本讲最后的⼩结部分)
课后练习:
练习⼀:请在窗⼝中绘制背景为⽩⾊,前景为绿⾊的⽶⽼⿏头像,如图14.3所⽰,按任意键退出程序。
提⽰:画圆的⽅法是:
pygame.draw.circle(画布, 颜⾊, 圆⼼点, 半径, 填充⽅式)
例如: pygame.draw.circle(screen, (0,255,0), (100,100), 50, 0)。
与绘制矩形不同,绘制矩形需要指定矩形左上⾓坐标(横坐标、纵坐标)、宽和⾼,绘制圆形指定的是圆⼼点坐标(横坐标100、纵坐标100),圆的半径50。
图14.3 绘制⽶⽼⿏效果图
14.4 Git软件管理
Git是分布式版本控制系统。当编写软件时,在不同的开发阶段可能需要保存多个版本的代码和数据。使⽤Git可以管理数据和代码的不同版本。
GitHub是⼀个⾯向开源及私有软件项⽬的托管平台,它是远程的服务器,开发者可以将⾃⼰的代码上传到GitHub服务器,供他⼈下载,或者仅供⾃⼰和有限的⼏个⼈可见。可供所有⼈下载的软件和数据叫做“开源软件”;仅⾃⼰可见的叫作“私有软件”。⽬前Github拥有超过900万开发者⽤户,⼤量可以下载的⾼质量代码。
本讲将介绍从GitHub下载他⼈公开的游戏代码,从中学习游戏的编写⽅法。
14.4.1 安装Git软件
软件安装成功之后可从Windows开始菜单中打开,开始->所有程序->Git->Git Bash,此时Git命令⾏被打开。
14.4.2 下载游戏代码
使⽤以下命令下载程序源代码,如图14.1所⽰:
01 $ git clone github/lovetianya/pygame-development.git
图14.4 下载项⽬的代码
pygame-development是GitHub上的开源游戏代码,其中实现了俄罗斯⽅块、贪吃蛇等⼩游戏。
⽤pwd命令可以看到当前⽬录,程序代码下载到了当前⽬录之中,其中的els⽬录中是实现俄罗斯⽅块的代码和相关的资源,如图14.5所⽰。font⽬录下是游戏中⽤到的字体,pictures⽬录下存储的是图⽚,run-this.py是⽤Python编写的程序源码,⽤Spyder打开它,或者复制到Jupyter Notebook中即可运⾏。此处建议⽤Spyder打开程序并运⾏(开始->所有程序->Anaconda3->Spyder)。
图14.5 俄罗斯⽅块相关资源
课后练习:
练习⼆:运⾏游戏“俄罗斯⽅块”、“贪吃蛇”、“五⼦棋”,并阅读其源代码,到其中的主循环、按键响应、以及绘图的相关代码。14.5 思维训练
14.5.1 举⼀返三
上⼀讲提到了通⽤⼈⼯智能AGI,即建⽴拥有⼴泛且适应性强的智能,其中包括将学习到的有限知识应⽤到更多的领域之中。本部分来探讨⼈类如何实现了举⼀返三。
1.常识系统
机器不能像⼈⼀样思考或者我们认为机器缺乏创造⼒,很⼤程度上是因为没有常识系统,⽬前的机器学习模型,⼀般都针对具体单⼀的功能,写⽂章的只懂写⽂章,识别图像也只关注图像本⾝,⽐如GPT-2模型通过学习所有⾦庸先⽣的⼩说,撰写了如下的⽂字。
图14.6 模型⽣成⽂本
如果读过《天龙⼋部》这部⼩说就不难发现,虽然在语⾔风格上问题不⼤,但⼈物关系不太正常。这是因为模型只模仿了⽂章的语⾔风格,模型通过学习阅读⼤量⽂字,根据前⽂计算下⼀个字最可能是什么,但它不知道“段誉”究竟是什么意思;以及段誉和王语嫣之间是什么关系。
写作的⼈将脑中的思维框架转换成⽂字,并试图在读者脑中构建起类似的结构,其中包含⼤量的常识和背景知识,⽐如通过故事发⽣的时间、地点、氛围、故事风格,激活读者脑中的某种场景,这些都是⽂字之外的信息。思维中故事的框架是多层次的⽹络,⽽机器所识别的⽂字只是相对扁平的结构。
⼈在成长中构建起丰富的常识系统。知识⾯越宽⼴,经验越丰富,就越具有优势。
2.⽣成框架
解决问题的框架,或者叫作流程、套路,就像是程序中的函数。把某种功能封装在函数之中,在之后遇到同样问题时,就可以直接使⽤。
写程序处理问题的过程可细分成:获取、整理、使⽤。如果要实现某⼀功能,⾸先,要到需要的数据⽐如Excel表;以及处理数据⽤到的⽅法如安装第三⽅库;有了这些基本元素之后,开始编写成程序,然后运⾏程序实现功能。
除了这些基本步骤以外,有经验的程序员在程序正常运⾏之后,还会对程序做进⼀步优化:
让程序变得可重⽤:⽐如把其中的各部分功能拆分成函数,以便之后在其它场合继续使⽤。函数除了能满⾜当前需要的功能,还要考虑满⾜未来的扩展功能。
优化程序运⾏速度和程序结构:⽐如功能类似的函数是否可以合⼆为⼀。
加强程序的健壮性,在遇到⼩问题时也能正常使⽤。
规范化格式以及命名,加⼊注释,使程序更加清晰易懂。
同样道理,在学习和实践之后,我们也需要反思:是不是可以做得更好?还需要做出哪些调整,或者加强训练;能否从复杂的过程中提取出⼏个重要经验模块?这些经验还可以⽤到什么场合?
在编写函数、整理代码的过程中,就可以很好地训练这⽅⾯的能⼒。
3.拆分
处理复杂问题时,⼏乎不会遇到两次完全相同的情况,但可能遇到过程中的某⼀部分与之前的经验重合。就像本讲的练习中画出⽶⽼⿏头像可能让⼈觉得毫⽆头绪,但是拆开看,⽶⽼⿏头由三个相互重叠的圆形组成。
解决复杂问题通常需要:拆分成单个问题、解决单个问题、处理各个问题之间的关系。调试程序也是同样道理,如果不能确定整体程序在什么位置出错,分块调试也是有效的⽅法。
4. 相似性
相似性
对⽐和类⽐也曾被认为是⼈类特有的灵性。⼆者有⼀个共同的特点,就是被⽐较的两者之间⼀定存在共性。类⽐很容易理解,⽐如把⼀⽚落叶⽐做蝴蝶,因为它们在风中具有相似的姿态。⽽对⽐也需要共性,虽然⾼和矮完全不同,但它们描述的都是长度。
从总结规律的⾓度看,只要⼀种规则反复出现,就可以被提取;从使⽤的⾓度看,由于具有相似性,可以使⽤已有的经验处理未知的情况。
5.代⼊框架和迁移学习
很多⼈死读书,虽然记住了,但是场景稍有变化就不会使⽤。下⾯来看看机器是如何实现迁移学习,在不同的场景之中使⽤旧有的技能。
迁移学习是⼈⼯智能领域近⼏年的热门⽅法,⽐如它先使⽤⼤量图⽚训练模型,训练出了模型对于图⽚的常识,包括对明暗、边⾓、形状等等,如果最终需要识别图中的⽔果,在使⽤之前,再⽤少量的⽔果图⽚进⼀步训练模型即可使⽤。
可以说迁移学习的本质是使⽤⼤量数据训练常识,再加⼊微调。将已有的常识和当前的场景结合起来,解决当下的问题。通过对⽐相似性,使⽤旧框架,如果⽆效,也可以使⽤少量新数据训练调整旧有框架。
当头脑中存储了⼤量框架,并且整理成清晰的结构,就更容易和当前场景结合。
好⽅法事半功倍,但再好的⽅法也需要练习。
14.5.2 创新
⼈们常常认为机器在创新和想象⽅⾯⽆法超越⼈类?是否真是这样?让我们先来看看机器在棋类⽐赛中的表现。早在20年前,IBM的深蓝就打败了国际象棋⼤师,这已不再是什么新闻。在2017年10⽉在《科学》杂志上发表了⼀遍关于AlphaZero的论⽂,它的惊⼈之处在
于,AlphaZero⽆需⼈类指导,仅仅通过⾃⼰与⾃⼰对弈,就快速地理解了国际象棋的规则,成为了⽬前为⽌最好的棋⼿。
⽐胜利更重要的是,AlphaZero是⾃学成材,它具有⾃⼰的洞察⼒,⽽⾮被⼈教会,⽽且它还⾃创了⼀些出乎⼈们意料的策略,以致于,在后来的⼈类⽐赛中,如果有⼈出现⾮常精妙的⾛法,都可能被怀疑是使⽤计算机作弊。
再来看看什么是创新,申请专利时把创新分为三种:
第⼀种是发明专利,它是针对产品和⽅法产⽣新技术⽅案。就像爱迪⽣发明电灯,他通过1000多次不同材料的实验;⽽现今,科学家利⽤虚拟现实和分⼦技术,极⼤地优化了实验过程。⽐如在荷兰代尔夫特理⼯⼤学,正尝试使⽤贝叶斯模型寻⼀种聚合物排列⽅法,使材料变得坚固、轻量和可折叠。
第⼆种是实⽤新型专利,它是对产品的构造、结构、形状提出更加实⽤的新⽅案。就像⽡特发明蒸汽机的故事,实际上⽡特并⾮蒸汽机的发明者,⽽是蒸汽机的改造者,应该说他发明了第⼀台有实⽤价值的蒸汽机。这种创新以优化和改造为主。
第三种是外观设计专利,这种专业偏重设计,与艺术相关,⽬前⼈⼯智能已经可以画慢画、谱曲、写作、创造各种艺术作品,也有⼈说,机器主要偏重模仿,没有艺术家的灵魂。⽽从上⾯武侠⼩说的例⼦可以看到,⽬前机器学习的模仿效果已经⾮常强⼤。BERT模型也可被⽤于⽣成故事的简介。如果模型学到了⼈物的关系,以及创建故事的规则,理论上也能编写故事。
spyder python下载⽆论是修改旧⽅法还是创造新⽅法,都⽤到猜谜原则(试错),不断试错,其具体⽅法是随机修改重要特征,看是否解决了问题,或者效果是否变得更好。进⽽拆成⼩块不断式错,向⽬标靠近。在穷举⽅⾯,机器胜过⼈类。⽽相⽐之下,⼈类在常识和解决复杂问题⽅⾯更占优势。
这些⽅法能让机器学会,不论天赋,更何况是正常⼈类。真实世界⽐棋盘上的可能性多得多,⽆法通过单纯的试错学习。在当前阶段,⼈机结合往往能达到最好的效果。⼈负责定义问题,构建和管理整体结构,⽽机器负责具体的⼯作。⽐如:某⼈想到了⼀个很好的故事,但⽂笔不够好,通过与机器结合,就能达到更加完美的写作效果。
14.6 ⼩结
14.6.1 单词
本讲需要掌握的英⽂单词如表14.1所⽰。
表14.1本讲需要掌握的英⽂单词
14.6.2 习题答案

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。