这次来分享一个我写的贪吃蛇小游戏程序(C语言)
最近暑假无事开始用C语言写一些小游戏小游戏程序,这个贪吃蛇当然是经典中的经典,所以先开始写。
文件引用#include//输入输出
#include//用于获取随机数
#include//控制DOS界面
#include//定义了一些宏和通用工具函数
#include // 接收键盘输入输出
函数声明
/**************************函数声明***************************/
void gotoxy(int x,int y); //设置光标位置
int color(int c); //更改文字颜色
void printsnake(); //字符画--蛇
void welcome(); //开始界面
void createMap(); //绘制地图
void scoreandtips(); //游戏界面右侧的积分和小提示
void initsnake(); //初始化蛇身,花蛇身
void createfood(); //创建并随机出现食物
int biteself(); //判断是否咬到自己
void cantcrosswall(); //设置蛇撞到墙的情况
void speedup(); //加速
void speeddown(); //减速
void snakemove(); //控制蛇前进方向
void keyjianpan(); //控制键盘按键
void Lostdraw(); //游戏结束界面
void endgame(); //游戏结束
void choose(); //游戏失败之后的选择
void File_out(); //在文件中读取最高分
void File_in(); //储存最高分文件
void explation(); //游戏说明
游戏欢迎界面
/********************游戏欢迎界面***********************/
int color(int c) //颜色函数
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);//更改文字颜色
return 0;
}
void gotoxy(int x,int y) //设置光标位置
{
COORD c;
c.X=x;
c.Y=y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
void printsnake()
{
int i,j=10;
gotoxy(37,21);
color(14);
printf(" 张 洋 贪 吃 蛇\n 欢 迎 你!");
gotoxy(19-1,9);
color(12);
printf("张洋");
gotoxy(23-1,9);
color(12);
printf("张洋");
gotoxy(27-1,9);
color(12);
printf("张洋");
gotoxy(27-1,11);
color(12);
printf("张洋");
gotoxy(19-1,13);
color(12);
printf("张洋");
gotoxy(23-1,13);
color(12);
printf("张洋");
gotoxy(27-1,13);
color(12);
printf("张洋");
for(i=20;ix&&q->y==food_1->y) //判断蛇身是否与食物重合
{
free(food_1); //如果食物与蛇身重合,那么释放食物指针
createfood (); //重新创建食物
}
q=q->next;
}
gotoxy(food_1->x,food_1->y); //设置食物位置
food=food_1;
color(12);
printf("▼"); //输出食物
}
此时贪吃蛇的游戏界面就已经大致做好,剩下的是进行游戏需要的逻辑等;
/**********************************游戏逻辑**********************************/
/*********************判断是否咬到自己*****************/
int biteself()
{
snake *self; //定义self为蛇身上的一个节点
self=head->next; //self是蛇头之外的蛇身上的节点
while(self!=NULL)
{
if (self->x==head->x&&self->y==head->y) //如果self和蛇头上的节点重合
{
return 1; //返回1
}
self=self->next; //循环蛇上的每一个节点
}
return 0;
}
/************判断蛇是否撞到墙******************/
void cantcrosswall()
{
if (head->x==0||head->x==56||head->y==0||head->y==26)//如果蛇头碰到了墙壁
{
endgamestatus=1; //返回第一种情况
}
}
/*******************设置蛇加速前进**********/
void speedup()
{
if (sleeptime>=50) //如果时间间隔大于等于50
{
sleeptime=sleeptime-10; //时间间隔减10
add=add+2; //每吃一次食物的得分加2
if(sleeptime==320)
{
add=2; //防止减到1之后再加回来有错
}
}
}
/*******************设置蛇减速前进************/
void speeddown()
{
if (sleeptimex=head->x; //向上前进时,x坐标不变,y坐标-1
nexthead->y=head->y-1;
nexthead->next=head;
q=head; //指针q指向蛇头
//如果下一个有食物,下一个位置的坐标和食物的坐标相同
if (nexthead->x==food->x&&nexthead->y==food->y)
{
while (q!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("⊕"); //原来食物的位置,从▼变成⊕
q=q->next; //指针q指向的蛇身的下一位也执行循环里的操作
}
score=score+add; //吃了一个食物,在总分上加上食物的分
speedup();
createfood(); //创建食物
}
else
{
while (q->next->next!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("⊕"); //蛇正常往前走,输出当前位置的蛇身
q=q->next; //继续输出整个蛇身
}
//经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next); //进行输出▼之后,释放指向下一位的指针
q->next=NULL; //指针下一位指向空
}
}
///
if (status==S)
{
nexthead->x=head->x; //向上前进时,x坐标不变,y坐标+1
nexthead->y=head->y+1;
nexthead->next=head;
q=head; //指针q指向蛇头
//如果下一个有食物,下一个位置的坐标和食物的坐标相同
if (nexthead->x==food->x&&nexthead->y==food->y)
{
while (q!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("⊕"); //原来食物的位置,从▼变成⊕
q=q->next; //指针q指向的蛇身的下一位也执行循环里的操作
}
score=score+add; //吃了一个食物,在总分上加上食物的分
speedup();
createfood(); //创建食物
}
else
{
while (q->next->next!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("⊕"); //蛇正常往前走,输出当前位置的蛇身
q=q->next; //继续输出整个蛇身
}
//经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next); //进行输出▼之后,释放指向下一位的指针
q->next=NULL; //指针下一位指向空
}
}
/
if (status==A)
{
nexthead->x=head->x-2; //向左前进时,x坐标向左移动-2,y坐标不变
nexthead->y=head->y;
nexthead->next=head;
q=head; //指针q指向蛇头
//如果下一个有食物,下一个位置的坐标和食物的坐标相同
if (nexthead->x==food->x&&nexthead->y==food->y)
{
while (q!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("⊕"); //原来食物的位置,从▼变成⊕
q=q->next; //指针q指向的蛇身的下一位也执行循环里的操作
}
score=score+add; //吃了一个食物,在总分上加上食物的分
speedup();
createfood(); //创建食物
}
else
{
while (q->next->next!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("⊕"); //蛇正常往前走,输出当前位置的蛇身
q=q->next; //继续输出整个蛇身
}
//经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next); //进行输出▼之后,释放指向下一位的指针
q->next=NULL; //指针下一位指向空
}
}
/
if (status==D)
{
nexthead->x=head->x+2; //向右前进时,x坐标向左移动+2,y坐标不变
nexthead->y=head->y;
nexthead->next=head;
q=head; //指针q指向蛇头
//如果下一个有食物,下一个位置的坐标和食物的坐标相同
if (nexthead->x==food->x&&nexthead->y==food->y)
{
while (q!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("⊕"); //原来食物的位置,从▼变成⊕
q=q->next; //指针q指向的蛇身的下一位也执行循环里的操作
}
score=score+add; //吃了一个食物,在总分上加上食物的分
speedup();
createfood(); //创建食物
}
else
{
while (q->next->next!=NULL)
{
gotoxy(q->x,q->y);
color(14);
printf("⊕"); //蛇正常往前走,输出当前位置的蛇身
q=q->next; //继续输出整个蛇身
}
//经过上面的循环,q指向蛇尾,蛇尾的下一位,就是蛇走过去的位置
gotoxy(q->next->x,q->next->y);
color(3);
printf("■");
free(q->next); //进行输出▼之后,释放指向下一位的指针
q->next=NULL; //指针下一位指向空
}
}
if (biteself()==1) //判断是否会咬到自己
{
endgamestatus=2;
}
}
/******************************* 键盘 ************************************/
void key()
{
status=R; //初始蛇向右移动
while (1)
{
scoreandtips(); //游戏界面右侧的得分和小提醒
//GetAsyncKeyState函数 用来判断函数调用时指定虚拟键的状态
if (GetAsyncKeyState(VK_UP)&&status!=S)
{
status=W; //如果蛇不是向下前进的时候,按向上键,执行向上前进操作
}
else if (GetAsyncKeyState(VK_DOWN)&&status!=W)
{
status=S; //如果蛇不是向上前进的时候,按向下键,执行向下前进操作
}
else if (GetAsyncKeyState(VK_LEFT)&&status!=D)
{
status=A; //如果蛇不是向右前进的时候,按向左键,执行向左前进操作
}
else if (GetAsyncKeyState(VK_RIGHT)&&status!=A)
{
status=D; //如果蛇不是向左前进的时候,按向右键,执行向右前进操作
}
if (GetAsyncKeyState(VK_SPACE)) //按下暂停键,执行pause暂停函数
{
while (1)
{
//Sleep()函数,头文件#include 另进程暂停,直到达到里面设定参数的时间
Sleep(300);
if (GetAsyncKeyState(VK_SPACE)) //按下空格键暂停
{
break;
}
}
}
else if (GetAsyncKeyState(VK_ESCAPE))
{
endgamestatus=3; //按ESC,直接到结束界面
break;
}
else if (GetAsyncKeyState(VK_F1)) //按F1,加速
{
speedup();
}
else if (GetAsyncKeyState(VK_F2)) //按F2,减速
{
if (sleeptime
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?