博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C语言项目】贪吃蛇游戏(下)
阅读量:5153 次
发布时间:2019-06-13

本文共 6591 字,大约阅读时间需要 21 分钟。

目录

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 游戏失败界面边框设计

1697806-20190625115107709-173498928.png

游戏边框失败界面分析

1697806-20190625115114058-647156531.png

参考源代码

//游戏失败界面边框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 撞墙失败界面

显示效果如下:

1697806-20190625115127818-531358844.png

界面分析

1697806-20190625115135000-1810937239.png

参考代码:

//结束游戏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 咬到蛇身失败界面

显示效果如下:

1697806-20190625115144121-1024660707.png

在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结束游戏界面

显示效果:

1697806-20190625115153005-824388495.png

在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 界面添加选择

显示效果如下:

1697806-20190625115203907-1166283103.png

界面分析

1697806-20190625115210865-1740484554.png

代码实现

//结束游戏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++交流群

1697806-20190625115222692-522459363.png

转载于:https://www.cnblogs.com/szitcast/p/11082013.html

你可能感兴趣的文章
批处理/DOS命令删除文件夹下某类型的文件
查看>>
模板 - 数学 - 矩阵快速幂
查看>>
优秀的持久层框架Mybatis,连接数据库快人一步
查看>>
PAT L2-016 愿天下有情人都是失散多年的兄妹
查看>>
抛弃IIS,利用FastCGI让Asp.net与Nginx在一起
查看>>
C. Tanya and Toys_模拟
查看>>
使用SwingWork反而阻塞SwingUI
查看>>
Windchill中如何扩展字段长度?
查看>>
pytorch中的forward前向传播机制
查看>>
课后作业-阅读任务-阅读提问-4
查看>>
Delphi 深入浅出VCL(2)-TObject所有对象的根
查看>>
配置IIS虚拟目录遇到的5个问题
查看>>
2-03顺序表的操作
查看>>
耿丹CS16-2班第一次作业汇总
查看>>
查看mysql表大小
查看>>
命令行程序测试自动化
查看>>
My Blog
查看>>
array_reduce() 与 array_map()
查看>>
SASS实现代码的重用:混合器Mixin、继承
查看>>
《windows核心编程系列》三谈谈内核对象及句柄的本质
查看>>