贪吃蛇代码的学习

1.贪吃蛇代码实现的要素

贪吃蛇的实现需要游戏界面,墙,随机食物的产生,吃到食物后能++的蛇身,蛇头,以及蛇的上下左右移动的控制,蛇移动的速度。下面将详细讨论贪吃蛇代码的各个模块。

2.游戏界面的实现

#define ROW 22 //游戏区行数
#define COL 42 //游戏区列数
 

首先通过宏定义来确认蛇的移动区域,最后一行作为游戏的最高成绩记录。

//初始化一个二维的游戏界面,并在这个界面上绘制墙和一些其他信息
void InitInterface()
{
	color(6); //调用color函数,参数为6,颜色设置为土黄色
	for (int i = 0; i < ROW; i++)//行数
	{
		for (int j = 0; j < COL; j++)//列数
		{
			if (j == 0 || j == COL - 1)
			{
				face[i][j] = WALL; //标记该位置为墙
				CursorJump(2*j, i);
				printf("■");
			}
			else if (i == 0 || i == ROW - 1)
			{
				face[i][j] = WALL; //标记该位置为墙
				printf(" ■");
			}
			else
			{
				face[i][j] = KONG; //标记该位置为空
			}
		}
	}
	color(7); //颜色设置为白色
	CursorJump(0, ROW);
	printf("当前得分:%d", grade);
	CursorJump(COL, ROW);
	printf("历史最高得分:%d", max);
}

通过二维数组创建一个游戏界面并通过两重循环和if语句打印墙,通过if语句控制光标的输出位置进而打印墙的位置。注意:此处的方块占两个位置,所以在光标在x轴变化时需要使用2*j。然后光标在最后一行输出当前分数,并在最后一行输出历史最高分。   

3光标函数的控制实现  

void HideCursor()
{
	CONSOLE_CURSOR_INFO curInfo; //定义光标信息的结构体变量
	curInfo.dwSize = 1; //如果没赋值的话,光标隐藏无效
	curInfo.bVisible = FALSE; //将光标设置为不可见
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄
	SetConsoleCursorInfo(handle, &curInfo); //设置光标信息
}
//光标跳转
void CursorJump(int x, int y)//没有返回值(void)的函数,名为 CursorJump,
//它接受两个整数参数 x 和 y,分别代表光标要移动到的横坐标和纵坐标。

{
	COORD pos; //定义光标位置的结构体变量,定义了一个 COORD 类型的变量 pos
	//COORD 是一个 Windows API 中定义的结构体,用于表示一个二维坐标。 
	pos.X =x; //横坐标
	pos.Y = y; //纵坐标
//将传入的参数 x 和 y 分别赋值给 pos 结构体的 X 和 Y 成员,即设置了光标的新位置
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台句柄,调用 GetStdHandle 函数,
//并传入 STD_OUTPUT_HANDLE 作为参数,来获取标准输出设备的句柄,通常这就是控制台窗口的句柄。
//句柄是 Windows API 中用于标识和访问资源(如文件、设备、窗口等)的整数。
    SetConsoleCursorPosition(handle, pos); //设置光标位置,使用 SetConsoleCursorPosition 函数,
//传入之前获取的控制台句柄 handle 和光标的新位置 pos,来移动控制台的光标到指定位置。
//这个函数的主要用途是在控制台应用程序中精确控制光标的位置
//需要注意的是,COORD、HANDLE、GetStdHandle 和 SetConsoleCursorPosition 是 Windows 特有的类型和函数.
//因此这段代码只能在 Windows 平台上运行。
}//在提供的 InitInterface 函数中,CursorJump 被用来将光标移动到特定的位置,
//以便在正确的位置打印出“■”字符或得分信息。
//这对于确保界面布局的正确性至关重要。

4颜色的调用

//颜色设置
void color(int c)
{
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c); //颜色设置
	//注:SetConsoleTextAttribute是一个API(应用程序编程接口)
}

