复杂形态钢结构设计培训班

首页 Dino结构笔记-公众号 [每周挑战][编程]贪吃蛇游戏SNAKE编程

[每周挑战][编程]贪吃蛇游戏SNAKE编程

点击【阅读原文】即可得到资料的下载方法:
http://dinochen.com/article.asp?id=276



这是2018年2月第一周的每周挑战,现在才把它整理出来,本集挑战的内容是游戏编程,本章内容非常适用于小学生的STEAM教学,主要讲述一个风迷全球的小游戏是怎么编的。这个游戏就是内置于NOKIA手机的贪吃蛇小游戏。



本次游戏编程只讲述最简单的原理,没有用到优化的算法,速度有点慢。

编程所采用的编程语言还是采用DELPHI,大家可以根据原理采用其它语言如C#进行编制。

那么我们就开始吧。

点击下载此文件:snake的源代码与可执行程序EXE文件


第一步,设计程序界面,如下图所示:



界面的介绍:

(1)中间区是绘图区,实时绘制蛇SNAKE与苹果的位置

(2)右边有两个钟,一个用来实时显示画面,一个用来实时判断蛇的状态,行走,吃东西,撞尾等。

(3)菜单只有一个功能,开始游戏与重新开始游戏

(4)分数显示的LABEL用来实时显示分数

(5)如果游戏结束GAME OVER的label会显示出来


就是这么简单。


第二步:指定贪吃蛇与苹果的变量


TYPE TSNAKE=RECORD

PX,PY:INTEGER;

SX,SY:INTEGER;

DIR:INTEGER;

END;


这么简单的游戏采用TYPE RECORD就可以了。PX,PY是蛇的坐标,而SX,SY可以理解成向X方向与Y方向行走的速度。

DIR就行走的方向,也就是上下左右。这个记录RECORD是很简单的。

蛇要吃的苹果,也就是不断换位置出现的点,它的变量可以设计成如下:


TYPE TFOOD=RECORD

PX,PY:INTEGER;

END;


PX,PY代表苹果的坐标


第二步:设计全局变量


var

  Form1: TForm1;

  SNAKE:TSNAKE;   // 代表蛇头

  SCL:INTEGER;      // 每一个格子的w像素寸 

  FOOD:TFOOD;      // 代表苹果

  TAIL:ARRAY[0..100]OF TSNAKE;  //代表蛇的身体,最多蛇可以有100节身子

  NTAIL:INTEGER;   //身子节的总数量

  SCORE:INTEGER;  //总得分



第三步:点击上下左右后蛇头的反应设计


procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;

  Shift: TShiftState);

begin

  IF (KEY=VK_LEFT) AND (SNAKE.DIR<>2) THEN

    SNAKE.DIR:=1;

  IF (KEY=VK_RIGHT) AND (SNAKE.DIR<>1) THEN

    SNAKE.DIR:=2;

  IF (KEY=VK_UP) AND (SNAKE.DIR<>4) THEN

    SNAKE.DIR:=3;

  IF (KEY=VK_DOWN) AND (SNAKE.DIR<>3) THEN

    SNAKE.DIR:=4;

end;


这一段代码非常好理解了,键盘按下“上”,蛇往上走,但是要注意的是,如果蛇当前就向下走的,按下往“上键 ”,蛇是不能掉头走的。



第四步:最关键的一步,也就是时钟2的进程,每时每刻判断及更新蛇、蛇身与苹果的状态。以下就是全部的代码片:


procedure TForm1.Timer2Timer(Sender: TObject);

VAR I:INTEGER;

    CR:BOOL;

begin

CR:=FALSE;

这个变量是判断蛇尾是不是撞到蛇头


FOR I:=1 TO NTAIL-1 DO

BEGIN

 IF (TAIL[I].PX=SNAKE.PX) AND  (TAIL[I].PY=SNAKE.PY) THEN

 BEGIN

   CR:=TRUE;

   BREAK;

 END;

END;

这个代表:如果蛇头的位置与蛇身的任何一个位置相同,代表撞了,CR变成TRUE


IF CR THEN

BEGIN

 TIMER2.Enabled:=FALSE;

 LABEL3.Visible:=TRUE;

END;


这个代表:CR变成TRUE,代表撞尾了,时钟2停止,GAMEOVER的文字显示出来


FOR I:=NTAIL-1 DOWNTO 1 DO

BEGIN

TAIL[I+1]:=TAIL[I];

END;


这个代表:正常运行时,每个时刻,蛇头前进一步,它的每一格身子的位置等于这个格的前一格的位置,

也就是递推每一格的位置,动态看起来,就好像蛇在移动


TAIL[1].PX:=SNAKE.PX;

TAIL[1].PY:=SNAKE.PY;


这个代表:最后,每一格的蛇身的位置就会等于蛇头的位置


IF SNAKE.DIR=2 THEN

BEGIN

SNAKE.SX:=1;

SNAKE.SY:=0;

END;

IF SNAKE.DIR=1 THEN

BEGIN

SNAKE.SX:=-1;

SNAKE.SY:=0;

END;

IF SNAKE.DIR=4 THEN

BEGIN

SNAKE.SX:=0;

SNAKE.SY:=1;

