Как создать случайный фрукт для игры C ++ 2D Snake - PullRequest
1 голос
/ 04 мая 2020

У меня проблемы с генерацией случайных фруктов для моей игры 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");

Этот код делает 2 фрукта с 1 при случайном X и 1 при случайном Y. Я хочу превратить эти 2 фрукта в 1 фрукт с 1 случайным X и 1 случайный Y.

1 Ответ

0 голосов
/ 04 мая 2020

Есть целый ряд вещей, которые стоит комментировать. Вот так:

  1. bGameW не имеет \n
  2. bGameW и bGameL имеют длину 10 и 11 символов (оба будут с 11 после добавления другого \n). Ваш ГСЧ генерирует числа от 0 до 20 ... если вы когда-нибудь сгенерируете число> 11 (и вы это сделаете), произойдет (и, вероятно, произойдет) Плохое .
  3. Подобные змеиные игры позволяют вам есть несколько фруктов, поэтому люди поднимали целую вещь «не звони и не раз», так как ты будешь призывать приносить фрукты каждый раз, когда кто-нибудь ест старый. OTOH, который в основном устраняет проблему «вызов srand несколько раз в секунду, может также возвращать одно и то же значение».
  4. Вместо того, чтобы записывать эти две строки, bGameW и bGameL, я рекомендую вам создать массив символов, содержащий весь ваш игровой дисплей (НЕ ваше игровое состояние, просто отображение этого состояния). Вы тогда очищаете это и перерисовываете это каждое движение. Вам понадобится игровая зона, стены, что-то, что отслеживает, где находится ваша змея, и текущий фрукт. Затем вы «визуализируете» все эти вещи на свой дисплей персонажа-массива-игры. Не забывайте очищать его каждый раз, когда вы перерисовываете его, иначе у вас возникнут всевозможные проблемы.
  5. Вместо того, чтобы перерисовывать все, вы можете использовать что-то вроде библиотеки "curses" для очистки и перерисовки, задав c расположение персонажей на экране. Тогда вы столкнетесь с проблемами «очистки» и перерисовки различных точек.

Что касается стиля программирования, вы обнаружите, что так называемые «маги c числа» (например, 21 в вашем случае) может привести к ошибкам. Вместо этого люди обычно определяют 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;
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...