【BiliBili】 【知乎】 【QQ空间】 【微博】


博学慎思,坚持创新,求知若飢,虛心若愚                       关键字     类型    
  • 博主
  • 全部
  • 日志
  • 研究
  • 论文
  • 自编程序
  • 工程
  • Dino笔记
  • DinoBox
  • OpenSEES
  • Dino公开课
  • 每周挑战
  • Dino爱编程
  • 留言板

DinoBox

ETE_Frame3D
结构分析程序
ETE_Frame3D
2022-01-19
ETE-section截面分析程序
ETE-section
2021-08-19
ETO_OpenSEES前后处理程序
程序通过邮件申请。
★注意,软件不能下载,是通过邮箱发送软件的。

申请ETO时,注意EMAIL 的写法:(格式一定要对,否则电脑收不到)
邮件题目: ETO (版本号) 下载
注册人: (真实姓名)
学校/单位: (大学或工作单位)
邮件回复,大约需要1~4天的时间。
ETO_程序
2014-03-26
上一篇 | 下一篇
Dino爱编程 订阅所有Dino爱编程的日志

[Dino爱编程]贪吃蛇游戏SNAKE编程

作者:dinochen1983 日期:2018-02-21

字体大小: 小 中 大



这是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文件




[本日志由 dinochen1983 于 2021-11-08 04:04 PM 编辑]
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: 游戏游戏
评论: 0 | 引用: 0 | 查看次数: 8176
发表评论
昵 称:
密 码: 游客发言不需要密码.
验证码: 验证码
Dino:如果看不到验证码,再刷几下就可以了
内 容:
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.
字数限制 200 字 | UBB代码 关闭 | [img]标签 关闭

信息(Information)

DinoChen 视频频道

My GitHub Page



扫描以下二维码,加入公众号!


dinochen.com需要你的支持


日历(Calendar)

2022年7月
  • 日
  • 一
  • 二
  • 三
  • 四
  • 五
  • 六
  • 26
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

查找(Search)

关键字
 
类 型

文章(Recent Article)

[OpenSEES]OpenSEES实例教程[汇总...[Dino笔记]粒子群算法在桁架结构中的应用[获奖]WSP亚洲2021年卓越奖获得一等奖与创新...[Dino笔记]基于遗传算法对剪力墙结构优化设计方...[Dino笔记]基于OpenSEES虚功原理的钢结...[OpenSEES] 新版ETO更新及相关下载方法...[新闻]祝韩老师荣获广东省科技进步一等奖[程序]ETE-section功能更新:可修改划分...[App开发]采用Swfit语言编制经典的推箱子游...[程序]ETE-section更新_考虑混凝土保护...

评论(Comments)

陈博士您好,这个小工具好像有点问题,有效翼板宽度b...打开的时候显示“你没有许可证”,怎么弄啊陈博士您好,这个是需要购买的软件还是可以试用的怎么查看文档计算过程呢,陈博士一直显示出现一个错误字符无法计算是什么原因呢?为什么一直出错计算不了?陈博士,能共享下文件嘛?第二版没有光盘陈博士您好,我换了好几台电脑ETE还是需要许可,陈博士您好,现在程序还是打不开,需要许可请问如何获得会员许可证?

留言(GuestBook)

Thanks regarding furnishi...陈博士您好,想请问一下零长度单元用在桥梁的支座上,...陈博,新版ETO下载以后界面打不开是什么原因呢,旧...陈博士您好,请问可以出一期画易损性曲线的教程吗陈博士您好,我在学习您4.33侧向多自由度简化模型...陈博士您好,計算wind2019的program ...陈博士,您好,我下载使用了您编写的压型钢板组合楼板...陈博士您好,我是opensee初学者,想向您请教两...陈博士你好,请问开洞混凝土截面,ETE-secti...陈博士您好,感谢您的回复,我的刚性隔板设置了转动惯...

TagBar

Loading...

用户面板(User Panel)

登录用户注册

统计(Statistics)

日志: 408 篇
评论: 893 个
留言: 413 个
访问: 14023977 次
在线: 5 人
建站时间: 2008-02-08

Powered By PJBlog3 V2.7 Build 05 CopyRight 2005 - 2011, 陈学伟的博客

Processed in 0.281250 second(s) , 6 queries 粤ICP备15071789号-1