【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)(中)

简介: 【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)

01 初始化工作-游戏设置

游戏设置和相关初始化放在了一个类里面,并进行了静态声明。主要设置了游戏窗口的长和款。并在GameInit()函数里面设置了窗口大小,隐藏光标,初始化随机数种子等。代码如下:

1//游戏设置相关模块,把函数都放到一个类里面了。函数定义为static静态成员,不生成实体也可以直接调用
 2class GameSetting
 3{
 4public:
 5    //游戏窗口的长宽
 6    static const int window_height = 40;
 7    static const int window_width = 80;
 8public:
 9    static void GameInit()
10    {
11        //设置游戏窗口大小
12        char buffer[32];
13        sprintf_s(buffer, "mode con cols=%d lines=%d",window_width, window_height);
14        system(buffer);
15
16        //隐藏光标
17        HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
18        CONSOLE_CURSOR_INFO CursorInfo;
19        GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
20        CursorInfo.bVisible = false; //隐藏控制台光标
21        SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
22        //初始化随机数种子
23        srand((unsigned int)time(0));
24    }
25};

用到了几个相关的Windows API,本文不做过多介绍,大家百度即可。

02 打印信息类

该类主要是用来打印一些游戏相关信息的。该类大体如下:

微信图片_20220421150403.jpg

下面挑几个重点的来讲:

2.1 画地图边界

这个函数主要是根据上面所给的游戏窗口长宽来打印地图边界的。其中还划分了几个区域,主要用来放不同的信息的。

1//画地图边界
 2static void DrawMap()
 3{
 4    system("cls");
 5    int i, j;
 6    for (i = 0; i < GameSetting::window_width; i++)
 7        cout << "#";
 8    cout << endl;
 9    for (i = 0; i < GameSetting::window_height-2; i++)
10    {
11        for (j = 0; j < GameSetting::window_width; j++)
12        {
13            if (i == 13 && j >= GameSetting::window_width - 29)
14            {
15                cout << "#";
16                continue;
17            }
18
19            if (j == 0 || j == GameSetting::window_width - 29 || j == GameSetting::window_width-1)
20            {
21                cout << "#";
22            }
23            else
24                cout << " ";
25
26        }
27        cout << endl;
28    }
29    for (i = 0; i < GameSetting::window_width; i++)
30        cout << "#";
31
32}

划分区域如下图,#就是边框了:

微信图片_20220421150405.jpg

2.2 画出分数和模式

该函数主要是在右上角画出成绩和游戏模式的,在绘制之前会进行刷新处理。先清除,再重新打印。用到了一个gotoxy()函数。这个函数主要是移动光标到(x, y)坐标处的。关于(x, y)的位置,根据实际情况调整即可。

1//画分数
 2static void DrawScore(int score)
 3{
 4    gotoxy(GameSetting::window_width - 22+14, 6);
 5    cout << "  ";
 6    gotoxy(GameSetting::window_width - 22+14, 4);
 7    cout << "  ";
 8
 9    gotoxy(GameSetting::window_width - 22, 6);
10    cout << "当前玩家分数: " << score << endl;
11    gotoxy(GameSetting::window_width - 22, 4);
12    cout << "当前游戏速度: " << 10 - speed / 25 << endl;
13
14}

03 食物类

食物类定义了食物的坐标,随机生成规则,和画出食物等一系列操作。其中食物坐标我们用了一个结构体:

1typedef struct
2{
3    int x;
4    int y;
5}COORDINATE;

该结构体两个成员,分别保存坐标的(x, y)。蛇身的坐标也会用到这个结构体。
有关食物类的大体如下:

微信图片_20220421150408.jpg

下面我们还是挑几个重点来讲。

3.1 随机生成食物

随机生成食物,原则上不允许食物出现在蛇身的位置上,如果有。我们重新生成。注意地图的范围,就是区域左边一块。实际情况根据自身的地图范围来调整食物坐标的范围,注意不要越界。用rand()函数获得随机坐标。代码如下:

1void RandomXY(vector<COORDINATE> & coord)
 2{
 3    m_coordinate.x = rand() % (GameSetting::window_width - 30) + 1;
 4    m_coordinate.y = rand() % (GameSetting::window_height - 2) + 1;
 5    unsigned int i;
 6    //原则上不允许食物出现在蛇的位置上,如果有,重新生成
 7    for (i = 0; i < coord.size(); i++)
 8    {
 9        //食物出现在蛇身的位置上。重新生成
10        if (coord[i].x == m_coordinate.x && coord[i].y == m_coordinate.y)
11        {
12            m_coordinate.x = rand() % (GameSetting::window_width - 30) + 1;
13            m_coordinate.y = rand() % (GameSetting::window_height - 2) + 1;
14            i = 0;
15        }
16    }
17}

然后,在构造函数里面传入蛇身的坐标。即可生成食物。

3.2 画出食物

画出食物比较简单了,gotoxy到随机生成的坐标之后,cout就行。我们在这还设置了一个食物颜色为红色。代码如下:

1void DrawFood()
2{
3    setColor(12, 0);
4    gotoxy(m_coordinate.x, m_coordinate.y);
5    cout << "@";
6    setColor(7, 0);
7}
相关文章
|
28天前
|
编译器 开发工具 C++
Dev-C++详细安装教程及中文设置(附带安装包链接)
Dev-C++详细安装教程及中文设置(附带安装包链接)
64 0
|
2月前
|
人工智能 搜索推荐
阿里语音AI提供了个性化人声定制功能
【2月更文挑战第24天】阿里语音AI提供了个性化人声定制功能
132 2
|
2月前
|
存储 人工智能 C++
C++ 实现对战AI五子棋
C++ 实现对战AI五子棋
35 1
|
4月前
|
人工智能 异构计算
基于PAI-DSW使用SD WebUI实现AI扩图功能
在本教程中,您将学习如何在阿里云交互式建模(PAI-DSW)中,使用Stable-Diffusion-WebUI实现AI扩图功能。
基于PAI-DSW使用SD WebUI实现AI扩图功能
|
3月前
|
人工智能 编解码 数据可视化
AI Earth ——开发者模式案例1:按区域进行Sentinel2L2A检索与下载
AI Earth ——开发者模式案例1:按区域进行Sentinel2L2A检索与下载
32 0
|
15天前
|
数据采集 存储 人工智能
【AI大模型应用开发】【LangChain系列】实战案例2:通过URL加载网页内容 - LangChain对爬虫功能的封装
【AI大模型应用开发】【LangChain系列】实战案例2:通过URL加载网页内容 - LangChain对爬虫功能的封装
29 0
|
15天前
|
人工智能 监控 数据可视化
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】0. 一文全览Tracing功能,让你的程序运行过程一目了然
【AI大模型应用开发】【LangSmith: 生产级AI应用维护平台】0. 一文全览Tracing功能,让你的程序运行过程一目了然
82 0
|
2月前
|
人工智能 编解码 数据安全/隐私保护
才发现百度自带的AI图片助手这么好用,去水印、画质优化、AI扩图、涂抹消除等功能一应俱全!
才发现百度自带的AI图片助手这么好用,去水印、画质优化、AI扩图、涂抹消除等功能一应俱全!
228 0
|
2月前
|
存储 人工智能 C++
C++ 实现对战AI五子棋
C++ 实现对战AI五子棋
107 0
|
2月前
|
机器学习/深度学习 人工智能 算法
在Python中使用deepfakes实现AI换脸功能
在Python中使用deepfakes实现AI换脸功能
28 0