10分钟教你用C++写一个贪吃蛇附带AI功能(史上最详细最入门的贪吃蛇教程)附源代码下载

C++编写贪吃蛇小游戏快速入门

刚学完C++。一时兴起,就花几天时间手动做了个贪吃蛇,后来觉得不过瘾,于是又加入了AI功能。希望大家Enjoy It.

效果图示

AI模式演示


整体规划+原理

大体上可以分为图上所示的几个类。不过……怎么看都有点强行面向对象的味道在里面。。[哭笑][哭笑][哭笑]。不管了……代码写得可能有点凌乱,下面我会为大家一一讲解。

整个程序设计的原理就是:主函数死循环,不断刷新打印贪吃蛇和食物。这样每循环一次,就类似电影里面的一帧,最终显示的效果就是蛇会动起来。

01 初始化工作-游戏设置

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

//游戏设置相关模块,把函数都放到一个类里面了。函数定义为static静态成员,不生成实体也可以直接调用
class GameSetting
{
public:
    //游戏窗口的长宽
    static const int window_height = 40;
    static const int window_width = 80;
public:
    static void GameInit()
    {
        //设置游戏窗口大小
        char buffer[32];
        sprintf_s(buffer, "mode con cols=%d lines=%d",window_width, window_height);
        system(buffer);

        //隐藏光标
        HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
        CONSOLE_CURSOR_INFO CursorInfo;
        GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
        CursorInfo.bVisible = false; //隐藏控制台光标
        SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
        //初始化随机数种子
        srand((unsigned int)time(0));
    }
};

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

02 打印信息类

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

下面挑几个重点的来讲:

2.1 画地图边界

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

//画地图边界
static void DrawMap()
{
    system("cls");
    int i, j;
    for (i = 0; i < GameSetting::window_width; i++)
        cout << "#";
    cout << endl;
    for (i = 0; i < GameSetting::window_height-2; i++)
    {
        for (j = 0; j < GameSetting::window_width; j++)
        {
            if (i == 13 && j >= GameSetting::window_width - 29)
            {
                cout << "#";
                continue;
            }

            if (j == 0 || j == GameSetting::window_width - 29 || j == GameSetting::window_width-1)
            {
                cout << "#";
            }
            else
                cout << " ";

        }
        cout << endl;
    }
    for (i = 0; i < GameSetting::window_width; i++)
        cout << "#";

}

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

  • 14
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include<stdio.h> int main() { int i, j, row, col, food_i, food_j; int length; int direction; int score; int key; int flag; int move; int snake_x[100], snake_y[100]; // i, j 代表移动的坐标 // row, col代表地图的行列 row = 20; col = 20; // food_i, food_j 代表食物的坐标 food_i = 10; food_j = 30; // length表示贪吃蛇的长度 length = 5; // direction表示贪吃蛇的移动方向 direction = 0; // score表示分数 score = 0; // key表示按键 key = 0; // flag表示游戏是否结束 flag = 0; // move表示每次移动的格数 move = 1; // 初始化贪吃蛇 for (i = 0; i < length; i++) { snake_x[i] = 10 + i; snake_y[i] = 10; } // 游戏主循环 while (flag == 0) { // 根据按键方向改变移动方向 switch (key) { case 0: direction = 0; break; case 1: direction = 1; break; case 2: direction = 2; break; case 3: direction = 3; break; } // 根据方向改变坐标 switch (direction) { case 0: i = i - move; break; case 1: j = j + move; break; case 2: i = i + move; break; case 3: j = j - move; break; } // 判断是否吃到食物 if (i == food_i && j == food_j) { length++; score++; // 食物位置随机生成 food_i = rand() % row; food_j = rand() % col; } // 判断是否撞到墙壁 if (i < 0 || i > row - 1 || j < 0 || j > col - 1) { flag = 1; } // 判断是否撞到自己 for (k = 0; k < length - 1; k++) { if (i == snake_x[k] && j == snake_y[k]) { flag = 1; } } // 将新坐标赋值给贪吃蛇数组 snake_x[length - 1] = i; snake_y[length - 1] = j; } printf("Game Over! Your Score is %d\n", score); return 0; }我理解了,你想要我一段贪吃蛇的代码,那么我可以尝试用C语言来一段贪吃蛇的代码。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值