在Cpp蛇运动中制作蛇游戏

时间:2015-01-12 16:11:00

标签: c++

我是C ++的初学者。我正在基于c ++的简单游戏控制台制作蛇游戏。不使用任何图形。我做了近60%的工作,唯一让我困惑的是吃完蛇后的运动"水果"。以下是我的代码,如果有人可以帮助我,请它非常有帮助,或者我希望你给我任何提示,以便我可以继续我的代码

这是我的头文件

snake.h:

    #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

这是我的snake.cpp文件

Snake.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";
    }

这是主要的main.cpp文件

的main.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;
}

首先,我想说我知道这段代码真的搞砸了,但我是初学者,还在学习如何制定一个好的程序。

请帮我完成这个程序。

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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