簡體   English   中英

如何為 C++ 2D Snake 游戲生成隨機水果

[英]How to generate random fruit for C++ 2D Snake game

我無法為我的 Snake 游戲生成隨機水果。 (我對編程很陌生,這是我的第一語言)。

當我運行我的代碼時,到目前為止一切正常(除了一些小問題)。 我在一個空項目中使用 Visual Studio C++。 這是我的完整代碼(我沒有顯示我的#includes ):

using namespace std;
bool gameOver = false;
int gameScore;
int fruitX;
int fruitY;

string bGameW = "###########";
string bGameL = "#         #\n";

class gameStart
{
public:
void start() 
{   

    cout << bGameW;
    cout << bGameL;
    cout << bGameL;
    cout << bGameL;
    cout << bGameL;
    cout << bGameL;
    cout << bGameL;
    cout << bGameL;
    cout << bGameL;
    cout << bGameW; 

}

void generateFruit() 
{
    srand(time(NULL));
    fruitX = rand() % 21;
    fruitY = rand() % 21;

    bGameW.insert(fruitX, "F");
    bGameL.insert(fruitY, "F");

}

void clearscreen() 
{
    system("cls");
}
private:
};


 int main () 
 {  
 gameStart gameObj;

 gameObj.generateFruit();
 gameObj.clearscreen();
 gameObj.start();

 return 0;
 }

為字符串生成隨機的隨機水果。 我使用字符串制作游戲板,然后為水果(X 和 Y)創建隨機值,然后將 append 放入我的游戲板。

但問題是:我只想用隨機的 X 和 Y 和 append 制作一個水果到我的游戲板中顯示它。 但我目前的代碼是這樣的:

bGameW.insert(fruitX, "F");
bGameL.insert(fruitY, "F");

此代碼生成 2 個水果,其中 1 個隨機 X 和 1 個隨機 Y。我想將這 2 個水果變成 1 個水果,1 個隨機 X 和 1 個隨機 Y。

有很多值得評論的事情。 開始:

  1. bGameW 沒有\n
  2. bGameW 和 bGameL 的長度分別為 10 和 11 個字符(在添加另一個\n后兩者都是 11)。 您的 RNG 正在生成 0 到 20 之間的數字……如果您曾經生成大於 11 的數字(並且您會),壞事將會發生(並且可能已經發生)。
  3. 像這樣的貪吃蛇游戲可以讓你吃多個水果,這就是為什么人們提出了“不要多次調用 srand”這件事,因為每次有人吃舊水果時你都會調用生成水果。 OTOH,這也主要消除了“每秒多次調用 srand 可以返回相同的值”的問題。
  4. 與其寫出這兩行 bGameW 和 bGameL,我建議您構建一個包含整個游戲顯示的字符數組(不是您的游戲 state,只是該狀態的顯示)。 然后你清除它並重新繪制每一步。 你需要一個游戲區、牆壁、追蹤你的蛇在哪里的東西,以及當前的水果。 然后,您將所有這些東西“渲染”到您的角色陣列游戲顯示中。 每次重畫時不要忘記清除它,否則會遇到各種問題。
  5. 您可以使用諸如“curses”庫之類的東西來清除和重繪屏幕上的特定角色位置,而不是重繪所有內容。 然后,您將面臨“清除”和重新繪制不同點的問題。

就編程風格而言,您會發現所謂的“幻數”(如您的案例中的 21)會導致錯誤。 人們通常做的是定義一個具有適當值的const ,然后根據該 const 定義事物。

// constants are often named in ALL_UPPER_CASE_WITH_UNDERSCORES
// to help you recognize them.
const int PLAY_AREA_HEIGHT = 10;
const int PLAY_AREA_WIDTH = 10;
const char EMPTY_PLAY_SQUARE = '.';
// have you learned about 2d arrays yet?  Arrays at all?  
char playAreaDisplay[PLAY_AREA_HEIGHT][PLAY_AREA_WIDTH];

void wipePlayArea()
{
  for (int heightIdx = 0; heightIdx < PLAY_AREA_HEIGHT; ++heightIdx)
  {
    for (int widthIdx = 0; widthIdx < PLAY_AREA_WIDTH; ++widthIdx)
    {
      playAreaDisplay[heightIdx][widthIdx] = EMPTY_PLAY_SQUARE;
    }
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM