|
发表于 2022-1-8 20:06:54
From FishC Mobile
|
显示全部楼层
|阅读模式
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
//———作者:情癫大圣
//vvvvvvvv头文件vvvvvvvv
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
// vvvvvvvv函数申明vvvvvvvvv
void ta1();// 图案1
void ta2();// 图案2
void kscd();// 开始菜单1
void szcd();// 设置菜单1
void bzcd();// 帮助菜单1
void tchm();// 退出画面1
void dysy();// 游戏打印1
void csss();// 初始蛇身1
void yxkz();// 游戏键盘控制1
void sssj();// 蛇身数据1
void sjsw();// 随机食物1
void ztjm();// 暂停界面1
void yxgz();//游戏规则1
// vvvvvvvvv全局变量声明vvvvvvvv
int jx =39, jy = 20;// 界面宽高
struct
{
int x[100];
int y[100];
int c;
} ss;//蛇的坐标和长度
int df;// 游戏得分
int sx, sy;// 食物坐标
int x, y;// 蛇头坐标
char x1,y2;// 键盘输入数据
int nd = 2;// 游戏难度
int pd;//游戏状态
long sj;// 游戏开始时间
// vvvvvvvvv具体函数vvvvvvvv
void ztjm()//暂停界面
{
long c = time(NULL);//计时
if (y2 == ' ')
{
for (int c = 8; c > 0; c--) //动画
{
clrscr();// 清屏
usleep(10000);// 延时
gotoxy(1, 8 - c);
ta1();//图案1
gotoxy(16, 10 - c);
printf(" 游戏暂停中-----");
gotoxy(jx / 2 - 16, 13 - c);
printf("————在");
if (nd == 1)
printf("简单模式");
if (nd == 2)
printf("一般模式");
if (nd == 3)
printf("困难模式");
if (nd == 4)
printf("地狱模式");
printf("中你获得了< %d >分————", df);
gotoxy(jx / 2 - 11, 16 - c);
printf("[1]继续游戏\t[3]退出游戏");
}
int b = getch();
switch (b)
{
case '3'://退出
pd = 1;
break;
case '1':
//继续
break;
default:
ztjm();//递归
}
y2 = '0';
sj = sj - (c - time(NULL));//减去暂停计时的时间
}
}
void yxgz() // 食物刷新与得分游戏规则
{
if (nd > 2) //难度大与2判断撞墙
{
if (x== 1 ||x== jx ||y== 2 || y== jy)
// 判断蛇有没有与墙坐标重合
pd = 3;
}
else//否则穿墙
{
if (x == 1)
x = jx-1 ;
if (x == jx)
x = 2;
if (y == 2)
y = jy - 1;
if (y == jy)
y = 3;
}
if (nd > 1) //难度大于1判断
{
for (int q = 1; q < ss.c; q++)
{ // 判断有没有蛇头有没有与蛇身重合
if (ss.x[q] == x && ss.y[q] == y)
pd = 2;
}
}
if (x == sx && y == sy)
{ //判断蛇头与食物重合刷新食物
sjsw();//随机食物函数
ss.c = ++ss.c;//蛇身长度增加
df += 10;//分数增加
}
if (nd == 4)//难度4变速
usleep(130000 - (df * 200));
else
usleep(200000 - (df * 100));
}
void dysy()// 打印所有数据
{
clrscr();//清屏
while (pd < 1)//判断游戏状态循环
{
yxkz();//游戏控制函数
yxgz();//游戏规则函数
sssj();//蛇身数据函数
ztjm();//暂停界面函数
gotoxy(1, 1);
printf("§∩﹏∩ ");
if (nd == 1)
printf("简单模式");
if (nd == 2)
printf("一般模式");
if (nd == 3)
printf("困难模式");
if (nd == 4)
printf("地狱模式");
printf("‖得分:%d ",df);
gotoxy(24,1);
printf("分‖时间:%d ",(time(NULL) - sj) / 60);
gotoxy(34,1);//游戏时间
printf("分%d秒", (time(NULL) - sj) % 60);
for (int o = 1; o <= jx; o++)
for (int p = 2; p <= jy; p++)
{ //遍历打印边框背景
if (o == 1 || o == jx || p == 2 || p == jy) {
gotoxy(o, p);
printf("■");//边框图形
} else {
gotoxy(o, p);
printf("□");//背景图形
}
for (int q = ss.c - 1; 0 <= q; q--)
{ //遍历打印蛇
if (ss.x[q] == o && ss.y[q] == p)
{
gotoxy(o, p);
printf("◆");//蛇身图形
}
if (ss.x[0] == o && ss.y[0] == p)
{
gotoxy(o, p);
printf("●");//蛇头图形
}
}
if (sx == o && sy == p)
{
gotoxy(o, p);
printf("■");//食物图形
}
}
gotoxy(1,jy+1);
printf("X=%d Y=%d ",sx,sy);
gotoxy(10,jy+1);
printf("‖空格暂停 [2]上[8]下[4]左[6]右",x,y);
gotoxy(1,1);
}
}
void sssj()// 蛇身数据函数
{
for (int t = ss.c - 1; t > 0; t--)
{ //从蛇尾遍历蛇,蛇尾=前一位数据
ss.x[t] = ss.x[t - 1];
ss.y[t] = ss.y[t - 1];
}
ss.x[0] = x;//蛇头等于游戏控制函数返回的xy
ss.y[0] = y;
}
void csss()// 初始蛇身函数
{
ss.c =6;//初始蛇长
for (int s = 0; s < ss.c; s++)
{ //遍历蛇附值
ss.x[s] = jx / 2 - s;
ss.y[s] = jy / 2;
}
x = jx / 2;//初始蛇头坐标xy在地图中间
y = jy / 2;//
}
void sjsw()// 随机食物
{
srand((unsigned)time(NULL));//随机数种子
int swx =(rand() % (jx - 1) + 1) + 1;
int swy =(rand() % (jy - 3) + 1) + 2;
for (int s = 0; s < ss.c; s++) {
if (ss.x[s] != swx || ss.y[s] != swy)
{ //判断食物与蛇是否重合
sx = swx;
sy = swy;
} else//重合重新生成
{
usleep(100);// 延时作用:没有这个一直递归会报错
sjsw();//递归
}
}
}
void yxkz()// 游戏键盘控制
{
if (_kbhit())// 判断有无输入
{
y2 = _getch();// 提取输入字符
}
if (y2 == '2' || y2 == '4' || y2 == '8' || y2 == '6')
// 判断是不是输入的是方向
{
if (x1 == '4' && y2 != '6')// 蛇不能倒着走
x1 = y2;
if (x1 == '8' && y2 != '2')
x1 = y2;
if (x1 == '6' && y2 != '4')
x1 = y2;
if (x1 == '2' && y2 != '8')
x1 = y2;
}
if (x1 == '6')//控制蛇头xy移动
x = ++x;
else if (x1 == '4')
x = --x;
else if (x1 == '8')
y = ++y;
else if (x1 == '2')
y = --y;
}
void bzcd()// 帮助菜单函数
{
clrscr();// 清屏
for (int v = 16; v > 0; v--)//动画
{
usleep(15000);// 延时
clrscr();// 清屏
gotoxy(1, 18 - v);
ta1();//图案1
}
gotoxy(jx / 2 - 3, 19);
printf("作者:情癫大圣");
gotoxy(jx / 2 - 13, 14);
printf("暂时没有其他帮助自己瞎鼓捣吧!!!");
gotoxy(jx / 2 - 2, 3);
printf("难度说明:");
gotoxy(jx / 2 - 10, 6);
printf("简单:√穿墙 √咬自己 慢速度");
gotoxy(jx / 2 - 10, 8);
printf("一般:√穿墙 ×咬自己 慢速度");
gotoxy(jx / 2 - 10, 10);
printf("困难:×穿墙 ×咬自己 慢速度");
gotoxy(jx / 2 - 10, 12);
printf("地狱:×穿墙 ×咬自己 快速度");
getch();
}
void szcd()// 设置菜单
{
clrscr();// 清屏
for (int a = 16; a > 0; a--) //动画
{
usleep(15000);// 延时
clrscr();// 清屏
gotoxy(1, 1 + a);
ta1();//图案1
}
gotoxy(jx / 2 - 5, 8);
printf("当前难度:< %d >", nd);
gotoxy(jx / 2 - 9, 11);
printf("[1]简单\t[2]一般");
gotoxy(jx / 2 - 9, 13);
printf("[3]困难\t[4]地狱");
gotoxy(jx / 2 - 5, 16);
printf("输入数学选择");
int xz = getch();
switch (xz)
{
case '1':
nd = 1;
kscd();//开始菜单函数
break;
case '2':
nd = 2;
kscd();//开始菜单函数
break;
case '3':
nd = 3;
kscd();//开始菜单函数
break;
case '4':
nd = 4;
kscd();//开始菜单函数
break;
default:
szcd();//递归
}
}
void tchm()// 退出画面
{
for (int a = 8; a > 0; a--)
{
usleep(15000);// 延时
clrscr();// 清屏
gotoxy(1, 8 - a);
ta1();//图案1
}
if (pd <1)
{
gotoxy(jx / 2 - 9, 14);
printf("———作者:情癫大圣———");
gotoxy(jx / 2 - 11, 18);
printf("[1]返回主页\t[3]确认退出");
char b = getch();
switch (b)
{
case '3':
gotoxy(jx / 2 - 11, 14);
break;
case '1':
pd = 0;
kscd();//开始菜单函数
break;
default:
tchm();//递归
}
}
else {
gotoxy(jx / 2 - 16, 13 );
printf("————在");
if (nd == 1)
printf("简单模式");
if (nd == 2)
printf("一般模式");
if (nd == 3)
printf("困难模式");
if (nd == 4)
printf("地狱模式");
printf("中你获得了< %d >分————", df);
gotoxy(jx / 2 - 3, 9 );
printf("————GAME—OVER————");
gotoxy(jx / 2 - 12,15);
printf("蛇身长度:%d,游戏时间:%d分%d秒",ss.c-1,(time(NULL) - sj) / 60, (time(NULL) - sj) % 60);
gotoxy(jx / 2 - 9, 17 );
if(pd==3)
printf("———— 蛇撞到了墙上 ————");
else
{
if(pd==2)
printf("———— 蛇吃掉了自己 ————");
else
printf("———作者:情癫大圣———");
}
gotoxy(jx / 2 - 5, 20 );
printf("空格键返回主页");
while(getch()!=' ');
pd = 0;
kscd();//开始菜单函数
}
}
void ta1()// 图案1
{
printf(" §∩﹏∩\n");
printf(" ╭︿︿╮╭─☆─★─☆─★─☆─★─☆─★─☆─╮\n");
printf(" ╰────╯< Gluttonous Snake │\n");
printf(" ╰─○○─╯╰─★─☆─★─☆─★─☆─★─☆─★─╯\n");
}
void ta2()// 图案2
{
printf(" Y \n");
printf(" /^\\ \n");
printf(" (⊙⊙) \n");
printf(" \\/ \n");
printf(" || \n");
printf(" \\\\ \n");
printf(" \\\\\n");
printf(" // \n");
printf(" // \n");
printf(" // \n");
printf(" \\\\\n");
printf(" \\\\ \n");
printf(" \n");
}
void kscd()// 开始菜单
{
clrscr();// 清屏
for (int a = 16; a > 0; a--) //动画
{
usleep(15000);// 延时
clrscr();// 清屏
gotoxy(1, 1 + a);
ta1();//图案1
}
gotoxy(1, 6);
ta2();//图案2
gotoxy(jx / 2 - 7, 6);
printf("欢迎来到贪吃蛇大作战");
gotoxy(jx / 2 - 3, 8);
printf("[1]开始游戏");
gotoxy(jx / 2 - 3, 10);
printf("[2]难度设置< %d >", nd);
gotoxy(jx / 2 - 3, 12);
printf("[3]游戏说明");
gotoxy(jx / 2 - 3, 14);
printf("[4]退出游戏");
gotoxy(jx / 2 - 3, 16);
printf("输入数学选择");
int xz = getch();
switch (xz)
{
case '1':
sj = time(NULL);//初始游戏时间
y2='0';//初始键盘输入数据
df = 0;//初始得分
pd = 0;//初始游戏状态
x1 = '6';//初始蛇移动方向
csss();//初始蛇身函数
sjsw();//初始食物
dysy();//打印数据函数
tchm();//退出画面函数
break;
case '2':
szcd();//设置菜单函数
break;
case '3':
bzcd();// 帮助菜单函数
kscd();//递归
break;
case '4':
tchm();//退出菜单函数
break;
default:
kscd();//递归
}
}
int main()// 主函数
{ //关闭光标显示 弄懂
fprintf(stdout,"\033[?25l");// 关闭鼠标显示
kscd();//开始菜单函数
for (int a = 8; a > 0; a--)//动画
{
clrscr();// 清屏
gotoxy(1, 8 - a);
ta1();//图案1
gotoxy(jx / 2 - 3, 10 - a);
printf(" 下 次 再 见 ! ");
usleep(20000);// 延时
}
gotoxy(1, jy - 3);
return 0;//退出
}
|
|