-1

私は戦艦に取り組んでおり、2D配列を使用して、そのようにグリッド配列内に番号で船(表示)を配置しています。

/// Places the ships in a sequence on the grid
/// </summary>
/// <param name="ship"></param>
public static void PlaceShips(Ship ship)
{     
    Random rnd1 = new Random();
    Random rnd2 = new Random();

        if (ship.Orientation == "h")
        {
            //int r = rnd1.Next(_grid.GetLength(0));
            //int c = rnd2.Next(_grid.GetLength(1));

            int r = 0;
            int c = 2;
            for (int i = 0; i < ship.Values.Length; i++)
            {
                _grid[r++, c] = ship.Values[i];
            }
        }
        else if (ship.Orientation == "v")
        {
            //int r = rnd1.Next(_grid.GetLength(0));
            //int c = rnd2.Next(_grid.GetLength(1));

            int r = 3;
            int c = 4;
            for (int i = 0; i < ship.Values.Length; i++)
            {
                _grid[r, c++] = ship.Values[i];
            }
        }

ランダムな方法を使用して座標を設定したいのですが、配列の境界をチェックし、船を配列内に保持することに関しては、私の計算はオフです。誰か助けてもらえますか?とても有難い。船の長さで改造し、残りが船の長さよりも大きいかどうかを確認する必要があると思っていますが、コードに入れるのに苦労しています。

4

3 に答える 3

1

船を生成するときは、適切な値から船の長さを引く必要があります。

int c = rnd.Next(_grid.GetLength(1) - ship.Values.Length);水平用、および

int r = rnd.Next(_grid.GetLength(0) - ship.Values.Length);垂直用。

また、Randomのインスタンスを1つだけ使用する必要があります。デフォルトでは、ランダムにはシステムクロックがシードされているため、ほぼ同時に作成されたインスタンスは同じシードを取得し、同じ値のシーケンスを生成します。理想的には、ランダムの単一の静的インスタンスを作成し、それをすべての乱数生成に使用する必要があります。

于 2013-03-22T00:22:08.337 に答える
1

私が最後に戦艦ゲームをプログラムしたとき、これは私がしたことです。

1)ポイントをランダムに選択します
2)水平に配置するか垂直に配置するかを決定
します3)forループを使用して、配置時に船が占めるすべてのセクションを確認します。例えば...

invalid_placement = false;
for (int i = 0; i < ship.Values.Length, i++) {
  if (c+i < grid.boundary && _grid[r,c + i] != 0) {
     invalid_placement = true;
  }
}

これにより、船が使用するすべてのスペースが開いていることが確認されます。配置する船が他の船と交差していないことを確認する必要があります。見ている場所が範囲外になっていないかどうかを確認することも重要です。

すべてのチェックに合格すると(範囲内の&&エリアがクリアされたら)、その場所に船を配置できます。そうでない場合は、手順1から開始します。

クイック編集...
船を配置するときは、船を常に左端の位置から開始し、水平のときに右に配置し、上部から開始して垂直に配置する場合は下に配置する方が簡単です。この単純化されたロジックは、配列の境界を下回ることを心配する必要がないため、大幅に簡素化されています。

于 2013-03-22T00:24:47.093 に答える
-1

まず、次のようなことを行います。

_grid[r, c++]

++がポストインクリメントかプレインクリメントかを読者が一時停止して確認する必要があるため、これは非常に悪いスタイルです。アクセスの外部で明示的に増分を実行します。

次に、船がグリッド内にとどまるようにするには、船の始点が0より大きいこと、および終点(始点+長さ-1)が<grid.lengthであることを確認します。したがって、長さがLでグリッドの長さがGの船の場合、開始は0からG-Lの間のどこでもかまいません。

于 2013-03-22T00:23:03.200 に答える