2015-01-12 34 views
-4

我是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; 
} 

首先我想说的是,我知道这个代码是真的搞砸了,但我初学者和仍然在学习如何制作一个好的节目。

请帮我完成这个程序。

+0

你能更具体一些,你卡在哪里? – Tanay

+1

TL; DR!什么*确切*是你的问题?请解释它,然后将代码缩小到出现问题的部分。 –

+0

代码太多了。请缩小范围。 – Borgleader

回答

1

您将需要保存蛇每段的坐标(位置)。您需要预先安排头部并擦除尾部。您将保存在容器中的坐标。

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

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

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

此外,请花一些时间与您的调试器。调试你的程序比使用StackOverflow调试它要快得多。我们中的大多数人没有时间拿你的程序,使用调试器来找出问题所在。如果这个问题在第一分钟内对大多数人来说并不明显,那么你的问题就不太可能得到回答(因此更多的低估)。

+0

你能解释一下我怎么用这个例子。 我会非常感谢你 –