贪吃蛇程序(金沙滩51单片机)-启动篇-1(含演示GIF)

点击获取工程源码
首先声明:本代码中不含中断程序(因为当时没学,后来觉得51过于落伍,故没有深学),以下的代码只是挑出其中主要的进行细讲,源码点击上方获取。
我们将启动贪吃蛇分为以下5个步骤:
1.初始化
initSnake();
2.更新显示
drawSnake();
3.人机交互
changeDir();
4.蛇动
runSnake();
5.碰撞检测
Collision_Monitoring();

成果展示

此处展示的是有陀螺仪的,但是源码是按键的不含陀螺仪(含陀螺仪的源码找不见了)


Snake

  • 成果展示
  • 初始化
  • 更新显示
  • 人机交互
  • 蛇动
  • 碰撞检测

初始化

static void initSnake()
{
	//清除内存数据
	unsigned char i;
	for(i=0; i<SNAKE_Max_Long; i++)
	{
		snake.x[i]=-1;
		snake.y[i]=-1;
	}
	
	//初始化蛇参数
	snake.Long=2;	// 初始化蛇的长度为两节
	snake.Life=1;	//初始化蛇活着
	snake.Dir=right; //初始化蛇向右走
	snake.x[1]=0;
	snake.y[1]=2;
	snake.x[0]=1;
	snake.y[0]=2;//初始化2节身体的坐标
	createFood();//生成食物
}

更新显示

static void drawSnake()
{
	unsigned char i=0;
	for(i=0; i<8; i++) DispRAM[i]=0;//清零
	//将组成身体的所有节点坐标缓存为16进制形式
	for(i=0; i<snake.Long; i++)
		DispRAM[snake.y[i]] |= 1<<snake.x[i];
	drawPoint(food.x, food.y);	//显示食物
	scanDisplay(DispRAM);		//显示蛇

}

人机交互

static void changeDir(unsigned int key)
{  	
	// 方向按键的规则,根据实际按键设置方向
	switch(key)
	{
		case 4:	 if(snake.Dir != down)	snake.Dir=up; 		break;
		case 12: if(snake.Dir != up)	snake.Dir=down; 	break;
		case 8:  if(snake.Dir != right) snake.Dir=left; 	break;
		case 16: if(snake.Dir != left) 	snake.Dir=right;	break;
		default: break;
	}
}

蛇动

static void runSnake()
{
	unsigned char i;
	
	// 蛇身体坐标移动,蛇尾方向坐标逐渐向蛇头方向移动
	for(i=snake.Long; i>0; i--)
	{	
		snake.y[i]=snake.y[i-1];
		snake.x[i]=snake.x[i-1];
	}
	// 根据移动方向刷新蛇头的位置
	switch(snake.Dir)
	{	
		case up:	snake.y[0]-=1; break;
		case down:	snake.y[0]+=1; break;
		case left:	snake.x[0]-=1; break;
		case right: snake.x[0]+=1; break;
		default: break;
	}
}

碰撞检测

static void Collision_Monitoring()
{
		uchar i=0;
		// 限定蛇活动范围(边界墙),超范围就结束游戏
		if((snake.x[0]>(WIDTH-1)) || (snake.x[0]<0) || (snake.y[0]>(LENGTH-1)) || (snake.y[0]<0))
		{
			snake.Life=0;			
			snake.Dir=right;	
		}
		// 判断是否咬到自己
		for(i=4; i<=snake.Long; i++)
		{
			if(snake.x[i-1]==snake.x[0] && snake.y[i-1]==snake.y[0])
			{
				snake.Life=0;	
				snake.Dir=right;	
			}
		}
	// 蛇吃到食物
	if(snake.x[0]==food.x && snake.y[0]==food.y)
	{
		snake.Long++;
		createFood();
	}
}

根据源码可以按自己的想法随意扩展、更改(不要脱离现实就行),不要局限于这个代码或硬件中,比如我在第二次的课程设计中加入了陀螺仪控制蛇的方向,这也蛮有意(tou)思(lan)的,毕竟可以在老师的课上正大光明的“打游戏”可不是谁都能做到的(哈哈哈)。
第二篇传送门

你可能感兴趣的:(贪吃蛇程序(金沙滩51单片机)-启动篇-1(含演示GIF))