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

00. 目录

01. 开发背景

​ 贪吃蛇起源于西方,来自于蛇骗夏娃和亚当偷吃禁果的神话。人们为了说明蛇的一个“贪”字,开发出了贪吃蛇游戏。本公开课使用C语言开发一个贪吃蛇游戏。

​ 贪吃蛇最初为人们所知的是诺基亚手机附带的一个小游戏,它伴随着诺基亚手机走向世界。现在的贪吃蛇出现了许多衍生版本,并被移植到各种平台上。

通过本公开课的学习,大家可以学到:

  • Visual Studio 2017开发环境

  • C语言中的三大结构和函数

  • C语言中动态内存申请和释放

  • C语言中文件基本操作

  • C语言中的简单单向链表

  • 控制终端基本设置和监听按键

  • C语言简单游戏开发流程

  • C语言简单游戏开发调试技巧

02. 功能介绍

​ 贪吃蛇的游戏规则也很简单,具体为:蛇出现在封闭的空间中,同时在地图上会随机出现食物,玩家通过键盘上的上下左右方向键来控制蛇的前进方向。蛇头撞到食物,则食物消失,表示被蛇吃掉了,蛇身增加一节,增加玩家的得分。接着又随机出现一个食物,等待蛇来吃。如果蛇在前进的过程中撞到墙或者咬到蛇身或者玩家按下ESC键,则游戏退出。

1697806-20190625111922051-979749031.png

项目演示
1697806-20190625112310880-1050674679.gif

03. 欢迎界面设计

欢迎界面如下
1697806-20190625111947096-311435710.png

3.1 常用终端控制函数

SetConsoleTextAttribute函数介绍

BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput,WORD wAttributes);
功能:设置控制台文本属性(颜色),可以设置前景色FOREGROUND(文本颜色)和背景色BACKGROUND

SetConsoleTextAttribute官方文档介绍

参考示例:

HANDLE hOut;

hOut = GetStdHandle(STD_OUTPUT_HANDLE);         /* 获取标注输出句柄 */
SetConsoleTextAttribute(hOut, FOREGROUND_BLUE); /* 设置控制台颜色,前景色为蓝色*/
SetConsoleTextAttribute(hOut, BACKGROUND_RED);  /* 背景色为红色 */

SetConsoleCursorPosition函数介绍

BOOL SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD  dwCursorPosition);
功能:设置控制台光标坐标

SetConsoleCursorPosition官方文档介绍

参考示例:

COORD pos = {x, y};/* x是横坐标 y是纵坐标 */
HANDLE hOut;

hOut = GetStdHandle(STD_OUTPUT_HANDLE); /* 获取标注输出句柄 */
SetConsoleCursorPosition(hOut,pos);     /* 设置控制台光标坐标(设备句柄, 光标坐标) */

3.2 设置文本颜色函数

//设置终端字体颜色
int setColor(int c)
{
    //GetStdHandle: 获取指定的标准设备的句柄
    //STD_OUTPUT_HANDLE 标准输出句柄
    //c 颜色值
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), c);

    return 0;
}

十进制颜色对照表

1697806-20190625112004290-663968600.png

3.3 设置光标位置函数

//设置光标的坐标
int gotoXY(int x, int y)
{
    COORD c;
    //设置横坐标
    c.X = x;
    //设置纵坐标
    c.Y = y;

    //设置光标的位置
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);

    return 0;
}

3.4 绘制字符画(蛇)

参考代码:

//绘制字符画 --蛇
int printSnake(void)
{
    //清屏
    system("cls");

    gotoXY(35, 1);
    setColor(6);
    printf("/^\\/^\\");      //蛇眼睛

    gotoXY(34, 2);
    printf("|__|  O|");      //蛇眼睛

    gotoXY(33, 2);
    setColor(2);
    printf("_");

    gotoXY(25, 3);
    setColor(12);
    printf("\\/");          //蛇信

    gotoXY(31, 3);
    setColor(2);
    printf("/");

    gotoXY(37, 3);
    setColor(6);
    printf(" \\_/");        //蛇眼睛

    gotoXY(41, 3);
    setColor(10);
    printf(" \\");

    gotoXY(26, 4);
    setColor(12);
    printf("\\____");       //舌头

    gotoXY(32, 4);
    printf("_________/");

    gotoXY(31, 4);
    setColor(2);
    printf("|");

    gotoXY(43, 4);
    setColor(10);
    printf("\\");

    gotoXY(32, 5);
    setColor(2);
    printf("\\_______");    //蛇嘴

    gotoXY(44, 5);
    setColor(10);
    printf("\\");

    gotoXY(39, 6);
    printf("|     |                  \\");  //下面都是画蛇身

    gotoXY(38, 7);
    printf("/      /                   \\");

    gotoXY(37, 8);
    printf("/      /                    \\ \\");

    gotoXY(35, 9);
    printf("/      /                       \\ \\");

    gotoXY(34, 10);
    printf("/     /                          \\  \\");

    gotoXY(33, 11);
    printf("/     /             _----_         \\   \\");

    gotoXY(32, 12);
    printf("/     /           _-~      ~-_         |  |");

    gotoXY(31, 13);
    printf("(      (        _-~    _--_    ~-_     _/  |");

    gotoXY(32, 14);
    printf("\\     ~-____-~    _-~    ~-_    ~-_-~    /");

    gotoXY(33, 15);
    printf("~-_           _-~          ~-_       _-~");

    gotoXY(35, 16);
    printf("~--______-~                ~-___-~");

    return 0;
}

