互いに衝突しないように、グリッド内に数字を配置する必要があります。この数字の配置はランダムにする必要があり、水平または垂直にすることができます。番号は基本的に船の位置を示します。したがって、船のポイントは一緒にある必要があり、ランダムである必要があり、衝突するべきではありません。
私はそれを試しました:
int main()
{
srand(time(NULL));
int Grid[64];
int battleShips;
bool battleShipFilled;
for(int i = 0; i < 64; i++)
Grid[i]=0;
for(int i = 1; i <= 5; i++)
{
battleShips = 1;
while(battleShips != 5)
{
int horizontal = rand()%2;
if(horizontal == 0)
{
battleShipFilled = false;
while(!battleShipFilled)
{
int row = rand()%8;
int column = rand()%8;
while(Grid[(row)*8+(column)] == 1)
{
row = rand()%8;
column = rand()%8;
}
int j = 0;
if(i == 1) j= (i+1);
else j= i;
for(int k = -j/2; k <= j/2; k++)
{
int numberOfCorrectLocation = 0;
while(numberOfCorrectLocation != j)
{
if(row+k> 0 && row+k<8)
{
if(Grid[(row+k)*8+(column)] == 1) break;
numberOfCorrectLocation++;
}
}
if(numberOfCorrectLocation !=i) break;
}
for(int k = -j/2; k <= j/2; k++)
Grid[(row+k)*8+(column)] = 1;
battleShipFilled = true;
}
battleShips++;
}
else
{
battleShipFilled = false;
while(!battleShipFilled)
{
int row = rand()%8;
int column = rand()%8;
while(Grid[(row)*8+(column)] == 1)
{
row = rand()%8;
column = rand()%8;
}
int j = 0;
if(i == 1) j= (i+1);
else j= i;
for(int k = -j/2; k <= j/2; k++)
{
int numberOfCorrectLocation = 0;
while(numberOfCorrectLocation != i)
{
if(row+k> 0 && row+k<8)
{
if(Grid[(row)*8+(column+k)] == 1) break;
numberOfCorrectLocation++;
}
}
if(numberOfCorrectLocation !=i) break;
}
for(int k = -j/2; k <= j/2; k++)
Grid[(row)*8+(column+k)] = 1;
battleShipFilled = true;
}
battleShips++;
}
}
}
}
しかし、私が書いたコードは、8x8 グリッドでランダムに数字を生成することができません。
これを解決する方法についてのガイダンスが必要です。何か良い方法があれば教えて...
どのように見えるか:
私のコードが行っていること: 基本的に、グリッド上にそれぞれ異なるサイズの 5 つの船を配置しています。それぞれ、横置きにするか縦置きにするかをランダムにチェックします。その後、周囲が埋まっているかどうかを確認します。そうでない場合は、そこに配置します。または、プロセスを繰り返します。
重要なポイント: while、for ループだけを使用する必要があります。