本文主要详细介绍了C语言实现贪吃蛇游戏的代码。本文中的示例代码非常详细,具有一定的参考价值。感兴趣的朋友可以参考一下。
本文分享C语言实现贪吃蛇游戏的具体代码,供大家参考。具体内容如下
//-普罗布朗区
//想想typedef定义的变量如何被fwrite存储。
//通常可以使用sleep()语句类来控制移动速度。
// Bool Playsound W (LPCWSTR,HMODULE,DWORD)":参数1无法从" const char[8]"转换为" LPCWSTR -原因-即在vc2010开发环境中可能找不到该字符串的音乐。
//思考如何消除不是这四个键的情况。
# includestdio.h
#includestdlib.h
#includeWindows.h
#includeconio.h
#includestring.h
#includetime.h
# includes mmsystem . h//导入声音头文件——也就是联合形成。
#pragma warning(disable:4996)//您可以使用此代码清除警告类。
# pragma注释(lib,' winmm . lib ')//链接库
//-可变区域
//-
#定义H 24//定义高度为24
#define W 78//定义的宽度是78
#定义假0
#定义正确1
//-
int n=0;//全局变量用于写入接口的状态
int z palyer=0;//记录玩家总数
int fs//用来记录玩家的分数
int key=72//用来控制播放器移动方向的变量,初始值给定为upper。
int change flag=0;//判断果实是否被吃掉,用来判断蛇尾是否需要擦除。
int I;//用于控制函数中循环的变量
char name[20];
char name 1[20];
struct player info///一个定义玩家名字和分数的结构。
{
char name[20];
int palyefs
} player[100];
Struct //定义蛇的食物生成的坐标类。
{
int x;
int y;
}食物;
Struct //用链表实现贪吃蛇的长度
{
int x[100];
int y[100];
int len
int zfs
int速度;
} snake1
//-
void XJ();
void dq();
void save();
void CK();
void Xuan();
void JM();
void PHB();
void fs1();
int begin();
void creat food();
void keyDown();
bool sfjs();
void getoxy(int x,int y);
void ex();
int YY();
//-功能区
//-界面功能区。
Void menu1()//选择进入游戏后是读取用户还是创建新用户。
{
int n;
系统('颜色3e ');//添加一个控制颜色的语句,也就是控制类似cmd的颜色——它控制控制台的颜色。
printf('===================================================\ n ');
printf(' # # \ n ');
printf(' # # \ n ');
Printf('# 1。创建新玩家# \ n ');
printf(# 2。阅读档案# \ n ');
printf(' # # \ n ');
printf(' # # \ n ');
printf('===================================================\ n ');
printf(' option:');
scanf('%d ',n);
如果(n==1)
{
XJ();
}
其他
如果(n==2)
{
dq();
}
其他
{
Printf('输入错误,请重新选择:\ n ');
menu 1();
}
}
Void menu2()//游戏中的主菜单
{
int n;
printf('===================================================\ n ');
printf(' # # \ n ');
Printf('#蛇版goddemon # \ n ');
printf(' # # \ n ');
Printf('# 1。开始游戏# \ n ');
printf(# 2。查看排行榜# \ n ');
printf(# 3。查看我的分数# \ n ');
printf(# 4。退出游戏# \ n’);
printf(' # # \ n ');
printf(' # # \ n ');
printf('===================================================\ n ');
printf(' option:\ n ');
while (1)
{
scanf_s('%d ',n);
开关(n)//选择功能
{
案例一:begin();打破;
案例二:PHB();打破;
案例三:fs1();打破;
案例四:ex();打破;
默认值:printf('输出错误,请重新输入:\ n’);打破;
}
}
}
void xj()//新建用户的名字
{
CK();
zplayer//注意如果是在退出的时候赋予的值,会出现只能读出两个值的状况特点-即在子函数中赋予值,必须在读取值后进行赋予值加减才可,否则可能出现乱码状况
printf('\t\t输入用户名:\ n’);//注意利用\t\t进行控制界面-很美好的
scanf('%s ',名称);
strcpy(玩家【播放器】.姓名、名称);//注意赋值的先后
菜单2();
}
void dq()//读取存档里面的用户且进行选择
{
CK();
printf('请输入读取的姓名:\ n’);
scanf('%s ',名称1);
for(I=0;i=zpalyer我)
{
if ((strcmp(player[i]).name,name1)==0))
{
菜单2();
}
其他
if(I==zplayer)
{
printf('未找到该用户,请在次选择读取与创建功能\ n’);
菜单1();
}
}
}
//- 功能函数区-
int begin()//开始游戏
{
系统(“cls”);
JM();
while (1)
{
keyDown();
如果(!sfjs())
打破;
创建食物();
睡眠(蛇1。速度);
}
玩家【玩家】玩EFS=蛇1。ZFS;
getoxy(W/2,H/2);
printf('本次得分:%d\n ',蛇1。ZFS);
睡眠(3000);
系统(“cls”);
菜单2();
睡眠(5000);
返回0;
}
void phb()//排行榜
{
int I;
printf('======================排行榜=======================\ n’);
for(I=0;我是zpalyer我)
{
printf('%s\t%d\n ',player[i]).姓名,玩家[我].palyefs);
}
printf('==================================================\ n ');
}
void fs1()//查看自己的分数
{
printf('你的分数为:\ n’);
printf('%d ',player[zplayer]).palyefs);
}
void ex()//退出功能
{
save();
退出(0);
}
无效保存()
{
文件* fp
fp=fopen('tcs.txt ',' w ');
fwrite(zpalyer,4,1,FP);
for(I=0;i=zpalyer我)
{
fwrite(player[i],sizeof(struct palier info),1,FP);
}
fclose(FP);
}
void ck()//读取文档中的数据状况
{
文件* fp
int I;
fp=fopen('tcs.txt ',' r ');
弗雷阿德(zpalyer,4,1,FP);
for(I=0;i=zpalyer我)
{
fread(player[i],sizeof(struct palier info),1,FP);
}
fclose(FP);
}
虚空玄宗()
{
int j=0,x=1;
菜单2();
}
void getoxy(int x,int y)//定位坐标位置的函数
{
坐标坐标
坐标X=x
坐标Y=y
SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),coord);
}
void jm()//贪吃蛇初始化界面
{
SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE),FOREGROUND _ INTENSITY);
系统('颜色3e’);
//打印上下边界的循环
for(I=0;I=W;i=2)
{
getoxy(i,0);
printf(" ");
getoxy(i,H);//打印下边界
printf(" ");
}
for(I=0;I H;我)
{
getoxy(0,I);
printf(" ");
getoxy(W,I);
printf(" ");//打印下边界
}
while (1)//生成初始化的食物
{
srand((无符号int)time(NULL));
食物。x=rand()%(W-4)2;
食物。y=rand()%(H-2)1;
if (food.x % 2==0)
{
打破;
}
}
getoxy(food.x,food。y);
printf(' * ');
蛇1。len=3;
蛇1。速度=200;
蛇1。x[0]=W/2 ^ 1;//即在中间区域打印蛇头
蛇1。y[0]=H/2;
getoxy(snake1.x[0],snake1。y[0]);
printf(" ");
for(I=1;我蛇1 .leni )//打印蛇头的状况特点-利用格氧基(光标移动)printf语句联合打印出蛇
{
蛇1。x[I]=蛇1。x[I-1]2;//即将坐标赋值加2的状况理解
蛇1。y[I]=蛇1。y[I-1];
getoxy(snake1.x[i],snake1。y[I]);
printf(" ");
}
getoxy(W - 2,0);
返回;
}
void creatfood()//创建食物的函数
{
如果(蛇1。x[0]==食物。xsnake 1。y[0]==食物。y)//即蛇会吃掉这个食物
{
while (1)
{
int flag=1;
srand((无符号int)time(NULL));
食物。x=rand()%(W-4)2;
食物。y=rand()%(H-2)1;
for(I=0;我蛇1 .len我)
{
如果(蛇1。x[I]==食物。xs nake 1。y[I]==食物。y)
{
flag=0;
打破;
}
}
if (flagfood.x % 2==0)//用该语句进行判断是否该结束坐标赋值
{
打破;
}
}
getoxy(food.x,food . y);//就是创造食物,每次都创造。
printf(' * ');
snake 1 . len;//也就是蛇的长度加1,因为是吃食物造成的
snake 1 . speed-=5;
snake 1 . ZFS=10;//也就是一个水果的分数等于10分
change flag=1;//说明你吃过食物,不需要抹去蛇尾的意思。
}
返回;//即return可以为空
}void keyDown()//控制移动的函数
{
int pre _ key=key//记录上一个键的方向
if (_kbhit())
{
fflush(stdin);
//当//getch()读取方向键时,会返回两次。第一个调用返回0或224,第二个调用返回实际值。
key=_ getch();//第一个调用返回的不是实际值
key=_ getch();//第二次调用返回实际值
}
if (changeFlag==0)
{
getoxy(snake1.x[snake1.len - 1],snake 1 . y[snake 1 . len-1]);
printf(“”);//在蛇尾输出一个空格,擦除蛇尾。
}
//将蛇的每一段依次向前移动一段(蛇头除外)
for(I=snake 1 . len-1;I 0;我-)
{
snake 1 . x[I]=snake 1 . x[I-1];
snake 1 . y[I]=snake 1 . y[I-1];
}
if (pre_key==72 key==80)
key=72
if (pre_key==80 key==72)
key=80
if (pre_key==75 key==77)
key=75
if (pre_key==77 key==75)
key=77
开关(钥匙)
{
案例75:
snake 1 . x[0]-=2;//向左
打破;
案例77:
snake 1 . x[0]=2;//到右边
打破;
案例72:
snake 1 . y[0]-;//向上
打破;
案例80:
snake 1 . y[0];//向下
打破;
}
//打印出蛇头
getoxy(snake1.x[0],snake 1 . y[0]);
printf(“”);
getoxy(W - 2,0);
//因为目前没有食物,所以changFlag值为0
change flag=0;
返回;
}
boost fjs()//判断游戏是否结束的函数
{
if(snake 1 . y[0]==0 | | snake 1 . y[0]==H)
{
返回false
}
if(snake 1 . x[0]==0 | | snake 1 . x[0]==W)
{
返回false
}
for(I=1;我蛇1 . len;我)
{
if(snake 1 . x[I]==snake 1 . x[0]snake 1 . y[I]==snake 1 . y[0])//注意判断是否结束的功能。
{
返回false
}
}
返回true//即返回该函数本身为真
}
int yy()
{
PlaySound(TEXT('F:\\ apple.wav '),null,snd _ nodefault | snd _ async | snd _ loop);//即使用转换参数进行生成。
//SND _ loop-//要重复播放声音,必须和SND_ASYNC标志一起使用。
//snd _ async-//异步播放声音,PlaySound函数开始播放后会立即返回。
///SND_NODEFAULT -不播放默认声音。如果没有这个标志,PlaySound将在找不到声音时播放默认声音——典型的文件查找音乐是通过格式查看找到的。
返回0;
}
//-主要功能区
int main()
{
YY();
menu 1();
系统(“暂停”);
返回0;
}
效果图:
更多有趣的经典小游戏实现话题,分享给大家:
经典游戏总结
经典python游戏总结
Python俄罗斯方块游戏合集
经典的JavaScript游戏不停地玩。
经典java游戏总结
经典javascript游戏总结
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。