从本章开始,我们会利用3章的内容完成一个较为复杂的经典游戏—贪吃蛇。贪吃蛇的游戏功能是:最开始在舞台中央会有一个只有3节的小蛇,这条蛇会朝一个方向一直移动,我们可以通过方向键来控制蛇的移动方向。蛇在移动过程中会碰到苹果,蛇吃了一个苹果后,身体就会加长一节。随着游戏的进行,蛇的长度会越来越长,因为在控制蛇运动时要保证蛇不能碰到自己的身体和舞台边缘,所以游戏难度也就越来越大,碰到身体或舞台边缘就结束游戏。根据功能描述,我们将这个游戏分为3个环节:蛇的移动、吃苹果和失败检测、界面美化。这一章我们先来实现蛇的移动。在游戏中,蛇的身子是一节一节的,我们用绿色小球角色“Button1”来代替,将其缩放到合适的大小,如图25-1所示。
图25-1 选择“Button1”角色并调整大小通常游戏开始的时候蛇至少有3节身子,不过因为蛇的身子是不断变化的,所以要用克隆功能来生成剩下的部分。生成剩下的两节身子之前,我们先来说一下整个界面的分布,在游戏中蛇是一格一格移动的,所以我们也要将舞台分割成很多小格,这里我是按照20步的间隔来分割舞台的,所以整个舞台就被划分为24×18个格子(因为整个舞台的大小是480×360),对应这24×18个格子,可以用范围在-12~12的水平坐标和范围在-9~9的垂直坐标来表示。基于这个坐标系,绿色小球的位置如图25-2所示。
图25-2 小球在舞台区的位置在程序中,我设定了两个变量—snakeHeadX和snakeHeadY,用来保存蛇头所在的格子的水平坐标和垂直坐标。如果要绘制一个3节的蛇,可以直接通过增加变量的值来实现。假设蛇的位置在(0,0)(1,0)(2,0),则对应程序如图25-3所示。
图25-3 绘制一个3节蛇的程序运行程序时就能看到舞台区出现了3个绿色小球,因为我们增加的是水平方向的变量,所以这3个绿色小球是横着排列的。注意:如果你的3个绿色小球不是紧贴在一起,就需要调整角色的大小,或是改变每一格的尺寸。现在我们已经知道怎么通过复制来生成一条蛇了,不过在目前的情况下,这条蛇既不能移动,也不能变长。为了让这条蛇动起来,我们需要利用Scratch中的列表功能。由于要分别保存蛇身体中每一节的水平坐标和垂直坐标,我们需要建立两个列表snakeX和snakeY。另外我们还需要创建一个表示方向的变量direction以及一个表示序号的变量index(大家之后就能体会序号变量的作用),程序如图25-4所示。
图25-4 创建变量变量和列表创建好之后,我们还要调整一下程序。主要有以下几个方面:首先要将蛇身的坐标添加到列表中,新添加的数据会放在列表的最后;其次是重复执行的次数,原来是2,现在是snakeX的长度(也可以是snakeY的长度,两者的长度是一样的);最后是当角色作为克隆体启动时,克隆体移动到的坐标是依据列表snakeX和snakeY中的数值计算的,因为要根据具体蛇身体的某一节来移动克隆的绿色小球,所以这里要使用变量index来指定列表中相应的数据项。变量Index会从0开始,一直遍历到列表的最后一项。在开始往下完善程序之前,我们先来调整一下目前的程序。在上一章中我们学习了函数的概念,因为贪吃蛇这个程序会比较大,所以我们最好将整个程序分割成几个功能块函数,程序如图25-5所示。这里我们创建了3个函数:“初始化”“移动snake”和“绘制snake”。我们可以通过这3个函数先来梳理一下程序:开始的时候应该进行初始化,包括设定蛇的起始位置和方向等;然后就是在一个“重复执行”指令模块中,不断地移动snake和绘制snake,以达到游戏的效果。图25-6中我们把设定蛇头坐标和蛇身体坐标的指令模块放在“初始化”函数里面。在“移动snake”函数中应该根据方向改变蛇头的坐标,并将现在蛇头的坐标存在列表的第一个位置,同时删掉列表中最后一个坐标数据。程序如图25-6所示。
图25-5 创建3个功能块函数
图25-6 蛇头的程序在“移动snake”函数中,我们是根据变量direction来移动蛇头的,变化之前先将蛇头坐标插入列表的第一位。之后移动蛇头,假设direction等于0表示方向向左,则当蛇往左移动时,蛇头的垂直方向是不变的,而水平方向的格数会减小一格。这次我们还调整了“初始化”函数以及[插图] 被点击时运行的程序。我们在“重复执行”指令模块中添加了一个“等待0.6秒”指令模块,目的是让贪吃蛇不要移动得太快。在“初始化”函数中,首先删除了两个列表中的所有数据,然后才将坐标位置添加到列表中,最后设定变量direction的值为0。接着是“绘制snake”函数,这里我们直接将之前与克隆相关的程序放在函数中,如图25-7所示。此时运行这个程序,就会发现贪吃蛇开始往左移动了,不过现在这条蛇在不断地增长,但是我们会发现列表的长度并没有增加。这是什么原因呢?
图25-7 修改“绘制snake”函数贪吃蛇变长的原因是:虽然我们在列表中删除了最后一项,但是之前由这个坐标克隆产生的绿色小球并没有消失。这里我采用一个比较简单的方法来处理这个问题,就是在克隆体产生后等待一段时间就把自己删除,程序如图25-8所示。
图25-8 删除多余的克隆体因为在[插图] 被点击时等待的时间是0.6秒,所以这里的等待时间设定的也是0.6秒。此时,当你运行程序时就会看到一个3节的小蛇在不断地往左移动。你可能会下意识地按下键盘上的方向键,不过马上就会发现并没有什么用。要想用键盘来控制这条蛇,我们还要接着往下进行编程。按照之前的功能描述,我们是通过键盘上的方向键来实现控制的,在程序中只需要改变变量direction的值就可以了。之前我们设定0表示左,现在设定1表示上、2表示右、3表示下。程序如图25-9所示。
图25-9 控制方向的程序相应地,要修改“移动snake”函数中的程序,如图25-10所示。
图25-10 修改“移动snake”函数的程序这里增加了3个对direction的值的判断,即分别处理上、下、左、右方向上的移动,上、下方向上变化的是变量snakeHeadY,左、右方向上变化的是变量snakeHeadX。程序完成后,运行一下,此时你就能够通过按键来控制这个只有3节的贪吃蛇了,如图25-11所示。
图25-11 程序运行效果
发表评论 取消回复