版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
+硬件趣学Python编程
数字游戏通通过,2048的游戏制作牛艾科技目录ContentsSuccessWords2第二部分全局变量和局部变量第三部分模块的导入第四部分游戏基本设计思路第五部分2048的代码分析第一部分认识函数目录ContentsSuccessWords3第一部分认识函数4认识函数函数是一段具有特定功能的、可重用的语句组,用函数名来表示并通过函数名完成功能调用。函数也可以看作一段具有名字的子程序,可以在需要的地方调用执行,不需要在每个执行地方重复编写这些语句。每次使用函数可以提供不同的参数作为输入,以实现对不同数据的处理;函数执行后,还可以反馈相应的结果。函数能够完成特定功能,与黑盒类似,对函数的使用不需要了解函数内部实现原理,只要了解函数的输入输出方式即可。严格说,函数是一种功能抽象。
5认识函数使用函数主要有两个目的:降低编程难度和代码重用。函数是一种功能抽象,利用它可以将一个复杂的大问题分解成一系列简单的小问题,然后将小问题继续划分成更小的问题,当问题细化为足够简单时,就可以分而治之函数可以在一个程序中多个位置使用,也可以用于多个程序,当需要修改代码时,只需要在函数中修改一次,所有调用位置的功能都更新了,这种代码重用降低了代码行数和代码维护难度。
Python定义一个函数使用def保留字语法形式如下:def<函数名>(<参数列表>):<函数体>return<返回值列表>
6认识函数函数调用和执行的一般形式是:
<函数名>(<参数列表>)此时,参数列表中给出要传进入函数内部的参数,这类参数称为实际参数,简称为“实参”。
7认识函数程序调用一个函数需要执行以下四个步骤:(1)调用程序在调用处暂停执行;(2)在调用时将实参复制给函数的形参;(3)执行函数体语句;(4)函数调用结束给出返回值,程序回到调用前的暂停处继续执行。8认识函数在定义函数时,如果有些参数存在默认值,即部分参数不一定需要调用程序输入,可以在定义函数时直接为这些参数指定默认值。当函数被调用时,如果没有传入对应的参数值,则使用函数定义时的默认值替代,例如:9认识函数在函数定义时,也可以设计可变数量参数,通过参数前增加星号(*)实现。带有星号的可变参数只能出现在参数列表的最后。调用时,这些参数被当作元组类型传递到函数中,实例如下:vfunc()函数定义了可变参数b,调用vfunc()函数时输入的(2,3,4,5)被当作元组传递给b,与a累加后输出。第6.1节将详细介绍元组类型,这里请读者将元组理解为一组元素。10认识函数Python提供了按照形参名称输入实参的方式,函数调用如下:
result=func(x2=4,y2=5,z2=6,x1=1,y1=2,z1=3)由于调用函数时指定了参数名称,所以参数之间的顺序可以任意调整。return语句用来退出函数并将程序返回到函数被调用的位置继续执行。return语句同时可以将0个、1个或多个函数运算完的结果返回给函数被调用处的变量,例如。目录ContentsSuccessWords11第二部分全局变量和局部变量12全局变量和局部变量一个程序中的变量包括两类:全局变量和局部变量。全局变量指在函数之外定义的变量,一般没有缩进,在程序执行全过程有效。局部变量指在函数内部使用的变量,仅在函数内部有效,当函数退出时变量将不存在。例子如下。13全局变量和局部变量这个例子说明,当函数执行完退出后,其内部变量将被释放。如果函数内部使用了全局变量呢?例子如下如果希望让func()函数将n当作全局变量,需要在变量n使用前显式声明该变量为全局变量,代码如下14全局变量和局部变量简单数据类型变量无论是否与全局变量重名,仅在函数内部创建和使用,函数退出后变量被释放,如有全局同名变量,其值不变;简单数据类型变量在用global保留字声明后,作为全局变量使用,函数退出后该变量保留且值被函数改变;目录ContentsSuccessWords15第三部分模块的导入16模块的导入模块是Python中的最高级别组织单元,它将程序代码和数据封装起来以便重用Python源代码文件:*.py一个py文件是一个模块(module)多个模块可以组成一个包(package)模块1函数类模块2函数类包17模块的导入导入从本质上讲,就是在一个文件中载入另一个文件,并且能够读取那个文件的内容。一个模块内的内容通过这样的方法其属性(object,attribute)能够被外界使用模块的方式非常简单,在"import"后加上"模块名称"就可以了。通过这一句,计算机就在指定的位置找到了"numpy.py"文件,并准备好该文件拥有的之后会用到的函数和属性。在导入"numpy"后,我们就可以通过点符号"."连接模块名称和函数名,使用该模块中的函数和属性。18模块的导入指定的方式是采用"import模块名称as别名"。我们可以将"numpy"简记为"np",并且在调用时,直接使用"np"就可以:目录ContentsSuccessWords19第四部分游戏基本设计思路20游戏基本设计思路画背景棋盘
2048的棋盘是一个4*4的网格,网格内放置数字,下面应该有一个记分统计。
20200160000320000128游戏得分:18021游戏基本设计思路数字矩阵-右移202001681603232000012800040168160006400012822游戏基本设计思路数字矩阵-左移202001681603232000012840001681606400012800023游戏基本设计思路数字矩阵-上移21620016320003200001282322128006400000000024游戏基本设计思路数字矩阵-下移21620016320003200001280000000000202326412825游戏基本设计思路随机产生数字2和4
在移动的同时在值为0的位置上随机的产生数字2和数字4例如:下移的同时随机产生2和421620016320003200001280020400000202326412826游戏基本设计思路胜利条件(可选)1、当出现2048这个数字时游戏胜利并结束
2、没有胜利终止条件,只看成绩分值失败条件
棋盘填满数字,无法再进行变换,也就是变换之后的矩阵和变换前的相同,则游戏结束目录ContentsSuccessWords27第五部分2048代码分析28贪吃蛇的代码分析画背景网格
主要使用方法:
1、渲染背景颜色display.fill(color)#参数为背景颜色
2、画矩形边框display.fill_cell(x,y,w,h,color))
#x:左上角顶点横坐标,y:左上角顶点纵坐标,w:宽度,h:高度,color:颜色
3、输出文本display.text(text,x,y,colorf,colorb)
#text:文本,x:左上角顶点横坐标,y:左上角顶点纵坐标,colorf:前景颜色,colorb:背景颜色29贪吃蛇的代码分析画背景网格def__init__(self,x=10,y=10,w=222,h=222):self.x=xself.y=yself.w=wself.h=hself.width=w//55-1self.height=h//55-1self.bg=color565(0x00,0x00,0x00)display.fill(self.bg)self.initial()初始化参数初始背景颜色渲染背景颜色调用函数渲染每个网格30贪吃蛇的代码分析画背景网格definitial(self):foriinrange(0,4):forjinrange(0,4):x=i*55+self.x+1y=j*55+self.y+1display.fill_cell(x,y,55,55,color565(0xff,0xff,0xff))双重循环渲染4*4的网格defdraw(self,pos,color,text):x=pos[0]*55+self.x+20y=pos[1]*55+self.y+20display.fill_rectangle(x,y,30,30,color565(0x00,0x00,0x00))display.text(text,x,y,color,color565(0x00,0x00,0x00))将网格坐标转换为实际坐标31贪吃蛇的代码分析画背景网格defprintscore(self,text,score):display.text(text,50,250,color565(0xff,0x00,0x00),color565(0x00,0x00,0x00))display.text(str(score),150,255,color565(0xff,0x00,0x00),color565(0x00,0x00,0x00))输出网格下面的文字,在(50,250)输出文字在(150,255)输出成绩32贪吃蛇的代码分析数字矩阵类class
Matrix(object):def__init__(self,grid):self.grid=gridself.matrix=[[0foriinrange(4)]foriinrange(4)]self.matrix_o=[[0foriinrange(4)]foriinrange(4)]self.vacancy=[]self.gamewin=False#使用一个字典将数字与其对应的颜色存放起来self.color={0:color565(0xff,0xff,0xff),2:color565(0x00,0x00,0xff),4:color565(0x00,0xff,0x00),8:color565(0xff,0x00,0x00),16:color565(0xff,0xff,0x00),32:color565(0xff,0x00,0xff),64:color565(0x00,0xff,0xff),128:color565(0xff,0x00,0x00),256:color565(0xff,0x00,0x00),512:color565(0xff,0x00,0x00),1024:color565(0xff,0x00,0x00),2048:color565(0xff,0x00,0x00)}声明了两列表,matrix表示当前的矩阵,matrix_o表示变换前的矩阵vacancy列表用来存值为0的点color元祖用来存各种数字对应的颜色33贪吃蛇的代码分析数字矩阵类defvoid(self):self.vacancy=[]forxinrange(0,4):foryinrange(0,4):ifself.matrix[x][y]==0:self.vacancy.append((x,y))returnlen(self.vacancy)defgenerate(self):pos=choice(self.vacancy)ifrandint(0,5)==4:self.matrix[pos[0]][pos[1]]=4else:self.matrix[pos[0]][pos[1]]=2delself.vacancy[self.vacancy.index((pos[0],pos[1]))]双重循环遍历矩阵,当发现值为0的点时将坐标加到vacancy列表中vacancy列表删除新生成的点的坐标在vacancy列表中取随机的点,并根据随机数的值来判断生成的是2还是434贪吃蛇的代码分析矩阵上移defup(self):ss=0foriinrange(0,4):forjinrange(0,3):s=0ifnotself.matrix[i][j]==0:forkinrange(j+1,4):ifnotself.matrix[i][k]==0:ifself.matrix[i][j]==self.matrix[i][k]:ss=ss+self.matrix[i][k]self.matrix[i][j]=self.matrix[i][j]*2ifself.matrix[i][j]==2048:self.gamewin=Trueself.matrix[i][k]=0s=1breakelse:breakifs==1:breakforiinrange(0,4):s=0forjinrange(0,3):ifself.matrix[i][j-s]==0:self.matrix[i].pop(j-s)self.matrix[i].append(0)s=s+1returnss循环遍历所有的点,s为判断标志重新调整将,将矩阵上移,并将值为0的点删除,在尾部添加补全发现某个位置的值不为0时,循环遍历这列当前节点之下的所有位置当发现临近的点的值和当前的值相等时则翻倍当到达2048时则结束游戏35贪吃蛇的代码分析矩阵上移2322000640000000012823221280064000000000循环遍历非零值遇到相同的累加不同的非零值则结束这一列的遍历最后调整整个矩阵,将值全部上移后面的补036贪吃蛇的代码分析矩阵左移defleft(self):ss=0foriinrange(0,4):forjinrange(0,3):s=0ifnotself.matrix[j][i]==0:forkinrange(j+1,4):ifnotself.matrix[k][i]==0:ifself.matrix[j][i]==self.matrix[k][i]:ss=ss+self.matrix[k][i]self.matrix[j][i]=self.matrix[j][i]*2ifself.matrix[j][i]==2048:self.gamewin=Trueself.matrix[k][i]=0s=1breakelse:breakifs==1:breakforiinrange(0,4):s=0forjinrange(0,3):ifself.matrix[j-s][i]==0:forkinrange(j-s,3):self.matrix[k][i]=self.matrix[k+1][i]self.matrix[3][i]=0s=s+1returnss循环遍历所有的点,s为判断标志重新调整将,将矩阵左移,并将值为0的点删除,在尾部添加补全发现某个位置的值不为0时,循环遍历这行当前节点右边的所有位置当发现非零值和当前的值相等时则翻倍,发现不相等的非零值则结束循环当到达2048时则结束游戏37贪吃蛇的代码分析下移和右移代码与上面相似游戏控制defkey_release(self,key):keymatch=["Down","Left","Up","Right"]ifkeymatch[key]=="Up":ss=self.matrix.up()self.run(ss)elifkeymatch[key]=="Down":ss=self.matrix.down()self.run(ss)elifkeymatch[key]=="Left":ss=self.matrix.left()self.run(ss)elifkeymatch[key]=="Right":ss=self.matrix.right()self.run(ss)defrun(self,ss):ifnotself.matrix.matrix==self.matrix.matrix_o:self.score=self.score+int(ss)self.grid.printscore("成绩为:",self.score)i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年小学成语故事《对簿公堂》成语科普完整教案
- 审计师(初级)审计理论与实务考前押题卷含答案
- 执业药师(西药)药事管理与法规模拟试卷(含答案解析)
- 初级护师相关专业知识模拟试卷及高频考点总结
- 3 沟通与合作能力
- 2027年工程合同残值二篇
- 2025年看美食节目学法语AI对话教学
- 二级综合医院评审自评报告
- 美甲美睫行业技师薪酬协议2026
- 洗浴中心顾客会员积分兑换协议
- 船舶档案管理办法
- 腰痛病健康教育宣教讲课件
- T/CCAA 39-2022碳管理体系要求
- 山东中医药大学学位考试-中医学毕业综合考试试题及参考答案
- 合肥鼎材科技有限公司光阻车间光刻胶生产线技术改造项目环评报告书
- 信息科技开学第一课课件 哪吒 人工智能 机器人 信息科技
- 社会问题(第三版)课件汇 向德平 第1-7章 社会问题概述 - 人口问题
- 彩钢板房施工方案范文
- (高清版)DB22∕T 1560-2012 农作物种植成本保险查勘定损技术规范总则
- 2025年营养师食品安全及营养健康职业技能及理论资格知识考试题库(附含答案)
- 《第2课 立在地球边上放号》课件 统编版高中语文必修上册
评论
0/150
提交评论