END;

IF SNAKE.DIR=3 THEN

BEGIN

SNAKE.SX:=0;

SNAKE.SY:=-1;

END;


这个代表:蛇不同的运动方向,蛇两个坐标的运动速度,例如,如果蛇向左运动

它的X方向的速度是(-1),而它的Y方向的速度就是(0)


SNAKE.PX:=SNAKE.PX+SNAKE.SX;

SNAKE.PY:=SNAKE.PY+SNAKE.SY;


这个代表:蛇有了两个方向的速度,更新的蛇头位置就是:新坐标=旧坐标+移动速度


IF SNAKE.PX>20 THEN SNAKE.PX:=0;

IF SNAKE.PY>20 THEN SNAKE.PY:=0;

IF SNAKE.PX<0 THEN SNAKE.PX:=20;

IF SNAKE.PY<0 THEN SNAKE.PY:=20;


这个代表:由于游戏的空间只有20个格子,如果蛇向右走到尽头,就会晚时空隧道一样从最左边出来

这也是原始的SNAKE游戏的设置,当然你也可以设计边界


IF (SNAKE.PX=FOOD.PX) AND (SNAKE.PY=FOOD.PY) THEN

BEGIN

ADD_TAIL;

RANDOMIZE;

FOOD.PX:=ROUND(1+RANDOM*18);

FOOD.PY:=ROUND(1+RANDOM*18);

END;


这个代表:蛇的空间位置与苹果的空间位置重合了,代表吃到苹果,那么蛇就会增加尾巴,同时

苹果会在20X20的空间随机出现。


end;


第五步:时钟一的进程,实时绘制蛇与苹果的情况

(如果上述前四步全部编好了,只有数据在计算,图形没有显示,

编好了这一步,游戏最重要图形就会显示出来)


procedure TForm1.mer(Sender: TObject);

begin

DRAW_BK;

DRAW_SNAKE;

DRAW_FOOD;

LABEL1.Caption:=FORMAT(‘SCORE = %D’,[SCORE]);

end;


这个代表:绘制白色的背景,绘制蛇,绘制苹果,最后更新分数



第六步:绘制运态图形的子过程,如绘制蛇与苹果,代码如下:


PROCEDURE TFORM1.DRAW_SNAKE;

VAR AX,AY:INTEGER;

    BX,BY:INTEGER;

    I:INTEGER;

BEGIN

  AX:=SNAKE.PX*SCL-10;

  AY:=SNAKE.PY*SCL-10;

  BX:=SNAKE.PX*SCL+10;

  BY:=SNAKE.PY*SCL+10;

  IMAGE1.Canvas.Brush.Color:=CLRED;

  IMAGE1.Canvas.Rectangle(AX,AY,BX,BY);


这个代表:采用矩形绘制出蛇头,颜色为红色

  //

  FOR I:=1 TO NTAIL DO

  BEGIN

  AX:=TAIL[I].PX*SCL-10;

  AY:=TAIL[I].PY*SCL-10;

  BX:=TAIL[I].PX*SCL+10;

  BY:=TAIL[I].PY*SCL+10;

  IMAGE1.Canvas.Brush.Color:=CLYELLOW;

  IMAGE1.Canvas.Rectangle(AX,AY,BX,BY);

  END;

这个代表:采用矩形绘制出多段的蛇的身体,身体是黄色的,通过循环去画出数组

这个代表:采用矩形绘制出蛇头,颜色为红色这个代表:采用矩形绘制出蛇头,颜色为红色END;


PROCEDURE TFORM1.DRAW_FOOD;

VAR AX,AY:INTEGER;

    BX,BY:INTEGER;

BEGIN

  AX:=FOOD.PX*SCL-10;

  AY:=FOOD.PY*SCL-10;

  BX:=FOOD.PX*SCL+10;

  BY:=FOOD.PY*SCL+10;

  IMAGE1.Canvas.Brush.Color:=CLBLUE;

  IMAGE1.Canvas.Ellipse(AX,AY,BX,BY);

END;


这个代表:这个太简单了就是绘制苹果,一个圆形的蓝色的苹果。

这个代表:采用矩形绘制出多段的蛇的身体,身体是黄色的,通过循环去画出数组这个代表:采用矩形绘制出多段的蛇的身体,身体是黄色的,通过循环去画出数组



这是一个很简单的二维游戏,它总结了大部分简单的二维游戏的编制方法,可以拿来做入门的教材

这也是很多程序常用的东西 (除了游戏的玩法研究以外)

(1)绘制实时动态

(2)不断的判定主角(蛇头)与配角(苹果)的关系

(3)更新主角的情况(生死,分数,尾巴或装备)

(4)随机出现的敌人(本游戏是苹果)

等等(想到再补充)

 

以下是程序的游戏EXE文件,供大家学习使用。

点击下载此文件:snake的源代码与可执行程序EXE文件


本文来自网络,不代表钢构人的立场,转载请注明出处。搜索工程类文章,就用钢构人网站。 https://www.ganggouren.com/2018/02/6500b64adf/
上一篇
下一篇

作者: ganggouren

为您推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

17717621528

在线咨询: QQ交谈

邮箱: 1356745727@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部