Поместить букву случайным образом в массив в C ++ - PullRequest
0 голосов
/ 21 февраля 2019

Я создаю игру на линейном корабле в C ++, и мне трудно понять, как случайным образом разместить корабли 1x3 горизонтально на моей доске.Я взял доску 10х10, заполненную буквой «О» (для «океана»), и пытаюсь просто выяснить, как случайным образом разместить даже 1х1 «S» (для корабля).

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    const int rows=10;
    const int cols=10;
    srand(time(NULL));

    char board[100];

    ifstream fin;
    fin.open("board.txt");
    for (int i=0; i<rows*cols; i++) fin >> board[i];
    fin.close();

    for (int r=0;r<rows;r++) {
        for (int c=0;c<cols;c++) {
            cout << board[r*rows+c] << " ";
       }
       cout << endl;
     }
}

Мой"board.txt" - это файл, содержащий доску 10x10.Я специально искал, как разместить на доске случайным образом только одну букву 'S', чтобы потом я сам мог понять, как разместить 'SSS' где-нибудь в массиве горизонтально.

Пожалуйста, имейте в виду, яЯ учусь в колледже на C ++, так что я все еще новичок в этом, так что без ненависти.

1 Ответ

0 голосов
/ 21 февраля 2019

Поскольку ваша матрица имеет размер 10 x 10, чтобы разместить S где-то, вам просто нужно сгенерировать случайное число от 0 до 99 и использовать его в качестве индекса.

Вы можете использовать uniform_int_distribution и, например, LCG 1 minstd_rand для этого:

#include <iostream>
#include <fstream>
#include <random>
using namespace std;

int main() {
    const int rows = 10;
    const int cols = 10;
    uniform_int_distribution<int> dist(0, rows * cols - 1);
    random_device rnd_seed;
    minstd_rand rnd_gen { rnd_seed() };

    char board[100]{};

    ifstream fin;
    fin.open("board.txt");
    for (int i = 0; i < rows*cols; i++) fin >> board[i];
    fin.close();

    board[dist(rnd_gen)] = 'S'; // place S at a random location

    for (int r = 0; r < rows; r++) {
        for (int c = 0; c < cols; c++) {
            cout << board[r*rows + c] << " ";
        }
        cout << endl;
    }
}

1 An LCG очень быстрый, но может быть предсказуемым.Для игры вы можете захотеть посмотреть на PRNG как mt19937 (медленнее, но менее предсказуемо) или на истинный RNG, random_device (медленнее).

Также см. это объяснение того, почему srand / rand() считается вредным.

...