该函数接收一个整数参数 c,并使用这个整数来设置控制台文本的颜色。这里使用了一个特定的Windows API函数 SetConsoleTextAttribute 来改变控制台输出的文本颜色。第一个参数是控制台窗口的句柄(在这里通过 GetStdHandle 函数获取),第二个参数是一个整数,代表要设置的文本颜色。在这段代码中,SetConsoleTextAttribute 函数使用了前面提到的句柄和传入的整数颜色值 c 来设置文本颜色。

5最高分文件的读取

void WriteGrade()
{
	FILE* pf = fopen("贪吃蛇最高得分记录.txt", "w"); //以只写的方式打开文件
	if (pf == NULL) //打开文件失败
	{
		printf("保存最高得分记录失败\n");
		exit(0);
	}
	fwrite(&grade, sizeof(int), 1, pf); //将本局游戏得分写入文件当中
	fclose(pf); //关闭文件
	pf = NULL; //文件指针及时置空
}

FILE* pf = fopen("贪吃蛇最高得分记录.txt", "w"); 这行代码尝试以只写模式("w")打开一个名为“贪吃蛇最高得分记录.txt”的文件,并将返回的文件指针赋值给变量 pf。接下来的 if (pf == NULL) 语句检查文件是否成功打开。如果 fopen 函数失败,它会返回 NULL。如果文件打开失败,程序会打印一条错误消息:“保存最高得分记录失败”,并使用 exit(0) 立即终止程序。这里的 exit(0) 会导致程序正常退出,但通常错误情况下使用非零值(如 exit(1))来表示异常退出可能更为合适。

fwrite(&grade, sizeof(int), 1, pf); 这行代码负责将 grade 变量的内容写入文件。这里假设 grade 是一个在函数外部定义的 int 类型全局变量或者是在更大的上下文中可访问的变量。&grade 是指向要写入数据的指针。

sizeof(int) 指定每个数据元素的大小。 表示要写入的数据元素数量。pf 是目标文件的指针。

fclose(pf); 关闭已打开的文件,可以确保所有的数据都被正确地写入文件并释放系统资源。

pf = NULL; 将文件指针设置为 NULL,这样做可以防止后续的代码错误地使用已经关闭的文件指针。

6蛇的初始化

//蛇头
struct Snake
{
	int len; //记录蛇身长度
	int x; //蛇头横坐标
	int y; //蛇头纵坐标
}snake; 创建了一个Snake结构体的实例,命名为snake  
 
//蛇身
struct Body
{
	int x; //蛇身横坐标
	int y; //蛇身纵坐标
}body[ROW*COL]; //开辟足以存储蛇身的结构体数组
 
int face[ROW][COL]; //标记游戏区各个位置的状态

 通过结构体定义蛇的头部 。

len:这个成员用于记录蛇身的长度。在游戏中,这个值通常随着蛇吃到食物而增加,代表蛇的成长。
x 和 y:这两个成员分别代表蛇头的横坐标和纵坐标。在游戏逻辑中,这两个值会被频繁更新,以反映蛇头的当前位置。

 蛇身结构体用于表示蛇身的每一段

  • Body 结构体只有两个整型成员:x 和 y,分别代表蛇身某一段的横坐标和纵坐标。
  • body 数组是用来存储蛇身的每一段位置信息的。数组的大小是 ROW*COL,这意味着在理论上,蛇身可以覆盖整个游戏区域(尽管在实际游戏中,蛇身通常不会占据所有的格子)。
  • face 是一个二维整型数组,用来表示游戏区域的状态。每个元素face[i][j]代表游戏区域中第i行第j列的状态。
