C++二维蛇形游戏如何生成随机水果

问题描述 投票:1回答:1

我在为我的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),然后我把它们追加到我的游戏板中。

但问题是。我想只做一个随机X和Y的水果 然后把它追加到我的游戏板上显示出来。但我现在的代码是这样的。

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

这段代码产生了两个水果,其中一个是随机X,一个是随机Y 我想把这两个水果变成一个水果,一个随机X,一个随机Y。

c++ 2d-games
1个回答
0
投票

有一大堆事情值得评论。 下面是这样的。

  1. bGameW没有 \n
  2. bGameW 和 bGameL 分别为 10 和 11 个字符(添加其他字符后均为 11 个)。\n). 你的RNG正在生成0到20之间的数字......如果你曾经生成过一个数字> 11(你会的)。坏事 会发生(而且可能已经发生了)。
  3. 蛇类游戏会让你吃到多个果实,这也是为什么人们提出 "不要多次调用srand "的原因,因为每次有人吃到旧果实时,你都会调用生成果实。OTOH,这主要是把 "每秒调用srand多次可以返回相同的值 "这个问题也去掉了。
  4. 与其写出bGameW和bGameL这两行字,我建议你建立一个字符数组,这个数组可以容纳你整个游戏的显示(不是你的游戏状态,只是该状态的显示)。 然后你每次移动都要清除它并重新绘制它。 你需要一个游戏区域,墙壁,一些可以追踪你的蛇在哪里的东西,以及当前的水果。 然后你把这些东西都 "渲染 "到你的角色-阵列-游戏-显示中。 每次重画的时候别忘了清除它,否则你会遇到各种问题。
  5. 与其重绘所有东西,你可以使用类似 "诅咒 "库的东西来清除和重绘屏幕上的特定角色位置。你就会面临 "清除 "和重画不同位置的问题。

至于编程风格,你会发现所谓的 "魔法数字"(比如你的案例中的21)会导致bug。 人们通常做的是定义一个 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;
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.