在贪吃蛇的CPP运动中制作贪吃蛇游戏

Making Snake Game in Cpp Movement of Snake

本文关键字:游戏 CPP 运动中      更新时间:2023-10-16

我是初学者C++。 我正在用C ++简单的游戏机制作一个贪吃蛇游戏。 不使用任何图形。 我已经完成了几乎60%的工作 唯一让我感到困惑的是吃"水果"后蛇的运动。下面是我的代码,如果有人可以帮助我,它会非常有帮助,或者我希望你给我任何提示,以便我可以继续我的代码

这是我的头文件

蛇:

    #ifndef SNAKE_H
    #define SNAKE_H

    class snake
    {
        private:
            char key;
int x1, y1, x2, y2, n;
            char keyp;
        public:
            snake()
            {
                x1=28; y1=12; x2=0; y2=0; n=1;
            }
            void gotoxy(int x, int y);
            void frame();
            char movement(char keyp);
            char rmove();
            char lmove();
            char umove();
            char dmove();
            void rstar();
            void rcstar();
            void options();
    };
    #endif // SNAKE_H

这是我的蛇.cpp文件

蛇.cpp

    #include "snake.h"
    #include <iostream>
    #include <conio.h>
    #include <windows.h>
    using namespace std;
    //gotoxy function
    COORD coord={0,0};
     void snake::gotoxy(int x,int y)
     {
        coord.X=x;
        coord.Y=y;
        SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),coord);
     }
     void snake::frame()
     {
        for(int i=0;i<=78;i++)
            cout << char(45);
        for(int i=1;i<22;i++)
           {
               gotoxy(0,i);
               cout << char(124);
               gotoxy(63,i);
               cout << char(124);
               gotoxy(78,i);
               cout << char(124);
           }
           cout << endl;
        for(int i=0;i<=78;i++)
            cout << char(45);
     }
     char snake::rmove()
     {
         for(;x1<=63;x1++)
        {
            Sleep(200);
            if(x1==62)
            {
                x1=1;
                gotoxy(61,y1);
                cout << " ";
            }
            if(x1!=1)
            {
                gotoxy(x1-1,y1);
                cout << " ";
                gotoxy(x1,y1);
                cout << "*";
            }
            rcstar();
            if(kbhit())
            {
                keyp=getch();
                if(keyp=='a' || keyp=='A' || keyp=='d' || keyp=='D')
                    continue;
                else
                    break;
            }
        }
        return keyp;
     }
     char snake::lmove()
     {
         for(x1;x1>=0;x1--)
        {
            Sleep(200);
            if(x1==0)
            {
                x1=62;
                gotoxy(1,y1);
                cout << " ";
            }
            if(x1!=62)
            {
                gotoxy(x1+1,y1);
                cout << " ";
                gotoxy(x1,y1);
                cout << "*";
            }
            rcstar();
            if(kbhit())
            {
                keyp=getch();
                if(keyp=='d' || keyp=='D' || keyp=='a' || keyp=='A')
                    continue;
                else
                    break;
            }
        }
        return keyp;
     }
     char snake::umove()
     {
         for(;y1>=0;y1--)
        {
            Sleep(200);
            if(y1==0)
            {
                y1=21;
                gotoxy(x1,1);
                cout << " ";
            }
            if(y1!=21)
            {
                gotoxy(x1,y1+1);
                cout << " ";
                gotoxy(x1,y1);
                cout << "*";
            }
            rcstar();
            if(kbhit())
            {
                keyp=getch();
                if(keyp=='s' || keyp=='S' || keyp=='w' || keyp=='W')
                    continue;
                else
                    break;
            }
        }
        return keyp;
     }
    char snake::dmove()
     {
         for(;y1<=22;y1++)
        {
            Sleep(200);
            if(y1==22)
            {
                y1=1;
                gotoxy(x1,21);
                cout << " ";
            }
            if(y1!=1)
            {
                gotoxy(x1,y1-1);
                cout << " ";
                gotoxy(x1,y1);
                cout << "*";
            }
            rcstar();
            if(kbhit())
            {
                keyp=getch();
                if(keyp=='w' || keyp=='W' || keyp=='s' || keyp=='S')
                    continue;
                else
                    break;
            }
        }
        return keyp;
     }

    char snake::movement(char keyp)
    {
        switch(keyp)
        {
            case 'w':
                keyp=umove();
                break;
            case 's':
                keyp=dmove();
                break;
            case 'd':
                keyp=rmove();
                break;
            case 'a':
                keyp=lmove();
                break;
        }
        return keyp;
    }
    void snake::rcstar()
    {
        if(x1==x2 && y1==y2)
         {
             rstar();
             n++;
         }
         gotoxy(65,8);
        cout << "Score : " << n-1;
    }
    void snake::rstar()
    {
            x2 = rand()%61+1;
            y2 = rand()%21+1;
            gotoxy(x2, y2);
            cout << "*";
    }
    void snake::options()
    {
        gotoxy(64,4);
        cout << "[P] Pause";
        gotoxy(64,5);
        cout << "[K] Difficulty";
        gotoxy(64,6);
        cout << "[Q] Quit";
        gotoxy(66,9);
        cout << "High Score";
        gotoxy(70,10);
        cout << "0";
        gotoxy(66,13);
        cout << "SNAKE 2K ";
        gotoxy(65,15);
        cout << "Created By";
        gotoxy(66,17);
        cout << "Khurram";
    }

这是主要主文件.cpp文件

主.cpp

#include <iostream>
#include <conio.h>
#include <windows.h>
#include "snake.h"
using namespace std;
int main()
{
    snake a1;
    char kph;
    a1.load();
    system("cls");
    a1.frame();
    a1.gotoxy(28,12);
    cout << "*";
    a1.rstar();
    a1.options();
    kph=getch();
    do
    {
        if(kph=='w' || kph=='s' || kph=='a' || kph=='d')
            kph=a1.movement(kph);
        else if(kph=='q')
            break;
        else if(kph=='p' || kph=='P')
            kph=getch();
        else if(kph=='k' || kph=='K')
            {   kph=a1.difficulty();    }
        else
            continue;
    }
    while(kph!='q');
    a1.gotoxy(0,24);
    return 0;
}

首先,我想说我知道这段代码真的很混乱,但我是初学者,仍在学习如何制作一个好的程序。

请帮助我完成此程序。

您将需要保存蛇的每个部分的坐标(位置)。 您需要在头部前面加上一个尾段并擦除一个尾段。 您将坐标保存在容器中。

有很多容器,例如我推荐std::vector, std::list, std::stack and std::deque. std::deque。 这允许您将新的线段坐标推到后面,并从顶部弹出最旧的线段。

std::deque结构也允许增长。 您可以推送比弹出更多的项目,也可以弹出比推送更多的项目(直到容器为空)。

您也可以使用更困难的方法执行此操作并使用数组或std::vector。 您将擦除尾部(使用数组末尾的坐标),然后向下移动所有坐标(为新的头部坐标腾出空间),然后将第一个插槽设置为新坐标。

另外,请在调试器上投入一些时间。 调试程序比使用 StackOverflow 调试程序要快得多。 我们大多数人没有时间使用您的程序,使用调试器来找出问题所在。 如果问题在第一分钟对大多数人来说并不明显,那么您的问题不太可能得到回答(因此更多的反对票)。

你为什么要制作 3 个程序。这是你如何做到的。好好利用OOP人!

#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
bool gameOver;
const int width = 40;
const int height = 20;
int x, y, fruitX, fruitY, score;
int tailX[100], tailY[100];
int ntail;
enum edirecton { STOP = 0, LEFT, RIGHT, UP, DOWN };
edirecton 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;
    default:
        break;
    }
    //if (x > width || x<0 || y>height || y < 0)
        //gameOver = true;
    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();
        Sleep(80);
    }
    return 0;
}