//初始化蛇
void InitSnake()
{
	snake.len = 2; //蛇的身体长度初始化为2
	snake.x = COL / 2; //蛇头位置的横坐标
	snake.y = ROW / 2; //蛇头位置的纵坐标
	//蛇身坐标的初始化
	body[0].x = COL / 2 - 1;
	body[0].y = ROW / 2;
	body[1].x = COL / 2 - 2;
	body[1].y = ROW / 2;
	//将蛇头和蛇身位置进行标记
	face[snake.y][snake.x] = HEAD;
	face[body[0].y][body[0].x] = BODY;
	face[body[1].y][body[1].x] = BODY;
}
  1. 蛇的长度:蛇的初始长度被设置为2,这意味着蛇由一个头部和一个身体段落组成(在这个函数中,身体段落实际上由body数组的前两个元素表示)。

  2. 蛇头的位置:蛇头的初始位置被设置在游戏区域的中心,这是通过取COL(列数)和ROW(行数)的一半来实现的。这里假设COLROW都是偶数,因此可以直接除以2得到整数中心坐标。如果不是偶数,可能需要额外的逻辑来确保蛇头位于中心位置。

  3. 蛇身的位置:蛇身被初始化为与蛇头在同一行上,但是位于蛇头的左侧。这意味着蛇在游戏开始时是水平向右移动的。

  4. 游戏区域状态标记face数组用于记录游戏区域中每个位置的状态。在这个函数中,蛇头和蛇身所在的位置被分别标记为HEADBODY。这些标记用于后续的碰撞检测、游戏逻辑判断等。

7随机生成食物函数的实现

//随机生成食物
void RandFood()
{
	int i, j;
	do
	{
		//随机生成食物的横纵坐标
		i = rand() % ROW;
		j = rand() % COL;
	} while (face[i][j] != KONG); //确保生成食物的位置为空,若不为空则重新生成
	face[i][j] = FOOD; //将食物位置进行标记
	color(12); //颜色设置为红色
	CursorJump(2 * j, i); //光标跳转到生成的随机位置处
	printf("●"); //打印食物
}

随机坐标生成:使用rand()函数生成随机数,并通过% ROW和% COL来确保生成的坐标在游戏区域范围内。

空位查找:do-while循环用于查找一个在游戏区域中为空(即face[i][j]的值为KONG)的位置来放置食物。如果随机生成的位置已经有蛇身或其他障碍物,循环会继续执行,直到找到一个空位。

食物标记:一旦找到空位,该位置在face数组中被标记为FOOD,表示此处有食物。

颜色设置:调用color函数设置后续打印的颜色。这里假设color(12)对应红色,但具体颜色和编号的对应关系取决于所使用的库或环境。

光标定位:CursorJump函数被调用以将控制台或终端的光标移动到食物的位置。参数2 * j, i表示在二维字符界面上的坐标,其中j是横坐标,需要乘以2是因为每个字符可能占据两个单位的宽度(这取决于具体的字符显示方式和环境)。

食物显示:最后,使用printf函数在光标当前位置打印出一个代表食物的符号“●”。

8判断得分与结束的实现

//判断得分与结束
void JudgeFunc(int x, int y)
{
	//若蛇头即将到达的位置是食物,则得分
	if (face[snake.y + y][snake.x + x] == FOOD)
	{
		snake.len++; //蛇身加长
		grade += 10; //更新当前得分
		color(7); //颜色设置为白色
		CursorJump(0, ROW);
		printf("当前得分:%d", grade); //重新打印当前得分
		RandFood(); //重新随机生成食物
	}
	//若蛇头即将到达的位置是墙或者蛇身,则游戏结束
	else if (face[snake.y + y][snake.x + x] == WALL || face[snake.y + y][snake.x + x] == BODY)
	{
		Sleep(1000); //留给玩家反应时间
		system("cls"); //清空屏幕
		color(7); //颜色设置为白色
		CursorJump(2 * (COL / 3), ROW / 2 - 3);
		if (grade > max)
		{
			printf("恭喜你打破最高记录,最高记录更新为%d", grade);
			WriteGrade();
		}
		else if (grade == max)
		{
			printf("与最高记录持平,加油再创佳绩", grade);
		}
		else
		{
			printf("请继续加油,当前与最高记录相差%d", max - grade);
		}
		CursorJump(2 * (COL / 3), ROW / 2);
		printf("GAME OVER");
		while (1) //询问玩家是否再来一局
		{
			char ch;
			CursorJump(2 * (COL / 3), ROW / 2 + 3);
			printf("再来一局?(y/n):");
			scanf("%c", &ch);
			if (ch == 'y' || ch == 'Y')
			{
				system("cls");
				main();
			}
			else if (ch == 'n' || ch == 'N')
			{
				CursorJump(2 * (COL / 3), ROW / 2 + 5);
				exit(0);
			}
			else
			{
				CursorJump(2 * (COL / 3), ROW / 2 + 5);
				printf("选择错误,请再次选择");
			}
		}
	}
}

