35956| 6
|
[M10教程] 【行空板图形化Python入门教程】第05课:密室逃脱游戏 |
本帖最后由 Doughnut 于 2022-10-28 13:56 编辑 第05课:密室逃脱游戏 密室逃脱——顾名思义就是从一间封闭的房子里面逃出来,玩家在游戏过程中需要保持头脑清醒,根据提示找到钥匙,打开房门让自己脱离险境。怎么样,是不是迫不及待地想要试试这个奇妙的游戏了。本节课,我们就来学习一下如何制作一款密室逃脱的游戏,体验不一样的游戏旅程。 任务目标 游戏场景设置:利用各种图片,布置密室场景,并将钥匙藏在地毯下面。 游戏机制设置:需要找到藏在家具中的钥匙,将钥匙移动到门锁位置,房门打开。 知识点 1. 掌握比较运算符与逻辑运算符的使用方法 2. 理解程序中的变量和全局变量概念 3. 认识程序中的条件语句结构 4. 认识行空板屏幕鼠标 5. 掌握使用鼠标控制图片移动的方法 材料清单 1. 硬件清单 行空板x1 Type-C&Micro二合一USB线x1 2. 软件清单 Mind+编程软件x1,下载地址:https://www.mindplus.cc 动手实践 密室逃脱的游戏看起来很难,但只要将逻辑理顺了其实很容易实现的。游戏的实现主要是设置游戏场景,根据不同的游戏场景设定一些游戏机制。接下来,根据布置游戏场景与设定游戏机制这两个任务,实现一个简单的密室逃脱游戏吧! 任务一:布置游戏场景 在这个任务中,需要将不同背景、门、地毯等图片在指定位置显示,并将钥匙藏在地毯下。 任务二:设定游戏机制 学习行空板触控移动图片的方法,找到钥匙后,将钥匙移动到门锁位置,打开房门完成游戏。 任务一:布置游戏场景 1. 硬件搭建 使用USB连接线将行空板连接到计算机。 2. 软件准备 打开Mind+,按照下面图示完成软件准备过程。 3. 编写程序 (1) 观察游戏场景 为了便于理解,这里对游戏场景进行了拆分(如下图),游戏场景可以拆分为密室逃脱背景、门、地毯、钥匙。 接下来对图片在屏幕上的位置进行分析,为了方便理解,会用虚线的矩形框将图片框出来,标注红点的位置就是图片在行空板上的(X,Y)坐标位置。 将游戏场景中要用到的图片,从图片素材文件中加载进项目。 拆分后发现,游戏场景布置中,主要是设置图片在不同的位置进行显示,因此这个任务是对图片的操作。 你还记得在行空板的屏幕上显示图片的指令吗?对象名 显示图片 在X0Y0。 首先在屏幕上显示密室逃脱的背景图片,在 Python主程序开始 下面增加显示图片指令。 注意:程序中,显示图片的名称要与项目文件中的图片名保持一致。 (2)调节图片比例 运行上面的程序,发现背景并没有完全显示屏幕上,只能看到图片的一部分。因为行空板屏幕尺寸为240*320,图片的尺寸为896*1109,行空板屏的显示比图片尺寸小,所以只能显示部分图片。 让行空板完整地显示图片有两种方法: 1) 在图片处理软件中,将图片的尺寸处理为240*320(这种方法需要图片处理软件)。 2) 在显示图片指令下,添加指令 更新对象名 的数字参数高为修改图片的显示比例。 注意观察原图的右侧与行空板上显示图片的右侧有什么区别。 为什么按照上面的方式修改了图片的显示比例后,行空板上还是不能显示完整的图片呢? 关于图片显示的缩小比例有一个换算公式: 缩小比例=原图片(高)/行空板屏幕尺寸(高) 下面就用这个公式来探究为什么图片按比例缩小后还是显示不完整的问题。 将图片尺寸代入公式进行换算: 缩小比例=1109/320,算出来的缩小比例约为3.5倍,也就是图片整体缩小3.5倍。缩小3.5倍后,图片宽变为896/3.5,缩小后的图片尺寸约为256*320。行空板显示尺寸240*320,因此图片右侧会有一小部分不能显示。 门、锁、地毯图片以同样的方式进行设置。 完整代码如下: 4. 程序运行 点击运行,程序运行成功后,行空板屏幕显示效果如下图。 任务二:设定游戏机制 1. 编写程序 上个任务,已经将游戏场景布置好了,并且钥匙也藏在了地毯下。游戏规则是,找到钥匙,将钥匙移动到门锁位置,房门打开。 (1) 钥匙出现 钥匙被我们藏在了地毯下,点击地毯出现钥匙。触发的对象就是地毯,需要给地毯图片增加一个点击的回调函数。 图片触发回调函数的方式与按钮回调函数的方式一样,都是通过点击屏幕。 不同的是图片触发回调函数需要为图片对象创建一个回调函数名,使用指令 对象名 的点击回调函数为button_click1。 点击地毯图片后,触发的指令是 更新对象名 tan 的数字参数 x为50,让地毯向右移动50,将钥匙漏出来。 注意:对象名 的点击回调函数为button_click1 需要和 当点击回调函数button_click1 搭配使用,并且回调函数名要保持一致。 (2)行空板屏幕鼠标 怎么才能移动钥匙呢?其实在行空板屏幕上点击图片和点击按钮,使用的都是行空板屏幕鼠标功能。当然移动钥匙也可以通过行空板屏幕上的鼠标进行移动,控制鼠标的图形化指令为 当接收到鼠标移动事件 返回坐标XY,指令中的参数如下图。 既然想到了用鼠标移动钥匙,那应该怎样去控制呢?可以让钥匙跟随鼠标一起移动,将钥匙的坐标更改为鼠标的坐标就可以,使用指令 更新对象名 的数字参数y为 ,具体实现方法如下。 (3) 判断游戏胜利 游戏胜利有一个判断的标准,在密室逃脱这个游戏中,游戏胜利的标准是当钥匙移动到门锁位置时,房门打开。关键是钥匙移动到什么位置,门才能打开呢?下面来分析一下门锁对应在行空板上的位置。 门锁对应行空板y轴的坐标大约为150-200,因此需要判断钥匙的y坐标是否在150-200之间,如果在y坐标150-200之间,执行删除对象door,删除对象key。 判断钥匙的位置需要用到运算符中的比较运算符“>”和比较运算符“<”以及逻辑运算符“与”。 注意:关于运算符的介绍见“知识园区”。 (4) 完善游戏 游戏的功能已逐个实现,但在游戏过程中,出现了游戏漏洞。游戏中,点击屏幕任一位置都会出现钥匙,是因为 鼠标移动事件的程序 与 点击回调函数程序 的执行没有先后顺序,即使游戏过程中没有触发地毯,只要点击屏幕,鼠标移动事件都会执行。 要让这两个程序的执行有先后顺序,可以通过新建 变量 来决定该程序是否执行。接下来,就先新建一个名称为flag的变量。 注意:关于“变量”的介绍见本课知识园地。 完整程序如下: 2. 程序运行 点击运行,程序运行成功后,就可以开始玩游戏了。只有当你点击地毯后,才会出现钥匙,然后将钥匙拖动到门锁位置,房间门打开,游戏完成。 3. 试一试 学习了如何移动钥匙后,程序中实现的是移动钥匙y坐标,钥匙只能上下移动,不能左右移动。接下来就一起修改程序,实现钥匙随鼠标触发实现上下左右随意移动。 知识园地 1. 运算符 运算符是用于执行程序代码运算,会针对一个以上的操作数项目来进行运算。 例如:3+2,其中操作数是3和2,运算符则是“+”。在Mind+中,运算符大致可分为6种类型:算术运算符、位运算符、比较运算符、逻辑运算符、求字节数运算符、条件运算符。 这节课中用到了比较运算符和逻辑运算符,因此重点介绍一下这两种运算符,如果后续使用到其他运算符,课程中会对该运算符进行详解的介绍。 (1) 比较运算符 在代码中是用作判断的,用于对常量、变量或表达式的结果进行大小比较。比较运算符返回的结果只有两种,true和false。 比较运算符“>”,如果变量Y大于150,返回true(真),否则返回false(假)。 比较运算符“<”,如果变量Y小于200,返回true(真),否则返回false(假)。 比较运算符“=”,如果变量flag等于1,返回true(真),否则返回false(假)。 (2) 逻辑运算符 用于对程序中的逻辑值进行运算,逻辑值也只有两种,true和false。逻辑运算符有三个,分别为与、或、非,对应的程序模块如下图: 从模块可以看出来,逻辑运算符“与”和逻辑运算符“或”,必须要有两个操作数才能进行运算,因此“逻辑与和逻辑或”又称为双目运算符。逻辑运算符“非”称为单目运算符,只要求一个操作数就可以进行运算。 逻辑运算符“与” 只有当两个操作数的值都为真时,运算结果为true(真),否则为false(假)。例如:当Y=180时,Y>150并且Y<200,那下面整个逻辑表达式的逻辑值为true(真)。这个“与”就相当于日常生活中表达的“并且”。 逻辑运算符“或” 只要其中一个操作数的值为真时,运算结果就为true(真),当两个操作数的值都为假时,运算结果为false(假)。逻辑运算符“或”,就相当于生活中我们说的“或者”。 逻辑运算符“非” 只对一个操作数的值进行运算,当操作数的值为真时,逻辑运算结果为false(假)。当操作数的值为假时,逻辑运算结果为true。 2.变量与全局变量的概念 (1) 什么是变量? 为了便于理解,我们可以将变量看作是一个盒子,给变量赋值就相当于往这个盒子里放东西。变量可以重复的赋值,就是说盒子里的东西是可以拿出来的,拿出来后再往盒子里放另一个东西。 这个程序就是给flag变量重复赋值,第一次赋值,相当于在flag这个空盒子里面放入了一个数字0,那么flag的值就为0。第二次赋值时,将0拿出来,再将数字1放入盒子,flag的值为1。 注意:新建变量时,需要给这个变量进行命名,命名时严格遵守变量的命名规则。 1)一般由数字、字母、下划线构成; 2)命名不能使用Python的关键字,即Python中已经有特殊含义的词,如True、False、def、if、elif、else、import等; 3)名称中不能包含特殊字符(\ ` ~ ! @ # $ % ^ & * ( ) + < > ? : , . / ; ‘ [ ]); 4)命名时最好能做到见名知意; (2) 什么是全局变量? 简单地说只要定义一次该变量为全局变量,程序中的其他函数或者循环中都可以使用该变量的值,一直到程序结束。但是如果要修改变量的值,就需要在修改的函数下再次定义为全局变量。 变量又称为局部变量,只能在它所在的函数或循环中使用,并且随函数或循环结束而结束。将变量放入 全局global 指令中,就定义该变量为全局变量。 任务二的程序中,分别在 Python主程序开始 、 当点击回调函数 被触发 、 当接收到鼠标移动事件 返回坐标XY 这三处地方都出现了 变量flag 。 为什么是在 当点击回调函数button_click被触发 中定义变量flag为全局变量呢? 因为 Python 主程序 开始下面给变量flag赋值为0,是在初始化变量,不需要定义为全局变量。在 当点击回调函数button_click被触发 中,需要修改变量,给变量flag赋一个新的值1,因此这个回调函数中需要定义变量flag为全局变量。在 鼠标移动事件 中,也用到了变量flag,但是只用了它的值,没有对变量flag进行修改,所以也不需要定义为全局变量。 3. 条件语句 条件语句是给定一个判断条件,并在程序执行过程中判断条件是否成立,根据判断结果(真或假)执行不同的操作,从而改变程序的执行顺序,实现更多的功能。其中判断条件也可称为表达式,而判断条件既可以是比较运算也可以是逻辑运算。 条件语句嵌套,如果条件语句内部还需要再次应用条件语句时,就可以使用条件语句嵌套。用到了条件语句嵌套时,只有当外层的判断语句结果为真时,才会执行内层的条件判断语句。 4. 指令学习 该指令用于改变指定对象的数字参数,指令中需要写明对象名、参数、以及修改参数值。当参数选择为高或宽时,可以用来修改图片的显示比例。 该指令用于给指定对象增加一个点击的回调函数,指令中需要写明对象名、回调函数名。 该指令需要和设置回调函数指令搭配使用,并且函数名需要保持一致。 该指令用于获取鼠标移动过程中返回的XY坐标,鼠标移动是指点击行空板屏幕,就会触发鼠标事件。 比较运算符“>”,需要两个操作数,当前一个操作数大于后一个操作数时,返回值为true,否则为false。 比较运算符“<”,需要两个操作数,当前一个操作数小于后一个操作数时,返回值为true,否则为false。 比较运算符“=”,需要两个操作数,当两个操作数的值相等时,返回值为true,否则为false。 逻辑运算符“与”,需要两个操作数,只有当两个操作数的值都为真时,运算结果为true,否则为false。 全局变量,将变量放入这个模块中,就定义该变量为全局变量。 挑战自我 游戏场景的设置很简单,就是在行空板屏幕的不同位置显示不同的图片,并更改图片的显示大小。接下来,大家将图片素材文件中的时钟和钥匙串这两张图片也应用于游戏场景的布置吧。在之前的游戏基础上增加游戏难度,比如墙上放置一个时钟,将真钥匙藏在时钟后面,在门边的柜子上放一串假钥匙,用来迷惑玩家。 附件下载 行空板第五课 程序.zip |
© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed