C编程 - 战舰计划 - 如何防止船只重叠?

时间:2014-11-23 05:50:59

标签: c overlap

我创建了一个程序,我可以随机定位两艘船,在2D阵列的边界内随机定位(水平或垂直)。

我面临的唯一问题是试图防止船只重叠。

以下是我的代码中的代码段:

for ( row = 0; row < SIZE; row++ )
{
    printf( "%c | ", a++ );

    for ( column = 0; column < SIZE; column++ )
    {
        board[row][column] = ' ';

        for ( i = 0; i < 4; i++ )
        {
            if ( battleship[i].column == column )
            {
                if ( battleship[i].row == row )
                {
                    board[row][column] = 'B';
                }
            }
        }

        for ( i = 0; i < 5; i++ )
        {
            if ( carrier[i].column == column )
            {
                if ( carrier[i].row == row )
                {
                    board[row][column] = 'A';
                }
            }
        }

        printf( "%c ", board[row][column] );
    }

    printf( "|\n" );
}

如何检查船舶是否已经存在,如果有,请从头开始重新启动循环,清除现有值?

3 个答案:

答案 0 :(得分:1)

您通过遍历棋盘上的每个点然后检查棋盘上的那个点是否与战舰或航母的4点或5点相对应来降低您的代码效率。

为什么不用空格字符' '填充电路板。然后循环你的战舰和航母对象并检查战舰或航母所占据的棋盘上的点是否都是空的' '。如果他们要占用的是空格' ',那么它就会与任何内容发生碰撞,您可以相应地将棋盘点更改为'A''B'。如果碰撞,你可以随机生成船只位置并再次检查。

答案 1 :(得分:0)

最简单的解决方案是创建一个检查当前位置以查看它是否为空的函数?或许bool isEmpty()你在哪里检查董事会以确定你输入的空间是否实际上是空的,或者是否有一个人物居住在那里?复杂性是检查董事会,而不是船长长度&#39;相互对抗。

编辑:这与David Pisani完全相同。

答案 2 :(得分:0)

如果你有像

这样的不同例程会更好
clear_board
place_ships
init_ships

clear_board只会将所有单元格设置为空格

place_ships将通过战舰阵列并放置Bs。然后它将通过载波阵列并放置As。

您的问题是关于init_ships。它类似于卡洗牌算法。假设你的网格永远不会超过64Kx64K。

int possible[SIZ * SIZ], ix, ship, empty;
for (ix = 0; ix < SIZ * SIZ; ++ix)
    possible[ix] = ix;

// Allocate the battleships
empty = SIZ * SIZ;
for (ship = 0; ship < MAXBATTLESHIPS; ++ship)
{
    ix = rand() % empty;   // Not the best way - this is just an example
    battleship[ship].column = possible[ix] % SIZ;
    battleship[ship].rw = possible[ix] / SIZ;
    if (ix != empty - 1)
    {
        possible[ix] = possible[empty - 1];
    }
    --empty;
}

为承运人做同样的事情