得分判断:

条件判断:if (face[snake.y + y][snake.x + x] == FOOD) 检查在face数组中,由蛇的当前位置(snake.y, snake.x)加上移动的方向(y, x)所确定的位置是否是食物(FOOD)。

蛇身长度增加:如果上述条件成立,即蛇头吃到了食物,那么蛇的长度(snake.len)将增加。这通常意味着在游戏界面上蛇身会增长一节。

得分更新:吃到食物后,玩家的得分(grade)会增加。在这个例子中,每次吃到食物得分增加10分。

颜色设置:color(7) 调用是为了设置接下来的文本打印颜色为白色。

光标跳转:CursorJump(0, ROW) 函数调用将光标移动到屏幕的特定位置,准备更新得分显示。这里0可能代表屏幕的第一列,而ROW可能是一个常量,表示屏幕的行数或者特定区域的起始行。

得分显示:printf("当前得分:%d", grade) 在光标当前位置打印出玩家的当前得分。

生成新食物:RandFood() 函数调用用于在游戏区域中随机生成新的食物。

游戏结束条件:如果蛇头碰到了墙或者蛇身,游戏就会结束。Sleep(1000)函数使程序暂停1秒钟,给玩家一秒钟的反应时间,然后清空屏幕,并根据玩家的得分情况打印相关信息。

重新开始或退出游戏:游戏结束后,会询问玩家是否要再来一局。如果玩家输入'y'或'Y',则重新开始游戏;如果输入'n'或'N',则退出游戏;如果输入其他字符,会提示玩家重新选择。

system("cls")是清空Windows命令提示符屏幕的命令,exit(0)来退出程序。

9蛇身的打印和覆盖        

void DrawSnake(int flag)
{
	if (flag == 1) //打印蛇
	{
		color(10); //颜色设置为绿色
		CursorJump(2 * snake.x, snake.y);
		printf("■"); //打印蛇头
		for (int i = 0; i < snake.len; i++)
		{
			CursorJump(2 * body[i].x, body[i].y);
			printf("□"); //打印蛇身
		}
	}
	else //覆盖蛇
	{
		if (body[snake.len - 1].x != 0) //防止len++后将(0, 0)位置的墙覆盖
		{
			//将蛇尾覆盖为空格即可
			CursorJump(2 * body[snake.len - 1].x, body[snake.len - 1].y);
			printf("  ");
		}
	}
}

打印蛇:当flag等于1时,它首先设置文本颜色为绿色,并移动光标到蛇头的位置,然后打印一个黑色方块表示蛇头。接着,它使用一个循环来遍历蛇身的每个部分,并在控制台的相应位置上打印空心方块来表示蛇身。

覆盖蛇尾:当flag不等于1时,代码会检查蛇尾的位置是否不是坐标(0, 0),这是为了防止覆盖可能位于该位置的墙或其他重要元素。如果蛇尾不在(0, 0)位置,它会移动光标到蛇尾的位置并用空格覆盖原先的蛇尾部分,从而在视觉上“删除”蛇尾。

