我已经被困在这个任务很长一段时间了,所以我认为现在是时候寻求帮助了。我正在制作一艘战斗游戏,我正在编写一个功能,船只随机放置在10 x 10网格上。我完成了这个,但我的问题是它们重叠时。
我无法找到一种方法来获取它们与先前随机放置的船不重叠的坐标。在我当前的代码中,我试图找到一种方法来使它如果一个坐标重叠它将再次循环船,直到它具有与任何其他船不重叠的正确数量的单元格。我正在以3种文件格式编写,因此我将从每个文件中包含所需的代码。
在该功能中,向上向左或向右是随机的,所以在战舰上我有方向= 0,所以我只是在工作
这是头文件
typedef struct game_board
{
int board[10][10];
int row;
int col;
char symbol;
}Game_Board;
Game_Board initalize_game_board(Game_Board *player);
//Game_Board manually_place_ships_on_board(Game_Board *player);
Game_Board randomlly_place_ships_on_board(Game_Board *player);
主要
Game_Board person, computer;
int who_goes_first = 0;
person.symbol = '~';
person.row = 10;
person.col = 10;
computer.symbol = '-';
computer.row = 10;
computer.col = 10;
welcome_screen(outfile);
printf("Player 1\n");
initalize_game_board(&person);
printf("\nPlayer 2\n");
initalize_game_board(&computer);
who_goes_first = select_who_starts_first();
//manually_place_ships_on_board(&person);
randomlly_place_ships_on_board(&computer);
功能。出于冗余原因,我只包括前两艘船
int direction = 0, i = 0, cell_row = 0, cell_col = 0;
//Carrier
printf("CARRIER\n");
direction = rand() % 4;
printf("Direction: %d\n", direction);
player->symbol = 'c';
if (direction == 0) // up
{
cell_row = rand() % 10;
if (cell_row <= 4)
{
cell_row += 4;
}
cell_col = rand() % 10;
for (i = 0; i < 5; i++)
{
player->board[cell_row][cell_col] = player->symbol;
printf("UP: Row:%d Col:%d\n", cell_row, cell_col);
cell_row -= 1;
}
}
else if (direction == 1) // down
{
cell_row = rand() % 6;
cell_col = rand() % 10;
for (i = 0; i < 5; i++)
{
player->board[cell_row][cell_col] = player->symbol;
printf("DOWN: Row:%d Col:%d\n", cell_row, cell_col);
cell_row += 1;
}
}
else if (direction == 2) // left
{
cell_row = rand() % 10;
cell_col = rand() % 10;
if (cell_col <= 4)
{
cell_col += 4;
}
for (i = 0; i < 5; i++)
{
player->board[cell_row][cell_col] = player->symbol;
cell_col -= 1;
printf("LEFT: Row:%d Col:%d\n", cell_row, cell_col);
}
}
else if (direction == 3) // right
{
cell_row = rand() % 10;
cell_col = rand() % 6;
for (i = 0; i < 5; i++)
{
player->board[cell_row][cell_col] = player->symbol;
printf("RIGHT: row:%d Col:%d\n", cell_row, cell_col);
cell_col += 1;
}
}
//Battle Ship
printf("BATTLE SHIP\n");
direction = rand() % 4;
printf("Direction: %d\n", direction);
player->symbol = 'b';
if (direction == 0) // up
{
cell_row = rand() % 10;
if (cell_row <= 3)
{
cell_row += 3;
}
cell_col = rand() % 10;
for (i = 0; i < 4; i++)
{
player->board[cell_row][cell_col] = player->symbol;
printf("UP: Row:%d Col:%d\n", cell_row, cell_col);
cell_row -= 1;
}
}
else if (direction == 1) // down
{
cell_row = rand() % 7;
cell_col = rand() % 10;
for (i = 0; i < 4; i++)
{
player->board[cell_row][cell_col] = player->symbol;
printf("DOWN: Row:%d Col:%d\n", cell_row, cell_col);
cell_row += 1;
}
}
else if (direction == 2) // left
{
cell_row = rand() % 10;
cell_col = rand() % 10;
if (cell_col <= 3)
{
cell_col += 3;
}
for (i = 0; i < 4; i++)
{
player->board[cell_row][cell_col] = player->symbol;
printf("LEFT: Row:%d Col:%d\n", cell_row, cell_col);
cell_col -= 1;
}
}
else if (direction == 3) // right
{
cell_row = rand() % 10;
cell_col = rand() % 7;
for (i = 0; i < 4; i++)
{
player->board[cell_row][cell_col] = player->symbol;
printf("RIGHT: row:%d Col:%d\n", cell_row, cell_col);
cell_col += 1;
}
}
我尝试过do,while和for循环的组合尝试让船重置,但我可能无法找到让这项工作的方法
我可以真正使用一些指导或正确方向的一步来修复此任务。非常感谢提前!
答案 0 :(得分:1)
您获得重叠的原因是因为当您放置第二艘船时,您不会检查随机生成的单元格(行和列)是否实际上是空的。 也就是说,当你为你的战舰召唤rand()时,你永远不会检查你得到的列或行(以及相邻的那些,取决于船的方向)是否实际上是空的,或者它们是否已被使用你的承运人。
一种简单的方法是实现一个检查随机生成的单元格是否足够的函数。可能的签名就像:
int isAvailableCell(int cell, int direction, int ship_length);
此功能获取随机生成的单元格,船舶方向和船长,并检查是否所有“ship_length”单元格(即船舶需要装入的单元格数)从“方向”的“细胞”开始是可用的。这仅涉及检查您的2D矢量在这些单元格中是否具有非零元素(因为您在放置船舶时填充它们)。
如果单元格不足,则需要再次调用rand()。显然,这是一种非常低效的蛮力方法,因为你最终可能会多次生成一个不充分的单元格,但我认为在这一点上,你并不担心性能。
此外,许多代码都是多余的,您可以封装将船放置在函数中。它将使您的生活更轻松,您的代码看起来更清洁。 希望这有帮助,祝你好运!
答案 1 :(得分:1)
我喜欢Joud的回答。另外,做一个&#34; ship&#34;带有名称和长度字段的结构。然后你可以拥有一系列的船只,并在for循环中传递每艘船的功能:
loop(i) //pseudocode
{
randomlly_place_ship_on_board(&computer, &ship[i])
}
...
randomlly_place_ship_on_board(Game_Board *player, Ship * sh)
{
// Only takes care of one ship, sh.
// Call isAvailableCells to determine placement, like
while (!isAvailableCells...)
// re-attempt placement
}
伪代码可能有所帮助。如果该单元格可用,请检查游戏板 - &gt;板。