这篇文章主要为大家详细介绍了C语言实现贪吃蛇代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了C语言实现贪吃蛇代码的具体代码,供大家参考,具体内容如下
#包含" stdafx.h "
# includestdio.h
#includetime.h
#includewindows.h
#includestdlib.h
#includeconio.h
#定义U 1
#定义D 2
#定义L 3
#定义R 4 //蛇的状态u:上d:下l:左r:右
typedef结构snake //蛇身的一个节点
{
int x;//节点的x坐标
int y;//节点的y坐标
struct snake * next//蛇身的下一个节点
}蛇;
(同Internationalorganizations)国际组织得分=0,add=10//总得分和每吃一次食物的得分
int高分=0;//最高分
(同Internationalorganizations)国际组织状态,sleeptime=200//蛇前进状态,每次运行的时间间隔
蛇*头,*食;//蛇头指针,食物指针
蛇* q;//遍历蛇时用的指针
int endgamestatus=0;//游戏结束时的状态
处理hOut//控制台句柄
void gotoxy(int x,int y);
int color(int c);
void打印蛇();
void wl come();
void create map();
void score and tips();
void初始化snake();
void创建food();
int bite self();
void cantcroswall();
空的加速();
void speeddown();
void蛇动();
void键盘控件();
void lost draw();
void端游();
void choose();
void file _ out();
void file _ in();
void explation();
主()
{
系统('模式控制列=100行=30 ');
print snake();
wlcome();
file _ out();
键盘控制();
endgame();
}
void gotoxy(int x,int y)//设置光标位置
{ COORD c;
c.X=x
c.Y=y
SetConsoleCursorPosition(GetStdHandle(STD _ OUTPUT _ HANDLE),c);//定位光标的位置
}
int color(int c)//设置颜色
{
SetConsoleTextAttribute(GetStdHandle(STD _ OUTPUT _ HANDLE),c);
返回0;
}
void printsnake()//打印字符蛇
{
gotoxy(2,5);
颜色(3);
printf('姓名:张小艾');
gotoxy(2,6);
颜色(3);
printf('学号:1910101099');
gotoxy(35,1);
颜色(6);
printf('/^\\/^\');
gotoxy(34,2);
printf(' | _ | o | ');
gotoxy(33,2);
颜色(2);
printf(' _ ');
gotoxy(25,3);
颜色(12);
printf(' \ \/');
gotoxy(31,3);
颜色(2);
printf('/');
gotoxy(37,3);
颜色(6);
printf(' \ \ _/');
gotoxy(41,3);
颜色(10);
printf(' \ ');
戈托西(26,4);
颜色(12);
printf(' \ \ _ _ _ _ _ _ ');
gotoxy(32,4);
printf(' _ _ _ _ _ _ _ _ _ _ _ _ ');
gotoxy(31,4);
颜色(2);
printf(' | ');
gotoxy(43,4);
颜色(10);
printf(' \ ');
gotoxy(32,5);
颜色(2);
printf(' \ \ _ _ _ _ _ _ _ ');
gotoxy(44,5);
颜色(10);
printf(' \ ');
gotoxy(39,6);
printf(' | | \ ');
gotoxy(38,7);
printf('//\ ');
gotoxy(37,8);
printf('//\ \ \ ');
gotoxy(35,9);
printf('//\ \ \ ');
gotoxy(34,10);
printf('//\ \ \ ');
gotoxy(33,11);
printf('//_-_ \ \ \ ');
gotoxy(32,12);
printf('//_-~ ~-_ | | ');
gotoxy(31,13);
printf('((_-~ _-_ ~-_ _/| ');
gotoxy(32,14);
printf(' \ \ ~-_ _ _ _ _ _ _-~ _-~ ~-_ ~-_-~/');
gotoxy(33,15);
printf(' ~-_ _-~ ~-_ _-~ ');
gotoxy(35,16);
printf(' ~-_ _ _ _ _ _ _-~ ~-_ _ _ _ _ _-~ ');
}
void wlcome()//欢迎界面
{ int n;
int i,j=1;
gotoxy(43,18);
颜色(11);
printf('贪吃蛇大作战');
颜色(14);
for(I=20;i=26我)
{
for(j=27;j=74j)
{
gotoxy(j,I);
如果(i==20||i==26)
{
printf('-');
}
else if(j==27||j==74)
{
printf(' | ');
}
}
}
颜色(12);
gotoxy(35,22);
printf('1 .开始游戏');
gotoxy(55,22);
printf('2 .游戏说明');
gotoxy(35,24);
printf('3 .退出游戏');
gotoxy(29,27);
颜色(3);
printf('请选择1 2 3 \ n’);
颜色(14);
scanf('%d ',n);
开关(名词)
{
案例1:
系统(“cls”);//清屏
创建地图();
init snake();
创造食物();
键盘控制();
打破;
案例二:
explation();
打破;
打破;
案例三:
退出(0);
打破;
}
}
void createmap()//创建地图
{
int i,j;
for(I=0;i58i=2)
{
gotoxy(i,0);
颜色(5);
printf('');
gotoxy(i,26);
printf('');
}
for(I=0;i26我)
{
gotoxy(0,I);
printf('');
gotoxy(56,I);
printf('');
}
for(I=2;i56i=2)
{
for(j=1;j26j)
{
gotoxy(i,j);
颜色(3);
printf(\ n \ n ');
}
}
}
void scoreandtips()//游戏界面右侧的得分和小提示
{
file _ out();
gotoxy(64,4);
颜色(11);
printf('*最高纪录*: %d ',高分);
gotoxy(64,8);
颜色(14);
printf('得分:%d ',分数);
颜色(13);
gotoxy(73,11);
printf('小提示');
gotoxy(60,13);
颜色(6);
printf('-');
gotoxy(60,25);
printf('-');
颜色(3);
gotoxy(64,14);
printf('每个食物得分:%d分,添加);
gotoxy(64,16);
printf('不能穿墙,不能咬到自己');
gotoxy(64,18);
printf('用分别控制蛇的移动');
gotoxy(64,20);
printf('F1为加速,F2为减速');
gotoxy(64,22);
printf('空格:暂停游戏');
gotoxy(64,24);
printf('ESC:退出游戏');
}
void file_out()//打开文件记录最高分
{
文件* fp
fp=fopen('save.txt ',' a ');
fscanf(fp,' %d ',高分);
fclose(FP);
}
void initsnake()
{
蛇*尾;
int I;
tail=(snake *)malloc(sizeof(snake)).
tail-x=24;
tail-y=5;
tail-next=NULL;
for(I=1;I=4;我)
{
head=(snake *)malloc(sizeof(snake)).
头-下=尾;
head-x=24 ^ 2 * I;
head-y=5;
尾巴=头;
}
而(尾巴!=空)
{gotoxy(tail-x,tail-y);
颜色(14);
printf(" ");//蛇身由组成
tail=tail-next;
}
}
void createfood()//随机出现食物
{
蛇*食_ 1;
srand((无符号)时间(空));
food _ 1=(snake *)malloc(sizeof(snake)).
while((food_1-x%2!=0))
{
food _ 1-x=rand()r ^ 2;
}
food _ 1-y=rand()$ 1;
q=头;
while(q-next==NULL)
{
if(q-x==food_1-xq-y==food_1-y)
{
免费(food _ 1);
创造食物();
}
q=q-next;
}
gotoxy(food_1-x,food _ 1-y);
food=food _ 1;
颜色(12);
printf(“@”);
}
int biteself()
{
蛇*自我;//定义自己为蛇身上除蛇头以外的节点
self=head-next;
而(自我!=空)
{
if(self-x==head-x self-y==head-y)
{
返回1;
}
self=self-next;
}
返回0;
}
空心斜边墙()
{
if(head-x==0 | | head-x==56 | | head-y==0 | | head-y==26)
{
endgamestatus=1;
endgame();
}
}
空的加速()//加速
{
如果(睡眠时间=50)
{
睡眠时间=睡眠时间-10;
add=add 2;
}
}
void speeddown()//减速
{
如果(睡眠时间350)
{
睡眠时间=睡眠时间30
add=add-2;
if(sleeptime==350)
{
add=1;
}
}
}
void snakemove()//控制方向
{
snake * nexthead
斜跨墙();
nexthead=(snake *)malloc(sizeof(snake));
if(status==U)//上
{
下一个head-x=head-x;//向上前进时,x不变,y-1
下一个head-y=head-y-1;
下一个head-next=head;
head=nexthead
q=头;
//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
if(next head-x==food-x next head-y==food-y)
{
而(q!=空)
{
gotoxy(q-x,q-y);
颜色(14);
printf(" ");
q=q-next;
}
分数=分数相加;
speedup();
创造食物();
}
其他
{
while(q-next-next!=NULL)//如果没有遇见食物
{
gotoxy(q-x,q-y);
颜色(14);
printf(" ");
q=q-next;
}
//经过上面的循环,问指向蛇尾,蛇尾的下一步就是蛇走过去的位置
gotoxy(q-next-x,q-next-y);
颜色(3);
printf('');//恢复走过的位置
免费(q-next);
q-next=NULL;
}
}
如果(状态==D)
{
下一个head-x=head-x;//向下前进时,x不变,y 1
下一个head-y=head-y 1;
下一个head-next=head;
head=nexthead
q=头;
//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
if(next head-x==food-x next head-y==food-y)
{
而(q!=空)
{
gotoxy(q-x,q-y);
颜色(14);
printf(" ");
q=q-next;
}
分数=分数相加;
speedup();
创造食物();
}
其他
{
while(q-next-next!=NULL)//如果没有遇见食物
{
gotoxy(q-x,q-y);
颜色(14);
printf(" ");
q=q-next;
}
//经过上面的循环,问指向蛇尾,蛇尾的下一步就是蛇走过去的位置
gotoxy(q-next-x,q-next-y);
颜色(3);
printf('');//恢复走过的位置
免费(q-next);
q-next=NULL;
}
}
if(status==L)//左
{
下一个head-x=head-x-2;//向左前进时,x不变,y 1
下一个head-y=head-y;
下一个head-next=head;
head=nexthead
q=头;
//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
if(next head-x==food-x next head-y==food-y)
{
而(q!=空)
{
gotoxy(q-x,q-y);//食物变成蛇身上的一部分
颜色(14);
printf(" ");
q=q-next;
}
分数=分数相加;
speedup();
创造食物();
}
其他
{
while(q-next-next!=NULL)//如果没有遇见食物
{
gotoxy(q-x,q-y);
颜色(14);
printf(" ");
q=q-next;
}
//经过上面的循环,问指向蛇尾,蛇尾的下一步就是蛇走过去的位置
gotoxy(q-next-x,q-next-y);
颜色(3);
printf('');//恢复走过的位置
免费(q-next);
q-next=NULL;
}
}
如果(状态==R)
{
下一个head-x=head-x ^ 2;//向上前进时,x不变,y-1
下一个head-y=head-y;
下一个head-next=head;
head=nexthead
q=头;
//如果下一个位置上有食物,下一个位置的坐标和食物坐标相同
if(next head-x==food-x next head-y==food-y)
{
而(q!=空)
{
gotoxy(q-x,q-y);
颜色(14);
printf(" ");
q=q-next;
}
分数=分数相加;
speedup();
创造食物();
}
其他
{
while(q-next-next!=NULL)//如果没有遇见食物
{
gotoxy(q-x,q-y);
颜色(14);
printf(" ");
q=q-next;
}
//经过上面的循环,问指向蛇尾,蛇尾的下一步就是蛇走过去的位置
gotoxy(q-next-x,q-next-y);
颜色(3);
printf('');//恢复走过的位置
免费(q-next);
q-next=NULL;
}
}
if(biteself()==1)
{
endgamestatus=2;
endgame();
}
}
void keyboardcontrol()
{
status=R;
while(1)
{
score and tips();
//GetAsyncKeyState函数用来判断函数调用指定虚拟键的状态
if(GetAsyncKeyState(VK _上)状态!=D)
{
status=U;
}
else if(GetAsyncKeyState(VK _下)状态!=U)
{
状态=D;
}
else if(GetAsyncKeyState(VK _左)状态!=R)
{
status=L;
}
else if(GetAsyncKeyState(VK _右)状态!=L)
{
status=R;
}
if(GetAsyncKeyState(VK空间))
{
while(1)
{
//调用睡眠函数,令进程停止,直到达到其中设定的参数时间
睡眠(300);
if(GetAsyncKeyState(VK空间))
{
打破;
}
}
}
else if(GetAsyncKeyState(VK _转义))
{
endgamestatus=3;
打破;
}
else if(GetAsyncKeyState(VK_F1))
{
speedup();
}
else if(GetAsyncKeyState(VK_F2))
{
如果(睡眠时间350)
{
睡眠时间=睡眠时间30
add=add-2;
if(sleeptime==350)
{
add=1;
}
}
}
睡眠(睡眠时间);
蛇动();
}
}
void lostdraw()
{
系统(“cls”);
int i,j;
gotoxy(17,5);
颜色(11);
printf('-');
gotoxy(35,5);
颜色(14);
printf(' o00o ');
gotoxy(39,5);
颜色(11);
printf('-');
gotoxy(48,5);
颜色(14);
printf('-');
gotoxy(51,5);
颜色(11);
printf('-');
gotoxy(61,5);
颜色(14);
printf(' o00o ');
gotoxy(65,5);
颜色(11);
printf('-');
for(I=6;i=19我)
{
gotoxy(17,I);
printf(' | ');
gotoxy(82,I);
printf(' | ');
}
gotoxy(17,20);
printf('-');
gotoxy(52,20);
颜色(11);
printf('-');
}
void endgame()
{
系统(“cls”);
if(endgamestatus==1)
{
输了平局();
gotoxy(35,9);
颜色(12);
printf('对不起,您撞到墙了。游戏结束!');
}
else if(endgamestatus==2)
{
输了平局();
gotoxy(35,9);
颜色(12);
printf('对不起,您咬到自己了。游戏结束!');
}
else if(endgamestatus==3)
{
输了平局();
gotoxy(40,9);
颜色(12);
printf('您结束了游戏。');
}
gotoxy(43,12);
颜色(13);
printf('您的得分是%d ',分数);
如果(得分=高分)
{
颜色(10);
gotoxy(33,16);
printf('创新纪录啦!你真棒!');
file _ in();
}
选择();
}
void file_in()//将最高分存储到文件中
{
文件* fp
fp=fopen('save.txt ',' w ');//以读写的方式建立文件
fprintf(fp,' %d ',score);
fclose(FP);
}
空的选择()
{
int n;
gotoxy(25,23);
颜色(12);
printf('重玩一局- 1');
gotoxy(52,23);
Printf('停止播放并退出-2 ');
gotoxy(46,25);
颜色(11);
printf(' Select:');
scanf('%d ',n);
开关(n)
{
案例1:
系统(“cls”);
得分=0;
sleeptime=200
add=10
print snake();
wlcome();
打破;
案例二:
退出(0);
打破;
默认值:
gotoxy(35,27);
颜色(12);
Printf('您输入错误,请重新输入');
系统(“pause nul”);//按任意键
endgame();
选择();
打破;
}
}
无效解释()
{
int i,j=1;
系统(“cls”);
颜色(13);
gotoxy(44,3);
Printf('游戏描述');
颜色(2);
for(I=6;i=22我)
{
for(j=20;j=75j)
{
gotoxy(j,I);
if(I==6 | | I==22)printf('=');
else if(j==20 | | j==75)printf(' | | ');
}
}
颜色(3);
gotoxy(30,8);
printf(‘1,不能穿墙咬自己’);
颜色(3);
gotoxy(30,8);
printf(‘1,不能穿墙咬自己’);
颜色(10);
gotoxy(30,11);
Printf('2,用分别控制蛇的移动');
颜色(14);
gotoxy(30,14);
Printf('3,F1表示加速,F2表示减速');
颜色(11);
gotoxy(30,17);
Printf('4,按空格键暂停游戏,再按空格键继续');
颜色(4);
gotoxy(30,20);
Printf('5,ESC:退出游戏,space:暂停游戏');
getch();//按任意键返回主界面
系统(“cls”);
print snake();
wlcome();
}
更多有趣的经典小游戏实现话题,分享给大家:
经典游戏总结
经典python游戏总结
Python俄罗斯方块游戏合集
经典的JavaScript游戏不停地玩。
经典java游戏总结
经典javascript游戏总结
这就是本文的全部内容。希望对大家的学习有帮助,支持我们。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。