代码在废话下方,使用的是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
查看评论