第一章 为什么闲着没事写贪吃蛇
很多人不明白,为什么我闲着没事要写个贪吃蛇游戏呢?小时候的游戏机这个游戏早就玩够了。其实我们写贪吃蛇,不是用来玩的,而是通过编写一个有些学习一下编程的思想。
一个完整的贪吃蛇游戏要包括显示控制、输入控制、运动控制、状态判断、随机数的产生、难度控制等等多个方面,通过对一个游戏完整的研究,会对自己的编程能力有一个很大的提升。
那么游戏很多,为什么我们要选择贪吃蛇来编写,而不选择俄罗斯方块、赛车、拳皇、超级玛丽来写呢?
第一、 贪吃的显示简单,你可以用LCD来显示、当让你可以用LED点阵来显示,甚至如果你有耐心的话可以焊几排发光二极管来显示。这样很多人都可以参与到,另外我们还可以利用这个特点探讨一下标准化编程,这个在以后我们再讨论。但是俄罗斯方块你恐怕最低也要整个3310来显示吧。拳皇呢?呵呵
第二、 贪吃蛇编写难度适中,如果你来编写俄罗斯方块,首先要取很多方块的模,它的规则也多,考虑的也多,这个就比贪吃蛇难了一层,第一次编写游戏,应该尽量选择难度相对较低的。
第三、 贪吃蛇有群众基础,我想这个就比较好理解了,我再和别人讨论贪吃蛇的时候,一般是不必向他介绍贪吃蛇是一种什么游戏,因为贪吃蛇几乎所有人都玩过,但是其它游戏就不见得有这么广泛的群众基础了
那么写贪吃蛇程序你要准备些什么呢?
处理部分:单片机最小系统。
显示部分:LCD12864\3310\5110\LED点阵\发光二极管阵列 任意都可以
输入部分:就是按键,起码要5个吧,上、下、左、右、确定
编写部分:能看得懂c语言的人脑袋一个
有了这些,就可以开始编写我们的贪吃蛇了。
第二章 开始我们的准备工作
准备好了我们的几个硬件以后,我们就开始检查我们的硬件工作是否工作了。
首先,处理部分你做出一个单片机最小系统,随便下载一个程序进去,如果好使就说明你的最小系统工作啦。
第二、显示部分你要写出两个函数,让你的你的显示部分在任意位置显示一个点和熄灭一个点
Disp(unsigned char x,unsigned char y)
Mei(unsigned char x,unsigned char y)
这个是怎么怎么实现就要靠大家自己来做了(废话,我都不知道你用什么东西显示)
第三、输入装置你要再写出一个函数,要让你的输入装置工作Keydown()
我们调用这个函数以后,key这个变量会等于按下的按键的编号,如果没有俺家按下,那么key=0;
抱歉,这个也需要大家自己搞定(我也不知道你怎么接的电路图)至于脑袋就不用测了。
第三章 让你的蛇跑起来
下面节目正式开始:
我们这一章的任务是让蛇跑起来,我们把任务分成两个部分
第一、 让蛇显示出来
第二、 让蛇跑起来
首先我们让蛇显示出来,其实所谓的”蛇”,在我们的眼中就是一条连起来的点阵组成的线
比如(0,0),(1,0),(2,0)这三个点就是一个横着的蛇。有了我们刚才的函数,我们只要写一个函数比如
Void Main(void)
Disp(0,0);
Disp(1,0);
Disp(2,0);
我们就可以在屏幕上看到一个由三个点组成的“蛇”了。
那么下面的我们的工作就是让这条蛇“跑”起来。
首先,我们要考虑一下这个蛇的“跑”包含了几个动作,其实这个“跑”包含了三个动作
1、 蛇尾熄灭。无论你蛇向哪里动,蛇尾的那个点都是熄灭,所以为了让蛇动起来,我们首先就是写出mei(0,0);这个函数
2、 各个蛇身运动到它前一个蛇身的位置:比如说我们的蛇开始的坐标是(0,0)(1,0)(2,0)运动过后便成了 (1,0)(2,0)(3,0)。
你观察就会发现蛇身的这一规律所以我们再写出这个函数
3、 蛇头向你要求的方向运动。比如说蛇头开始的坐标是(2,0)你要求蛇向右运动,那么蛇头的坐标就会便成(3,0),向下运动就会编程(2,1)
就是这三个运动合成,就便成了蛇身体的整体的移动。
好啦闲话少絮,让我们开始动手写几个函数吧,今天我们的工作的目标就是看到蛇在屏幕上运动。
为了方便,我们应该用两个数组来存蛇的位置。
比如我们定义两个数组分别叫做
Xshu[]
Yshu[]
假设两个数组分别Xshu[]={0,1,2}
Yshu[]={0,0,0}
那么蛇的位置就是(0,0)(1,0)(2,0)了
因为以后我们的蛇以后是会变长的,所以我们把数组变得稍大一点。
这样写会好一点:
#define uchar unsigned char
#define uint unsigned int
#define SNAKE 20 //最大长度
uchar xshu[SNAKE],yshu[SNAKE];
这样我们可以根据自己屏幕的情况自己定义蛇的最大长度。
然后我们再定义一个变量changdu来表示现在的蛇的长度,(英语水平不足,也为了直观,以后变量用汉语拼音表示,莫见笑呀)
我们写第一个函数先让蛇显示出来
#include <reg51.h> //51芯片管脚定义头文件
#define uchar unsigned char //这个纯属是为了方便哈,没啥意义
#define uint unsigned int //参见上一句的注释
#define SNAKE 20 //最大长度
uchar xshu[SNAKE],yshu[SNAKE]; //定义两个数组来表示蛇的位置
uchar changdu; //用这个玩意表示现在蛇的长度
void delay(uint dt) //这个是延时函数,谁都需要它
{
uchar bt;
for(;dt;dt--)
for(bt=0;bt<255;bt++);
}
void init(uchar chang)//用这个函数做些初始化的设定之类的东西,hang是你开始设定蛇的长度是多少。
{
Changdu=chang;
for(i=0;i<chang;i++)
{
xshu[i]=i;
yshu[i]=0;
}//这个是初始化的x依次增加,y始终是零,这样出来一个横着的蛇。
for(i=0;i<changdu;i++)
{
play(xshu[i],yshu[i]);
}这个让蛇显示出来的函数delay(100); 延时一会不要也行
}
Void main(void)
{
Init(3);//3可以换成你要求的任意长度,看你的屏幕了
While(1)
{;
}
}
这样,我们就看到屏幕上你要求长度的小蛇了。下面我们的工作就是让这条蛇运动起来啦。很简单,按照上文的结论,三步走。
mie(xshu[0],yshu[0]); //先把蛇尾给熄灭掉
for(k=0;k<changdu-1;k++)
{
xshu[k]=xshu[k+1];
yshu[k]=yshu[k+1];
} //蛇身都是它前一段的蛇身的位置
xshu[changdu-1]=xshu[changdu-2]+1;
yshu[changdu-1]=yshu[changdu-2]+0;//蛇头向你要求的方向移动,我的现在的这个是向右移动动。同理向左移动x加-1,y加0。向上移动x加0,y加-1.向下移动x加0,y加1.
for(j=0;j<changdu;j++)
{
play(xshu[j],yshu[j]);
} //这个就是让新的蛇的位置显示出来。
这样我们只要把这段函数加入,蛇就可以向右移动了。
可是我们是需要按键控制蛇上下左右移动的,下面我们就来加入按键。
首先,我们定义两个变量,分别来表示x,y分别增加多少,用来表示蛇头的移动的方向,就叫做xfangxiang,yfangxiang吧。由于可能是负数,我就给定义成char型的。
然后我们刚才的函数
xshu[changdu-1]=xshu[changdu-2]+1;
yshu[changdu-1]=yshu[changdu-2]+0;
改成
xshu[changdu-1]=xshu[changdu-2]+xfangxiang;
yshu[changdu-1]=yshu[changdu-2]+yfangxiang;
我们只要通过按键改变这两个变量的数,就可以控制蛇的方向了。当按键按下时我们把xfangxiang,yfangxiang改成需要的数字,然后让蛇正常行走就可以了。