10蛇的移动位置的更替

void MoveSnake(int x, int y)
{
	DrawSnake(0); //先覆盖当前所显示的蛇
	face[body[snake.len - 1].y][body[snake.len - 1].x] = KONG; //蛇移动后蛇尾重新标记为空
	face[snake.y][snake.x] = BODY; //蛇移动后蛇头的位置变为蛇身
	//蛇移动后各个蛇身位置坐标需要更新
	for (int i = snake.len - 1; i > 0; i--)
	{
		body[i].x = body[i - 1].x;
		body[i].y = body[i - 1].y;
	}
	//蛇移动后蛇头位置信息变为第0个蛇身的位置信息
	body[0].x = snake.x;
	body[0].y = snake.y;
	//蛇头的位置更改
	snake.x = snake.x + x;
	snake.y = snake.y + y;
	DrawSnake(1); //打印移动后的蛇
}

覆盖当前蛇形图案:
DrawSnake(0); 调用 DrawSnake 函数,并传入参数 0,以覆盖当前屏幕上的蛇形图案。这是通过在蛇尾的位置打印空格来实现的。

更新蛇尾位置:
face[body[snake.len - 1].y][body[snake.len - 1].x] = KONG; 将蛇尾的位置在 face 数组(或二维数组)中标记为空(KONG 是一个代表空地的常量)。

更新蛇头位置:
face[snake.y][snake.x] = BODY; 将蛇头当前的位置在 face 数组中标记为蛇身。这实际上是将蛇头前一个位置变为了蛇身的一部分。

更新蛇身位置:
通过一个 for 循环,从蛇尾开始向前遍历到蛇身的第二个部分,将每个部分的位置更新为其前一个部分的位置。这样,蛇身整体就向前移动了一个位置。

更新蛇身的第一个位置信息:
body[0].x = snake.x; 和 body[0].y = snake.y; 将蛇身中的第一个单元位置信息更新为之前蛇头的位置。

更新蛇头位置:

snake.x = snake.x + x;:这行代码将蛇头当前的 x 坐标(snake.x)与移动量 x 相加,然后将结果存回 snake.x。这实际上是让蛇头在水平方向上移动 x 个单位。
snake.y = snake.y + y;:类似地,这行代码将蛇头当前的 y 坐标(snake.y)与移动量 y 相加,然后将结果存回 snake.y。这会让蛇头在垂直方向上移动 y 个单位。

绘制移动后的蛇形图案:
DrawSnake(1); 再次调用 DrawSnake 函数,并传入参数 1,以在屏幕上绘制移动后的蛇形图案。

11蛇移动速度的实现

void run(int x, int y)
{
	int t = 0;
	while (1)
	{
		if (t == 0)
			t = 3000; //这里t越小,蛇移动速度越快(可以根据次设置游戏难度)
		while (--t)
		{
			if (kbhit() != 0) //若键盘被敲击,则退出循环
				break;
		}
		if (t == 0) //键盘未被敲击
		{
			JudgeFunc(x, y); //判断到达该位置后,是否得分与游戏结束
			MoveSnake(x, y); //移动蛇
		}
		else //键盘被敲击
		{
			break; //返回Game函数读取键值
		}
	}
}

初始化计数器:
int t = 0; 初始化一个变量 t,用于控制循环的延时。t 是一个倒计时的计数器,用于控制蛇移动之间的时间间隔。
while (1) 创建一个无限循环,该循环将一直运行,直到满足退出条件。

这个循环会递减 t 的值,并在每次迭代中检查是否有键盘敲击(通过 kbhit() 函数)。如果检测到键盘敲击(kbhit() 返回非零值),则跳出内部循环。否则,循环会继续递减 t 直到 t 为0。while (--t)在run函数中起到了一个“定时器”的作用,通过递减t的值并检查键盘输入来控制蛇的移动间隔和响应玩家输入。

