我正在用C ++创建一个战舰游戏,但在弄清楚如何将1x3船只随机水平放置在我的板上时遇到了麻烦。我拿了一块10x10的木板,上面装满了“ O”(代表“海洋”),我试图弄清楚如何随机放置一个甚至只有1x1的“ 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木板的文件。我特别在寻找如何在板上随机放置1个字母“ S”的方法,这样我便可以自己弄清楚如何将“ S S S”水平放置在阵列中的某个位置。
请记住,我正在学习C ++的大学课程,所以我在这方面还很新,所以不要讨厌。
答案 0 :(得分:0)
由于矩阵为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 LCG非常快,但可以预测。对于游戏,您可能需要研究mt19937
之类的PRNG(速度较慢,但可预测性较差),或者是真正的RNG,random_device
(速度最慢)。
另请参阅this explanation,为什么将srand
/ rand()
视为有害。