首页 > 编程语言 > 详细

【C语言项目】贪吃蛇游戏(下)

时间:2019-06-25 13:27:45      阅读:135      评论:0      收藏:0      [点我收藏+]

00. 目录

07. 游戏逻辑

7.5 按下ESC键结束游戏

在moveKeyControl函数中添加如下代码片段

        //按下F2减速
        if (GetAsyncKeyState(VK_F2))
        {
            speedDown();
        }

        //按下ESC键 结束游戏
        if (GetAsyncKeyState(VK_ESCAPE))
        {
            endStatus = 3;

            break;
        }

7.6 判断是否撞到墙

参考代码:

//判断是否撞墙
int isHitWall(void)
{
    if (head->x == 0 || head->x == 56 || head->y == 0 || head->y == 26)
    {
        return 1;
    }
}

在snake.c文件moveKeyControl函数中添加如下代码

        Sleep(sleepTime);

        moveSnake();

        //判断是否撞墙
        if (isHitWall())
        {
            endStatus = 1;

            break;
        }

7.7 判断是否咬到自己

判断是否咬到自己

//判断是否咬到自己
int isBitSelf(void)
{
    snake_t *tmp = NULL;

    tmp = head->next;
    while (NULL != tmp)
    {
        if (tmp->x == head->x && tmp->y == head->y)
        {
            return 1;
        }
        
        tmp = tmp->next;
    }

    return 0;
}

在snake.c文件moveKeyControl函数中添加如下代码

        //判断是否撞墙
        if (isHitWall())
        {
            endStatus = 1;

            break;
        }

        //判断是否咬到自己
        if (isBitSelf())
        {
            endStatus = 2;

            break;
        }

08. 游戏失败界面设计

8.1 游戏失败界面边框设计

技术分享图片

游戏边框失败界面分析

技术分享图片

参考源代码

//游戏失败界面边框
void failGameUi(void)
{
    int i;

    system("cls");

    //显示游戏失败提示
    setColor(12);
    gotoXY(44, 3);
    printf("游 戏 失 败!!!");

    setColor(11);
    gotoXY(17, 5);

    //绘制上边框
    printf("+----------------------------------------------------------------+");

    //绘制下边框
    gotoXY(17, 20);
    printf("+----------------------------------------------------------------+");

    //绘制左右边框
    for (i = 6; i < 20; i++)
    {
        gotoXY(17, i);
        printf("|");

        gotoXY(82, i);
        printf("|");
    }
}

在moveKeyControl函数中按下ESC选项中添加如下代码

        //按下ESC键 结束游戏
        if (GetAsyncKeyState(VK_ESCAPE))
        {
            endStatus = 3;
            failGameUi();
            break;
        }

8.2 撞墙失败界面

显示效果如下:
技术分享图片

界面分析

技术分享图片

参考代码:

//结束游戏
int endGame(void)
{
    int n;
    int highScore;

    //显示游戏失败边框
    failGameUi();

    setColor(12);

    //根据不同的状态显示不同的失败提示
    switch (endStatus)
    {
        //撞到墙
    case 1:
        gotoXY(38, 9);
        printf("您撞到墙了,游戏结束!!!");
        break;

        //咬到自己
    case 2:
        break;

        //用户按下ESC退出
    case 3:
        break;

    default:
        ;
    }

    //显示您的得分
    gotoXY(43, 12);
    setColor(13);
    printf("您的得分: %d", score);


    //从文件中读取最高分
    highScore = readFile();

    if (score > highScore)
    {
        setColor(10);
        gotoXY(38, 16);
        printf("恭喜你, 你已经创记录了,");
        //写文件
        //writeFile(score);
    }
    else
    {
        setColor(10);
        gotoXY(38, 16);
        printf("加油哦,离最高分还差%d分", highScore - score);
    }

    
    return 0;
}

8.3 咬到蛇身失败界面

显示效果如下:

技术分享图片

在endGame函数中修改代码如下

//结束游戏
int endGame(void)
{
    int n;
    int highScore;

    //显示游戏失败边框
    failGameUi();

    setColor(12);
    gotoXY(38, 9);

    //根据不同的状态显示不同的失败提示
    switch (endStatus)
    {
        //撞到墙
    case 1:
        printf("您撞到墙了,游戏结束!!!");
        break;

        //咬到自己
    case 2:
        printf("您咬到蛇身了,游戏结束!");
        break;

        //用户按下ESC退出
    case 3:
        break;

    default:
        ;
    }

    //显示您的得分
    gotoXY(43, 12);
    setColor(13);
    printf("您的得分: %d", score);


    //从文件中读取最高分
    highScore = readFile();

    if (score > highScore)
    {
        setColor(10);
        gotoXY(38, 16);
        printf("恭喜你, 你已经创记录了,");
        //写文件
        //writeFile(score);
    }
    else
    {
        setColor(10);
        gotoXY(38, 16);
        printf("加油哦,离最高分还差%d分", highScore - score);
    }

    return 0;
}

