小言_互联网的博客

C语言小于200行实现简单贪吃蛇游戏

357人阅读  评论(0)

代码在废话下方,使用的是VS2019,其他编译器可能需要修改部分代码,效果截图和代码文件在文章最后
废话:
这是我第一次发文章,也是应别人要求,完全自己写出来给他们参考的代码,所以要求尽量简单,注释要详细(但这个我只能尽可能),只用一个文件(个人也不喜欢一个文件就一两句代码),3个函数包括main()完成。网上也许有很多实现贪吃蛇的代码,可能会存在部分相同,只希望能给大家提供一点帮助,各种说明已经写在注释里面,就不再多说,个人表达能力并不好,可能会有些地方说得不清楚,那就麻烦自行百度一下了,或写代码去了解,比如_getch()返回的按键ASCII码,可以写代码用printf输出。

#include <stdio.h>//标准输入输出
#include <windows.h>//使用Windows Api,隐藏光标,设置光标位置
#include <conio.h>//_getch()获取按键,_kbhit()检测是否有按键按下

#include <time.h>//time()获取系统时间
#include <stdlib.h>//rand()获取随机数,srand()设置随机数种子

void prin(char x, char y, char ch);//输出ch指定符号
int GameMain(char tx, char ty);//处理蛇长度,咬自己,撞墙,吃东西
//全局变量
char over = 1;//用于标记游戏是否结束,0表示结束

//主函数
int main()
{
	//用于接收按键信息
	int kb = 77,kb1 = 0;//部分按键值会超过char数据范围
	int tmp = 77;
	//随机数的种子
	srand((unsigned)time(NULL));
	//头位置
	char x = 0, y = 0;//char类型已经足够储存坐标
	//隐藏光标
	CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };// 这个结构包含的是控制台光标的信息,第二个参数为0表示隐藏光标,第一个值别设为0
	GetStdHandle(STD_OUTPUT_HANDLE);//获得控制台标准输出句柄
	SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);//设置控制台光标状态
	//绘制蛇活动范围
	//蛇移动范围横0~47,竖0~23
	for (char y = 0; y < 24; y++)
	{
		prin(48, y, '#');
	}//在48列输出#
	
	for (char x = 0; x < 50; x=x+2)
	{
		prin(x, 24, '#');
	}//在24行输出 #;

	//游戏循环
	while (over)
	{
		
		if (_kbhit())//判断是否有按键按下
		{
			kb1 = _getch();
			kb = _getch();
			//两次读取按键,假设按上键,第一次读224,第二次才是72
			if (kb == 72)//蛇不会后退,如果蛇正在向下移动,则继续向下移动
				if (tmp != 80)//其他同理
					tmp = 72;
				else
					kb = 80;//上
			else if (kb == 80)
				if (tmp != 72)
					tmp = 80;
				else
					kb = 72;//下
			else if (kb == 77)
				if (tmp != 75)
					tmp = 77;
				else
					kb = 75;//右
			else if (kb == 75)
				if (tmp != 77)
					tmp = 75;
				else
					kb = 77;//左
			else//当按下其他按键时,下面的switch只能处理方向键,所以kb需要恢复原来的值,
				kb = tmp; //在玩家看来相当于不响应其他按键,少了这段,两次按下其他按键蛇会消失
			//if..else相当于switch()
		}

		switch (kb)//判断方向键
		{
		case 72://{
			
			if (y > 0)
				y = y - 1;//每循环一次y-1,即向上移动
			else
				over = 0;
			break;
		}
		case 80://{
			
			if (y < 23)
				y = y + 1;
			else
				over = 0;
			break;
		}
		case 75://{
	
			if (x > 0)
				x = x - 1;
			else
				over = 0;
			break;
		}
		case 77://{
	
			if (x < 47)
				x = x + 1;
			else
				over = 0;
			break;
		}
		}//按键处理蛇头移动位置
		if(over == 1)//游戏没结束就执行GameMain函数
			GameMain(x, y);
		
		Sleep(200);//200ms循环一次
	}
	
	prin(22, 11, 'O');
	printf("ver");//结束,在22,11处输出Over
	char c = _getch();//按下任意键退出,c用于接收返回值,清除编译器警告。

	return 0;
}

void prin(char x,char y,char ch)
{
	COORD coor = { 0,0 };    //COORD结构体,用来存储光标位置
	coor.X = x;
	coor.Y = y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coor);
		//设置光标坐标
	printf("%c",ch);  //输出指定符号

}

int rdx = 0, rdy = 0;//食物随机坐标
char x[24] = { 0 }, y[24] = { 0 }, br = 0, L = 1;//x,y数组用于储存蛇身体,蛇长度包括头最长23,br用于判断食物@状态
//修改蛇长度,需要同时修改x[],y[]数组大小和L最大值,目前L>23,L等于24时结束,即L最大24。
int GameMain(char tx , char ty)
{
	if (br == 0)
	{
		rdx = rand() % 47;//rdx取值范围0~47
		rdy = rand() % 23;//rdy取值范围0~23
		br = 1;//标记食物已经生成
	}//食物随机坐标
	
	for (char i = 0; i < L; i++)
	{
		x[L - i] = x[L - i - 1];
		y[L - i] = y[L - i - 1];
	}//储存蛇身体位置,假设L=3,则x[3]=x[2];x[2]=x[1];x[1]=x[0]
	if (L > 4)//当L大于4时,可能咬到自己
		for (char i = 4; i < L; i++)
		{
			if (x[i] == tx)//当头坐标和身体某一坐标相等时,咬到自己
				if (y[i] == ty)
				{
					over = 0;
					return 1;
				}
		}
	prin(tx, ty, '#');//输出蛇身体

	prin(x[L], y[L], ' ');//在蛇尾部输出空格,清除多于的#,控制显示的蛇长度

	if (tx == rdx && ty == rdy)
	{
		L++;//长度+1
		br = 0;//标记食物被吃
	}//当食物被吃,L增加,需要重新生成食物
	else if (br == 1)
	{
		prin(rdx, rdy, '@');//输出食物@
		br = 3;//标记食物已经被绘制
	}
	
	if (L > 23)//当L超过23时结束,在这修改L最大值
	{
		over = 0;
		return 2;
	}
		
	x[0] = tx;
	y[0] = ty;//保存当前蛇头位置
	
	return 0;
}

效果图:
代码文件
CSDN
https://download.csdn.net/download/qq_33933335/11832332
谋盘
链接:https://pan.baidu.com/s/1bIGP_Q7fimeKqP1Wyu1wzg
提取码:p2rx


转载:https://blog.csdn.net/qq_33933335/article/details/102056898
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场