51单片机实现贪吃蛇(清翔单片机)

目录

一、创作背景

二、实现过程

1.一些声明与定义

2.键盘扫描

3.定时器中断

5.蛇的初始化

6.蛇体的移动

7.食物的创建

8.食物的检测和身体的增长

9.检测死亡

10.总代码

总结


一、创作背景

由于大一的一个小作业,花了10天完成了这个小项目,中途克服了很多困难,发此文章以作纪念。

二、实现过程

1.一些声明与定义

这些后面会讲到。

#include <reg52.h>
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char
#include <intrins.h>

sbit DIO = P3 ^ 4;
sbit S_CLK = P3 ^ 5;
sbit R_CLK = P3 ^ 6;
sbit key_s2 = P3 ^ 0;//独立键盘4个按键
sbit key_s3 = P3 ^ 1;
sbit key_s4 = P3 ^ 2;
sbit key_s5 = P3 ^ 3;

uchar coorx[8] = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe };
uchar coory[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
uchar snakex[20];//蛇体x坐标
uchar snakey[20];//蛇体y坐标
uchar m = 0;
uchar len = 1;//蛇体长度
uchar foodx, foody;//食物x, y坐标
uchar d, xx, yy;

2.键盘扫描

这里我用的是独立键盘,由于点阵屏的IO口和矩阵键盘的IO口冲突导致显示的内容不对(个人能力有限,暂时没办法解决这个冲突问题,只好避开),所以采用了独立键盘。同时也是因为这个原因我没有采用扫描的方式,而是一个一个判断。如果开发板不冲突可以选择矩阵键盘。

char key = 0;

void delay(uint z)
{
	uint x, y;
	for (x = z; x > 0; x--)
		for (y = 114; y > 0; y--);
}

void keyscan()
{
	if (key_s2 == 0)
	{
		delay(10);
		if (key_s2 == 0)
		{
			if (key != 4)
				key = 1;
		}
	}
	if (key_s3 == 0)
	{
		delay(10);
		if (key_s3 == 0)
		{
			if (key != 3)
				key = 2;
		}
	}
	if (key_s4 == 0)
	{
		delay(10);
		if (key_s4 == 0)
		{
			if (key != 2)
				key = 3;
		}
	}
	if (key_s5 == 0)
	{
		delay(10);
		if (key_s5 == 0)
		{
			if (key != 1)
				key = 4;
		}
	}
}

3.定时器中断

这里是相关寄存器的配置,定时为5ms,用处是为了控制蛇的移动速度已经键盘的判断。

void timer0Init()
{
	EA = 1;
	ET0 = 1;
	TR0 = 1;
	TMOD = 0X01;
	TH0 = 0XED;
	TL0 = 0XFF;
}
void SendByte(uchar x, uchar y)//用来接收行列值,这里x和y是坐标,点阵屏左下角为坐标原点
{
	uchar i, j, dat1, dat2;
	dat1 = coorx[x - 1];//这里通过前面定义的两个数组将坐标转化为了行列的十六进制数
	dat2 = coory[y - 1];
	for (i = 0; i < 8; i++)
	{
		if (dat1 & 0x01)
			DIO = 1;
		else
			DIO = 0;
		S_CLK = 1;//穿行输入
		S_CLK = 0;
		dat1 >>= 1;
	}
	for (j = 0; j < 8; j++)
	{
		if (dat2 & 0x01)
			DIO = 1;
		else
			DIO = 0;
		S_CLK = 1;//串行输入
		S_CLK = 0;
		dat2 >>= 1;
	}
	R_CLK = 1;//并行输出
	R_CLK = 0;
}

5.蛇的初始化

main函数主要内容

void main()
{
	timer0Init();//定时器0初始化
	snakex[0] = 5;//蛇体初始x坐标
	snakey[0] = 5;//蛇初始y坐标
	creat_food();
	while (1)
	{
		snakemove();
		FoodAnd();
	}
}

void timer0() interrupt 1
{
	TH0 = 0XED;
	TL0 = 0XFF;
	m++;//每加到一百蛇体移动一次,速度可以自己调
	keyscan();//键盘扫描
	for (d = 0; d < len; d++)
	{
		SendByte(snakex[d], snakey[d]);//将蛇体显示在点阵屏上,参数是xy坐标
	}
	SendByte(foodx, foody);//显示食物
	CheckDead();//检验是否死亡
}

6.蛇体的移动

void left()//上下左右都是一个道理
{
	uchar i, x1, x2, y1, y2;
	x1 = snakex[0];//保留上一结点的x轴状态
	snakex[0]--;//坐标减1
	if (snakex[0] == 0)//这里是判定是否碰到边界了,这里设定的是可以从另一边出来,当然也可以设定为碰到就死
		snakex[0] = 8;
	y1 = snakey[0];//保留上一结点的y轴状态
	for (i = 1; i < len; i++)
	{
		y2 = snakey[i];//进行各个结点的状态移动,形成蛇运动的效果
		snakey[i] = y1;
		y1 = y2;

		x2 = snakex[i];
		snakex[i] = x1;
		x1 = x2;
	}
}

void up()
{
	uchar i, x1, x2, y1, y2;
	y1 = snakey[0];
	snakey[0]--;
	if (snakey[0] == 0)
		snakey[0] = 8;
	x1 = snakex[0];
	for (i = 1; i < len; i++)
	{
		x2 = snakex[i];
		snakex[i] = x1;
		x1 = x2;

		y2 = snakey[i];
		snakey[i] = y1;
		y1 = y2;
	}
}

void down()
{
	uchar i, x1, x2, y1, y2;
	y1 = snakey[0];
	snakey[0]++;
	if (snakey[0] == 9)
		snakey[0] = 1;
	x1 = snakex[0];
	for (i = 1; i < len; i++)
	{
		y2 = snakey[i];
		snakey[i] = y1;
		y1 = y2;

		x2 = snakex[i];
		snakex[i] = x1;
		x1 = x2;
	}
}

void right()
{
	uchar i, x1, x2, y1, y2;
	x1 = snakex[0];
	snakex[0]++;
	if (snakex[0] == 9)
		snakex[0] = 1;
	y1 = snakey[0];
	for (i = 1; i < len; i++)
	{
		x2 = snakex[i];
		snakex[i] = x1;
		x1 = x2;

		y2 = snakey[i];
		snakey[i] = y1;
		y1 = y2;
	}
}

void snakemove()
{
	if (key == 1 && m == 100)//这里是判断按键值并且m要达到100,也就是500ms移动一次
	{
		left();
		m = 0;//要清一下零
	}
	if (key == 2 && m == 100)
	{
		up();
		m = 0;
	}
	if (key == 3 && m == 100)
	{
		down();
		m = 0;
	}
	if (key == 4 && m == 100)
	{
		right();
		m = 0;
	}
}

7.食物的创建

这一部分本来以为使用c语言里面srand(unsigned seed)(这个函数只要种子的值是变化的生成的就是某种意义上随机数)函数加上一个一直变化的时间戳就可以生成随机数的,但是后来发现keil里面没有time.h这个头文件,导致没法实现真正意义的随机数。这个问题暂留

uchar CheckFood()//检验食物有没有和蛇体重合
{
	uchar i;
	for (i = 0; i < len; i++)
	{
		if (foodx == snakex[i] && foody == snakey[i])
		{
			return 1;
		}
	}
	return 0;
}

void creat_food()
{
	do
	{
		foodx = (uchar)(rand() % 8 + 1);
		foody = (uchar)(rand() % 8 + 1);
	} while (CheckFood() != 0);
}

8.食物的检测和身体的增长

void FoodAnd()//检验食物有没有被吃掉
{
	if (foodx == snakex[0] && foody == snakey[0])
	{
		if (len < 20)
		{
			snakex[len] = snakex[len - 1];//和之前一样,把上一个结点的状态赋给下一个结点,用来增加长度
			snakey[len] = snakey[len - 1];
			len++;
		}
		creat_food();//被吃掉重新生成食物
	}
}

9.检测死亡

这里i = 2是因为等于1的时候会在吃食物的时候冲突,而蛇头不可能碰到碰到第二节,所以初值设定为2

void CheckDead()
{
	uchar i;
	for (i = 2; i < len; i++)
	{
		if (snakex[0] == snakex[i] && snakey[0] == snakey[i])
		{
			while (1);
		}
	}
}

10.总代码

#include <reg52.h>
#include <stdlib.h>
#define uint unsigned int
#define uchar unsigned char
#include <intrins.h>

sbit DIO = P3 ^ 4;
sbit S_CLK = P3 ^ 5;
sbit R_CLK = P3 ^ 6;
sbit key_s2 = P3 ^ 0;
sbit key_s3 = P3 ^ 1;
sbit key_s4 = P3 ^ 2;
sbit key_s5 = P3 ^ 3;

uchar coorx[8] = { 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe };
uchar coory[8] = { 0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80 };
uchar snakex[20];
uchar snakey[20];
uchar m = 0;
uchar len = 1;
uchar foodx, foody;
uchar d, xx, yy;


char key = 0;

void delay(uint z)
{
	uint x, y;
	for (x = z; x > 0; x--)
		for (y = 114; y > 0; y--);
}

void keyscan()
{
	if (key_s2 == 0)
	{
		delay(10);
		if (key_s2 == 0)
		{
			if (key != 4)
				key = 1;
		}
	}
	if (key_s3 == 0)
	{
		delay(10);
		if (key_s3 == 0)
		{
			if (key != 3)
				key = 2;
		}
	}
	if (key_s4 == 0)
	{
		delay(10);
		if (key_s4 == 0)
		{
			if (key != 2)
				key = 3;
		}
	}
	if (key_s5 == 0)
	{
		delay(10);
		if (key_s5 == 0)
		{
			if (key != 1)
				key = 4;
		}
	}
}


void SendByte(uchar x, uchar y)//用来接收行列值,这里x和y是坐标,点阵屏左下角为坐标原点
{
	uchar i, j, dat1, dat2;
	dat1 = coorx[x - 1];//这里通过前面定义的两个数组将坐标转化为了行列的十六进制数
	dat2 = coory[y - 1];
	for (i = 0; i < 8; i++)
	{
		if (dat1 & 0x01)
			DIO = 1;
		else
			DIO = 0;
		S_CLK = 1;//穿行输入
		S_CLK = 0;
		dat1 >>= 1;
	}
	for (j = 0; j < 8; j++)
	{
		if (dat2 & 0x01)
			DIO = 1;
		else
			DIO = 0;
		S_CLK = 1;//串行输入
		S_CLK = 0;
		dat2 >>= 1;
	}
	R_CLK = 1;//并行输出
	R_CLK = 0;
}

uchar CheckFood()//检验食物有没有和蛇体重合
{
	uchar i;
	for (i = 0; i < len; i++)
	{
		if (foodx == snakex[i] && foody == snakey[i])
		{
			return 1;
		}
	}
	return 0;
}

void creat_food()
{
	do
	{
		foodx = (uchar)(rand() % 8 + 1);
		foody = (uchar)(rand() % 8 + 1);
	} while (CheckFood() != 0);
}

void FoodAnd()//检验食物有没有被吃掉
{
	if (foodx == snakex[0] && foody == snakey[0])
	{
		if (len < 20)
		{
			snakex[len] = snakex[len - 1];//和之前一样,把上一个结点的状态赋给下一个结点,用来增加长度
			snakey[len] = snakey[len - 1];
			len++;
		}
		creat_food();//被吃掉重新生成食物
	}
}

void left()//上下左右都是一个道理
{
	uchar i, x1, x2, y1, y2;
	x1 = snakex[0];//保留上一结点的x轴状态
	snakex[0]--;//坐标减1
	if (snakex[0] == 0)//这里是判定是否碰到边界了,这里设定的是可以从另一边出来,当然也可以设定为碰到就死
		snakex[0] = 8;
	y1 = snakey[0];//保留上一结点的y轴状态
	for (i = 1; i < len; i++)
	{
		y2 = snakey[i];//进行各个结点的状态移动,形成蛇运动的效果
		snakey[i] = y1;
		y1 = y2;

		x2 = snakex[i];
		snakex[i] = x1;
		x1 = x2;
	}
}

void up()
{
	uchar i, x1, x2, y1, y2;
	y1 = snakey[0];
	snakey[0]--;
	if (snakey[0] == 0)
		snakey[0] = 8;
	x1 = snakex[0];
	for (i = 1; i < len; i++)
	{
		x2 = snakex[i];
		snakex[i] = x1;
		x1 = x2;

		y2 = snakey[i];
		snakey[i] = y1;
		y1 = y2;
	}
}

void down()
{
	uchar i, x1, x2, y1, y2;
	y1 = snakey[0];
	snakey[0]++;
	if (snakey[0] == 9)
		snakey[0] = 1;
	x1 = snakex[0];
	for (i = 1; i < len; i++)
	{
		y2 = snakey[i];
		snakey[i] = y1;
		y1 = y2;

		x2 = snakex[i];
		snakex[i] = x1;
		x1 = x2;
	}
}

void right()
{
	uchar i, x1, x2, y1, y2;
	x1 = snakex[0];
	snakex[0]++;
	if (snakex[0] == 9)
		snakex[0] = 1;
	y1 = snakey[0];
	for (i = 1; i < len; i++)
	{
		x2 = snakex[i];
		snakex[i] = x1;
		x1 = x2;

		y2 = snakey[i];
		snakey[i] = y1;
		y1 = y2;
	}
}

void CheckDead()
{
	uchar i;
	for (i = 2; i < len; i++)
	{
		if (snakex[0] == snakex[i] && snakey[0] == snakey[i])
		{
			while (1);
		}
	}
}

void snakemove()
{
	if (key == 1 && m == 100)//这里是判断按键值并且m要达到100,也就是500ms移动一次
	{
		left();
		m = 0;//要清一下零
	}
	if (key == 2 && m == 100)
	{
		up();
		m = 0;
	}
	if (key == 3 && m == 100)
	{
		down();
		m = 0;
	}
	if (key == 4 && m == 100)
	{
		right();
		m = 0;
	}
}

void timer0Init()
{
	EA = 1;
	ET0 = 1;
	TR0 = 1;
	TMOD = 0X01;
	TH0 = 0XED;
	TL0 = 0XFF;
}

void main()
{
	timer0Init();//定时器0初始化
	snakex[0] = 5;//蛇体初始x坐标
	snakey[0] = 5;//蛇初始y坐标
	creat_food();
	while (1)
	{
		snakemove();
		FoodAnd();
	}
}

void timer0() interrupt 1
{
	TH0 = 0XED;
	TL0 = 0XFF;
	m++;//每加到一百蛇体移动一次,速度可以自己调
	keyscan();//键盘扫描
	for (d = 0; d < len; d++)
	{
		SendByte(snakex[d], snakey[d]);//将蛇体显示在点阵屏上,参数是xy坐标
	}
	SendByte(foodx, foody);//显示食物
	CheckDead();//检验是否死亡
}

总结

代码由于本人实力问题还有部分不足之处希望支持。

  • 26
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
单片机课程设计报告 设计题目: 液晶显示之贪吃蛇 专业班级: 2009级电信(2)班 组长姓名: 章光洪 1:学号2009221105200147,姓名 章光洪 2:学号2009221105200042,姓名 童磊 3:学号2009221105200168,姓名 胡小武 指导教师: 田茂 设计时间: 2011年12月 " " "一.设计目的及要求: " "掌握单片机一般设计方法,学会将所学单片机知识用之于实践,用所学知识完成一个完整的课程设计 " "掌握液晶显示器的一般工作原理,了解液晶屏各管脚的作用 " "在熟悉单片机编程和液晶显示原理的基础上,设计电路,编写代码来实现液晶屏的文字显示,图片显示,并通" "过相应的算法设计一个贪吃蛇的小游戏 " " " "二.设计原理图: " "如下图所示,设计电路图由单片机最小系统构图加上LCD显示电路,八位独立按键电路和串口下载电路组成, " "在实际设计中,为了灵活运用,各部件大都采用排针连接方式,使用时直接用杜邦线连接即可,方便今后在些" "基础上做其它实验 " " " " " " " "三.基础流程图 " " " " " " " " " " " " " " " " " "四.程序设计代码: " "本次程序设计代码由游戏主程序,LCD显示驱动程序,按键扫描程序三部分组成,其中游戏主程序为游戏控制 " "部分,起主导作用,LCD驱动部分提供了LCD各种显示的驱动代码,方便直接调用,而按键扫描部分则实现了外" "部按键的状态扫描。 " "具体代码如下: " " " "按键扫描:Key.c " "#include "REG52.H" " " " "unsigned char OSScanKey(void) " "{ " "unsigned char Temp; " "unsigned char i; " "P2=0xff; " "Temp=P0; " "for(i=0;i<8;i++) " "{ " "if((Temp&(1<<i))==0) " "break; " "} " "if(i<8) " "return i+1; " "else " "return 0; " "} " " " "unsigned char OSReadKey(void) " "{ unsigned char KeyTemp; " "unsigned int i=0; " "KeyTemp=OSScanKey(); " "return KeyTemp; " "} " " " " " " " " " " " "LCD驱动程序: " "头文件Lcd12864.h " "#ifndef __lcd12864_H__ " "#define __lcd12864_H__ " "sbit RS=P2^2; //并行的指令/数据选择信号, H数据, L命令 " "sbit RW=P2^3; //并行读写选择信号, H读, L写 " "sbit E=P2^4; //并行使能端, H有效, L无效 " "sbit PSB=P3^2; //并/串接口选择, H并,L串 " "sbit RET=P3^4; //复位, L有效 " "#define LcdData P1 " "unsigned char Check_Busy(void); " "void Lcd_WriteData(unsigned char); " "unsigned char Lcd_ReadData(void); " "void Lcd_WriteCmd(unsigned char); " "void Lcd_PutPixel(unsigned char,unsigned char,unsigned char); " "unsigned char Lcd_ReadPixel(unsigned char,unsigned char); " "void Lcd_HoriLine(unsigned char,unsigned char,unsigned char Length,unsigned char Color); " "void Lcd_VertLine(unsigned char x,unsigned char y,unsigned char Length,unsigned char Color); " "void Lcd_Line(unsigned char x1,unsigned char y1,unsigned char x2,unsigned char y2,unsigned char " "Color); " "void Lcd_Rectangle(unsigned char x0,unsigned char y0,unsigned char x1,un
整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。整理了关于单片机的相关资料,包括一些源码程序都打包在里面,资源真实可靠,都经过测试过,请放心使用。
课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码 课程设计 51单片机开发 编程 实验 模块 源代码
以下是C51单片机点阵贪吃蛇代码的一个例子,代码中使用了16*16点阵和8*8点阵。此外,代码中还使用了红外遥控器控制蛇的上下左右移动。代码注释清楚,可以供移植参考。 ```c #include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char #define delay_time 10 #define snake_long 5 #define snake_speed 200 #define snake_speed_up 50 #define snake_speed_min 50 #define snake_speed_max 200 #define snake_speed_add 10 #define snake_speed_sub 10 #define snake_speed_add_time 1000 #define snake_speed_sub_time 1000 #define snake_speed_up_time 5000 #define snake_speed_up_add 10 #define snake_speed_up_sub 10 #define snake_speed_up_min 10 #define snake_speed_up_max 50 #define snake_speed_up_add_time 1000 #define snake_speed_up_sub_time 1000 #define snake_speed_up_time_time 5000 #define snake_speed_up_time_add 1000 #define snake_speed_up_time_sub 1000 #define snake_speed_up_time_min 1000 #define snake_speed_up_time_max 5000 #define snake_speed_up_time_add_time 1000 #define snake_speed_up_time_sub_time 1000 #define snake_speed_up_time_time_time 5000 #define snake_speed_up_time_time_add 1000 #define snake_speed_up_time_time_sub 1000 #define snake_speed_up_time_time_min 1000 #define snake_speed_up_time_time_max 5000 #define snake_speed_up_time_time_add_time 1000 #define snake_speed_up_time_time_sub_time 1000 #define snake_speed_up_time_time_time_time 5000 #define snake_speed_up_time_time_time_add 1000 #define snake_speed_up_time_time_time_sub 1000 #define snake_speed_up_time_time_time_min 1000 #define snake_speed_up_time_time_time_max 5000 #define snake_speed_up_time_time_time_add_time 1000 #define snake_speed_up_time_time_time_sub_time 1000 #define snake_speed_up_time_time_time_time_time 5000 #define snake_speed_up_time_time_time_time_add 1000 #define snake_speed_up_time_time_time_time_sub 1000 #define snake_speed_up_time_time_time_time_min 1000 #define snake_speed_up_time_time_time_time_max 5000 #define snake_speed_up_time_time_time_time_add_time 1000 #define snake_speed_up_time_time_time_time_sub_time 1000 #define snake_speed_up_time_time_time_time_time_time 5000 #define snake_speed_up_time_time_time_time_time_add 1000 #define snake_speed_up_time_time_time_time_time_sub 1000 #define snake_speed_up_time_time_time_time_time_min 1000 #define snake_speed_up_time_time_time_time_time_max 5000 #define snake_speed_up_time_time_time_time_time_add_time 1000 #define snake_speed_up_time_time_time_time_time_sub_time 1000 #define snake_speed_up_time_time_time_time_time_time_time 5000 #define snake_speed_up_time_time_time_time_time_time_add 1000 #define snake_speed_up_time_time_time_time_time_time_sub 1000 #define snake_speed_up_time_time_time_time_time_time_min 1000 #define snake_speed_up_time_time_time_time

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值