测试代码如下:

int main()
{

    //设置控制台的宽高
    system("mode con cols=100 lines=30");

    printSnake();

    system("pause");
    return 0;
}

测试效果如下:
1697806-20190625112018395-988749434.png

3.5 欢迎界面函数

界面设计分析

1697806-20190625112050051-1461374229.png

参考代码:

//欢迎界面
int welcomGame(void)
{
    int i;
    int j;

    int n = 0;

    //绘制字符画蛇
    printSnake();

    //输出文字
    setColor(11);
    gotoXY(45, 18);
    printf("贪吃蛇游戏");

    setColor(14);

    //边框范围20--26行  27--74列
    for (i = 20; i <= 26; i++)
    {
        for (j = 27; j <= 74; j++)
        {
            gotoXY(j, i);
            if (i == 20 || i == 26)
            {
                printf("-");
            }
            else if (j == 27 || j == 74)
            {
                printf("|");
            }
        }
    }

    setColor(12);
    gotoXY(35, 22);
    printf("1. 开始游戏");

    gotoXY(55, 22);
    printf("2. 游戏说明");

    gotoXY(35, 24);
    printf("3. 退出游戏");

    gotoXY(27, 27);
    printf("请选择[1 2 3]: ");

    scanf("%d", &n);
    //清空换行符
    getchar();
    
    return n;
}

主函数参考代码如下:

int main()
{
    int choice;

    //设置控制台的宽高
    system("mode con cols=100 lines=30");

    while (1)
    {
        choice = welcomGame();

        switch (choice)
        {
            //开始游戏
        case 1:
            printf("开始游戏");
            break;

            //游戏说明
        case 2:
            printf("游戏说明");
            break;

            //退出游戏
        case 3:
            break;
        default:
            setColor(12);
            gotoXY(45, 28);
            printf("请做出有效选择[1~3]");
            //输入任意键
            getchar();
        }
    }

    system("pause");
    return 0;
}

04. 游戏帮助界面设计

游戏说明模块如下:

1697806-20190625112103117-7313479.png

游戏帮助界面参考代码

//游戏帮助界面
int aboutGame(void)
{
    int i = 0;
    int j = 0;

    //清屏
    system("cls");

    setColor(13);
    gotoXY(44, 3);
    printf("游戏说明");

    setColor(2);
    //画出边框
    //6~22行   20~75列
    for (i = 6; i <= 22; i++)
    {
        for (j = 20; j <= 75; j++)
        {
            gotoXY(j, i);
            //画上下边框
            if (i == 6 || i == 22)
            {
                printf("=");
            }
            else if (j == 20 || j == 75)
            {
                printf("||");
            }
        }
    }

    setColor(3);
    gotoXY(30, 8);
    printf("★ 1.不能撞到墙壁,不能咬到自己");

    setColor(5);
    gotoXY(30, 11);
    printf("★ 2.F1加速前进,F2减速前进");

    setColor(11);
    gotoXY(30, 14);
    printf("★ 3.使用空格暂停游戏和继续游戏");

    setColor(13);
    gotoXY(30, 17);
    printf("★ 4.使用方向键控制前进的方向");

    setColor(14);
    gotoXY(30, 20);
    printf("★ 5.按下ESC键退出游戏");

    setColor(12);
    gotoXY(22, 24);
    printf("按下回车键返回主界面...");

    getchar();

    return 0;
}

主函数代码修改如下:

int main()
{
    int choice;

    //设置控制台的宽高
    system("mode con cols=100 lines=30");

    while (1)
    {
        choice = welcomGame();

        switch (choice)
        {
            //开始游戏
        case 1:
            printf("开始游戏");
            break;

            //游戏说明
        case 2:
            aboutGame();
            break;

            //退出游戏
        case 3:
            break;
        default:
            setColor(12);
            gotoXY(45, 28);
            printf("请做出有效选择[1~3]");
            //输入任意键
            getchar();
        }
    }

    system("pause");
    return 0;
}

05. 退出游戏实现

在主菜单中, 当用户选择3的时候,直接退出游戏

在主函数case 3中添加如下代码:

//退出游戏
case 3:
    exit(0);
    break;

大学生C/C++开发交流群

1697806-20190625112116619-1911447938.png

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值