如果内部循环正常结束(即 t 为0),这意味着没有检测到键盘敲击,所以游戏逻辑会继续。首先,调用 JudgeFunc(x, y) 来判断蛇是否到达食物位置得分或游戏是否应该结束。然后,调用 MoveSnake(x, y) 来移动蛇。

12游戏逻辑函数

void Game()
{
	int n = RIGHT; //开始游戏时,默认向右移动
	int tmp = 0; //记录蛇的移动方向
	goto first; //第一次进入循环先向默认方向前进
	while (1)
	{
		n = getch(); //读取键值
		//在执行前,需要对所读取的按键进行调整
		switch (n)
		{
		case UP:
		case DOWN: //如果敲击的是“上”或“下”
			if (tmp != LEFT&&tmp != RIGHT) //并且上一次蛇的移动方向不是“左”或“右”
			{
				n = tmp; //那么下一次蛇的移动方向设置为上一次蛇的移动方向
			}
			break;
		case LEFT:
		case RIGHT: //如果敲击的是“左”或“右”
			if (tmp != UP&&tmp != DOWN) //并且上一次蛇的移动方向不是“上”或“下”
			{
				n = tmp; //那么下一次蛇的移动方向设置为上一次蛇的移动方向
			}
		case SPACE:
		case ESC:
		case 'r':
		case 'R':
			break; //这四个无需调整
		default:
			n = tmp; //其他键无效,默认为上一次蛇移动的方向
			break;
		}
	first: //第一次进入循环先向默认方向前进
		switch (n)
		{
		case UP: //方向键:上
			run(0, -1); //向上移动(横坐标偏移为0,纵坐标偏移为-1)
			tmp = UP; //记录当前蛇的移动方向
			break;
		case DOWN: //方向键:下
			run(0, 1); //向下移动(横坐标偏移为0,纵坐标偏移为1)
			tmp = DOWN; //记录当前蛇的移动方向
			break;
		case LEFT: //方向键:左
			run(-1, 0); //向左移动(横坐标偏移为-1,纵坐标偏移为0)
			tmp = LEFT; //记录当前蛇的移动方向
			break;
		case RIGHT: //方向键:右
			run(1, 0); //向右移动(横坐标偏移为1,纵坐标偏移为0)
			tmp = RIGHT; //记录当前蛇的移动方向
			break;
		case SPACE: //暂停
			system("pause>nul"); //暂停后按任意键继续
			break;
		case ESC: //退出
			system("cls"); //清空屏幕
			color(7); //颜色设置为白色
			CursorJump(COL - 8, ROW / 2);
			printf("  游戏结束  ");
			CursorJump(COL - 8, ROW / 2 + 2);
			exit(0);
		case 'r':
		case 'R': //重新开始
			system("cls"); //清空屏幕
			main(); //重新执行主函数

定义一个整数变量n,初始化为RIGHT,表示蛇的初始移动方向是向右。
定义一个整数变量tmp,用于记录上一次蛇的移动方向。
goto first;:语句放在 while (1) 循环之前,目的是在第一次进入循环之前,先跳转到 first: 标签所在的位置执行一次移动蛇的代码。由于在游戏开始时,我们想要蛇按照默认的方向(这里是 RIGHT)移动,所以我们需要先执行一次移动操作,然后再进入循环读取用户的按键输入。

读取键值:使用getch()函数读取用户按下的键,并赋值给n。

接下来的switch语句用于根据用户输入的键调整蛇的移动方向:

如果用户按下的是“上”或“下”键,并且上一次蛇的移动方向不是“左”或“右”,则蛇的移动方向保持不变。
如果用户按下的是“左”或“右”键,并且上一次蛇的移动方向不是“上”或“下”,则蛇的移动方向保持不变。
如果用户按下的是SPACE、ESC、'r'或'R',则不需要调整移动方向。
对于其他键,蛇的移动方向保持为上一次的方向。
执行蛇的移动
标签first:处开始第二个switch语句,根据调整后的n值执行蛇的移动:

如果n是UP,则调用run(0, -1)使蛇向上移动。
如果n是DOWN,则调用run(0, 1)使蛇向下移动。
如果n是LEFT,则调用run(-1, 0)使蛇向左移动。
如果n是RIGHT,则调用run(1, 0)使蛇向右移动。
如果n是SPACE,则调用system("pause>nul")暂停程序,等待用户按任意键继续。
如果n是ESC,则清空屏幕,设置文本颜色为白色,显示“游戏结束”信息,并退出程序。
如果n是'r'或'R',则清空屏幕,并重新执行主函数main()以重新开始游戏。
存在的问题
RIGHT、UP、DOWN、LEFT、SPACE、ESC等常量或宏没有在这段代码中定义,我们假设它们是在代码的其他部分定义的。
run函数也没有在这段代码中定义,它应该是用来控制蛇的移动逻辑的。
system("cls")用于清屏,这是Windows系统特有的命令,在其他操作系统(如Linux或macOS)上不会工作。
system("pause>nul")用于暂停程序,但这也是Windows系统特有的命令。
exit(0);用于退出程序,这是标准C库函数,但通常建议避免在main函数之外使用它。
调用main()函数来重新开始游戏是不推荐的做法,因为main()函数应由操作系统调用,而不是由程序内部调用。更好的做法是将游戏逻辑封装在一个循环中,并使用标志变量来控制循环是否继续。

13主函数

int max, grade; //全局变量
int main()
{
#pragma warning (disable:4996) //消除警告
	max = 0, grade = 0; //初始化变量
	system("title 贪吃蛇"); //设置cmd窗口的名字
	system("mode con cols=84 lines=23"); //设置cmd窗口的大小
	HideCursor(); //隐藏光标
	ReadGrade(); //从文件读取最高分到max变量
	InitInterface(); //初始化界面
	InitSnake(); //初始化蛇
	srand((unsigned int)time(NULL)); //设置随机数生成起点
	RandFood(); //随机生成食物
	DrawSnake(1); //打印蛇
	Game(); //开始游戏
	return 0;
}
 

#pragma warning (disable:4996): 这是一个预处理指令,用于在编译时禁用特定的警告(这里是警告4996)。这个警告通常与一些被认为是“不安全”的C/C++标准库函数有关。

system("title 贪吃蛇");: 使用system函数调用Windows命令来设置命令提示符窗口的标题为“贪吃蛇”。

system("mode con cols=84 lines=23");: 这也是一个system函数调用,用于设置控制台窗口的大小为84列和23行。

HideCursor();: 调用HideCursor函数来隐藏控制台的光标。这个函数的具体实现没有在这段代码中给出,但它是为了改善游戏的视觉效果。

ReadGrade();: 调用ReadGrade函数,该函数从某个文件中读取最高分数(max)的值。

InitInterface();: 调用InitInterface函数来初始化游戏的界面或控制台显示。

InitSnake();: 调用InitSnake函数来初始化贪吃蛇的状态或位置。

srand((unsigned int)time(NULL));: 调用srand函数来设置随机数生成器的种子。这里使用了当前时间(time(NULL))作为种子,以确保每次运行游戏时,随机数的序列都不同。注意这里有一个多余的闭合括号,应该是srand((unsigned int)time(NULL)); -> srand((unsigned int)time(NULL));。

RandFood();: 调用RandFood函数来在游戏界面中随机生成食物的位置。

DrawSnake(1);: 调用DrawSnake函数来绘制贪吃蛇的初始状态。参数1表示某种状态或模式。

Game();: 调用Game函数来开始主游戏循环。这个函数包含游戏的主体逻辑,处理用户输入、移动蛇、检查碰撞。

                                                

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值