鱼C论坛

 找回密码
 立即注册
查看: 1037|回复: 1

[技术交流] 贪吃蛇小游戏,此代码是在手机版C语言编译器上写的,望大佬指正

[复制链接]
发表于 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;//退出
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-1-8 20:17:54 | 显示全部楼层
我看不懂 但是我打我震撼
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 18:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表