2015-01-12 33 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

你能解釋一下我怎麼用這個例子。 我會非常感謝你 –