8.4 ESC结束游戏界面

显示效果:
技术分享图片

在endGame函数中修改代码如下

//结束游戏
int endGame(void)
{
    int n;
    int highScore;

    //显示游戏失败边框
    failGameUi();

    setColor(12);
    gotoXY(38, 9);

    //根据不同的状态显示不同的失败提示
    switch (endStatus)
    {
        //撞到墙
    case 1:
        printf("您撞到墙了,游戏结束!!!");
        break;

        //咬到自己
    case 2:
        printf("您咬到蛇身了,游戏结束!");
        break;

        //用户按下ESC退出
    case 3:
        printf("您已经结束了游戏,游戏结束");
        break;

    default:
        ;
    }

    //显示您的得分
    gotoXY(43, 12);
    setColor(13);
    printf("您的得分: %d", score);


    //从文件中读取最高分
    highScore = readFile();

    if (score > highScore)
    {
        setColor(10);
        gotoXY(38, 16);
        printf("恭喜你, 你已经创记录了,");
        //写文件
        //writeFile(score);
    }
    else
    {
        setColor(10);
        gotoXY(38, 16);
        printf("加油哦,离最高分还差%d分", highScore - score);
    }

    return 0;
}

8.5 界面添加选择

显示效果如下:

技术分享图片

界面分析

技术分享图片

代码实现

//结束游戏
int endGame(void)
{
    int n;
    int highScore;

    while (1)
    {
        //显示游戏失败边框
        failGameUi();

        setColor(12);
        gotoXY(38, 9);

        //根据不同的状态显示不同的失败提示
        switch (endStatus)
        {
            //撞到墙
        case 1:
            printf("您撞到墙了,游戏结束!!!");
            break;

            //咬到自己
        case 2:
            printf("您咬到蛇身了,游戏结束!");
            break;

            //用户按下ESC退出
        case 3:
            printf("您已经结束了游戏,游戏结束");
            break;

        default:
            ;
        }

        //显示您的得分
        gotoXY(43, 12);
        setColor(13);
        printf("您的得分: %d", score);


        //从文件中读取最高分
        highScore = readFile();

        if (score > highScore)
        {
            setColor(10);
            gotoXY(38, 16);
            printf("恭喜你, 你已经创记录了,");
            //写文件
            //writeFile(score);
        }
        else
        {
            setColor(10);
            gotoXY(38, 16);
            printf("加油哦,离最高分还差%d分", highScore - score);
        }

        //输出用户选择信息
        gotoXY(25, 23);
        setColor(12);
        printf("在玩一局请输入: 1");

        gotoXY(52, 23);
        printf("直接退出请输入:2");

        gotoXY(46, 25);
        setColor(11);
        printf("请选择:");

        scanf("%d", &n);
        getchar();

        if (1 == n)
        {
            score = 0;
            sleepTime = 350;
            add = 1;
            break;
        }
        else if (2 == n)
        {
            exit(0);
        }
        else
        {
            gotoXY(30, 27);
            setColor(12);
            printf("您的输入有误, 请重新输入, 按下任意键继续");
            getchar();
        }
    }
    return 0;
}

8.6 写文件实现

//写文件
int writeFile(int score)
{
    FILE *fp = NULL;

    fp = fopen("save.txt", "w+");

    fprintf(fp, "%d", score);

    fclose(fp);

    return 0;
}

在endGame函数中,如果破纪录了就写文件


        if (score > highScore)
        {
            setColor(10);
            gotoXY(38, 16);
            printf("恭喜你, 你已经创记录了,");
            //写文件
            writeFile(score);
        }

09. 一起来找茬


//销毁蛇
int destroySnake(void)
{
    snake_t *tmp = NULL;
    snake_t *save = NULL;

    tmp = head;
    while (NULL != tmp)
    {
        save = tmp->next;
        free(tmp);
        tmp = save;
    }

    head = NULL;

    return 0;
}

10. 项目扩展

  • 设置关卡

    蛇移动速度

  • 保存每一个用户的得分信息

  • 排名榜

11. 项目总结

基础知识: C语言 数据结构中简单单向链表

大学生C/C++交流群

技术分享图片

【C语言项目】贪吃蛇游戏(下)

原文:https://www.cnblogs.com/szitcast/p/11082013.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!