117.info
人生若只如初见

C++ 贪吃蛇如何实现基本功能

下面是一个简单的C++代码示例,实现了贪吃蛇的基本功能,包括初始化游戏界面、控制蛇的移动、判定蛇是否吃到食物、游戏结束等功能。

#include 
#include 
#include 
#include 

using namespace std;

const int width = 20;
const int height = 20;
bool gameOver;
int x, y, fruitX, fruitY, score;
int tailX[100], tailY[100];
int nTail;
enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
eDirection dir;

void Setup()
{
    gameOver = false;
    dir = STOP;
    x = width / 2;
    y = height / 2;
    fruitX = rand() % width;
    fruitY = rand() % height;
    score = 0;
}

void Draw()
{
    system("cls");
    for (int i = 0; i < width + 2; i++)
        cout << "#";
    cout << endl;

    for (int i = 0; i < height; i++)
    {
        for (int j = 0; j < width; j++)
        {
            if (j == 0)
                cout << "#";
            if (i == y && j == x)
                cout << "O";
            else if (i == fruitY && j == fruitX)
                cout << "F";
            else
            {
                bool print = false;
                for (int k = 0; k < nTail; k++)
                {
                    if (tailX[k] == j && tailY[k] == i)
                    {
                        cout << "o";
                        print = true;
                    }
                }
                if (!print)
                    cout << " ";
            }

            if (j == width - 1)
                cout << "#";
        }
        cout << endl;
    }

    for (int i = 0; i < width + 2; i++)
        cout << "#";
    cout << endl;
    cout << "Score: " << score << endl;
}

void Input()
{
    if (_kbhit())
    {
        switch (_getch())
        {
        case 'a':
            dir = LEFT;
            break;
        case 'd':
            dir = RIGHT;
            break;
        case 'w':
            dir = UP;
            break;
        case 's':
            dir = DOWN;
            break;
        case 'x':
            gameOver = true;
            break;
        }
    }
}

void Logic()
{
    int prevX = tailX[0];
    int prevY = tailY[0];
    int prev2X, prev2Y;
    tailX[0] = x;
    tailY[0] = y;
    for (int i = 1; i < nTail; i++)
    {
        prev2X = tailX[i];
        prev2Y = tailY[i];
        tailX[i] = prevX;
        tailY[i] = prevY;
        prevX = prev2X;
        prevY = prev2Y;
    }

    switch (dir)
    {
    case LEFT:
        x--;
        break;
    case RIGHT:
        x++;
        break;
    case UP:
        y--;
        break;
    case DOWN:
        y++;
        break;
    }

    if (x >= width) x = 0; else if (x < 0) x = width - 1;
    if (y >= height) y = 0; else if (y < 0) y = height - 1;

    for (int i = 0; i < nTail; i++)
    {
        if (tailX[i] == x && tailY[i] == y)
            gameOver = true;
    }

    if (x == fruitX && y == fruitY)
    {
        score += 10;
        fruitX = rand() % width;
        fruitY = rand() % height;
        nTail++;
    }
}

int main()
{
    Setup();
    while (!gameOver)
    {
        Draw();
        Input();
        Logic();
        // 控制游戏速度
        for (int i = 0; i < 10000000; i++);
    }
    return 0;
}

这段代码实现了一个简单的贪吃蛇游戏,玩家可以通过键盘控制蛇的移动方向,吃到食物后蛇的长度增加,当蛇碰到自己或者墙壁时游戏结束。游戏

未经允许不得转载 » 本文链接:https://www.117.info/ask/fee0eAzsIBQFVDV0.html

推荐文章

  • C++ std::set如何与其他容器互操作

    std::set可以与其他容器互操作,例如std::vector、std::list等。可以通过使用构造函数或者insert()函数将其他容器中的元素插入到std::set中。
    以下是一些示...

  • C++ string trim技巧和窍门有哪些

    在C++中,对字符串进行trim操作可以使用以下几种技巧和窍门: 使用STL库中的std::string的成员函数erase和find_first_not_of来去除字符串首尾空格: std::string...

  • C++ string trim与传统方法的性能对比

    在C++中,通常使用两种方法来去除字符串的前导和尾随空格: 传统方法:使用循环遍历字符串,找到第一个非空格字符和最后一个非空格字符的位置,然后截取这段子字...

  • C++ string trim如何影响字符串比较

    C++中的字符串trim是指去除字符串开头和结尾的空格或其他指定的字符。当使用trim函数来处理字符串后,字符串比较的结果会受到影响。如果在比较之前对字符串进行t...

  • c++ map删除对迭代器的影响

    在C++中,使用std::map的erase()函数删除一个元素时,会使得传入的迭代器无效化。这意味着如果你尝试在删除元素后继续使用该迭代器,就会导致未定义的行为。

  • c++ map删除可以一次多个吗

    在C++中,使用std::map的erase函数可以删除一个或多个元素,但是只能传入一个迭代器或键值作为参数。如果要一次删除多个元素,可以使用循环遍历要删除的元素,然...

  • c++ map删除特定条件下的元素

    要删除满足特定条件的元素,可以使用std::map的erase函数结合std::remove_if函数来实现。以下是一个示例代码:
    #include #include #include int main() { s...

  • c++ map删除存在的问题

    在C++中,使用std::map时,如果要删除一个已经存在的键值对,可以使用erase函数来删除。然而,有一个常见的问题是在删除元素时可能会出现迭代器失效的情况。