-1

私はJavaで小さな船の戦いのゲームを書こうとしています。

100%アカデミックで、再帰を練習するようにしたので、ほとんどの場合、より単純で効率的であっても、反復の代わりに使用したいと思います。

ビジネスに取り掛かりましょう。ルールは次のとおりです。

  • 船の幅は1、2​​、または3セルで、水平方向にのみ配置されます。
  • 水は0で表され、ヒットしていない船のセルは1、ヒットした船のセルは2、沈没した船のセルはすべて3になります。

これらのルールを設定して、テストに次の配列を使用しています。

int[][] board = new int[][]
{
    {0, 1, 2, 0, 1, 0},
    {0, 0, 1, 1, 1, 0},
    {0, 3, 0, 0, 0, 0},
    {0, 0, 2, 1, 2, 0},
    {0, 0, 0, 1, 1, 1},
};

これまでのところかなりうまく機能しています。よりユーザーフレンドリーにするために、いくつかのレポートを追加したいと思います。これらは私がそれらに必要な方法です:

  1. 行列が与えられたら、その中の船の数を返します。
  2. a)と同じですが、状態(ヒットしていない船、ヒットした船、沈んだ船の数)ごとに分けています。

私はそれらの報告書を手に入れる必要があります、そして私はいくつかのアイデアを得たいと思います。

再帰を使用して実行する必要があることを忘れないでください。これを理解したいのですが、唯一の方法は練習です。

あなたの時間と忍耐に感謝します:)。

4

2 に答える 2

0

船を。で区切る必要があることを指定しない限り、それは不可能です0。それ以外の場合は、1,1長さ2の船、または長さ1の2隻の船である可能性があります。

その制約を考えると、両方のレポートは、マップを船のリストに変換する単一のプロセスとして実行できます/実行する必要があります。

再帰ラッパーを書き出す気はあまりないので(再帰関数を使用して配列を「反復」する方法を知っていると思います)、その部分はスキップします。

  1. 船は列にまたがることができないため、列をループします。これらは独立して扱うことができます。
  2. 各州クラスの船のデータは(船なし、船、沈没船なし)にあり、機能を持っています
  3. この関数は、次の要素かどうかをチェックします
    1. 存在しません
    2. 現在のものと同じです(さまざまな機能によってハードコーディングできます)
    3. 現在のものとは異なります(右に移動します)。
  4. 配列をトラバースすると、船のリストが作成されます。
  5. これで、船の長さを数えたり、より複雑なレポートを作成したりできる船のリストができました。

ハードコーディングされていない単一の関数を使用する方が良い場合とそうでない場合がありますが、それは少し難しいように思われます。オプションが3つしかないため、ハードコーディングはコードのオーバーヘッドがそれほど大きくありません(3つすべてがある程度機能するため)別の方法で)。

または、完全に別の方法を使用することもできます。この方法では、船の「立ち上がりエッジ」をカウントしてマップ全体を反復処理します。これははるかに軽量なソリューションですが、結果のデータで実行できることについて、これほどの柔軟性はありません。

...軽量とは、「正規表現を使用して実行できる」という意味です。

于 2012-06-04T16:37:07.750 に答える
0

まあ、これはここの人々が実際に見えるようにするよりもかなり単純に見えます。

ここで再帰を使用できることを確認する方法は、マトリックス全体の船の数を、最初の行の船の数に残りのマトリックスの船の数を加えたものとして考えることです。

これを解決できれば、準備はできています。

どのように?

基本ケースについて考えてみてください。再帰呼び出しを停止する条件は何ですか。

連続して船を数える方法を解きます。

それができたら、行の船の数とマトリックスの残りの船の数を返します。

あなたのメソッドのシグネチャは次のようになっていると思います...

ShipCount(int[][] matrix, int numberOfRows, int numberOfCellsPerRow)

カウンター変数が「カウント」と呼ばれているとします。次のようなものになります。

//Signature
{
    int count = 0;
    if(/*Base condition*/){
    }else{
        /*Count the ships, work with the "count" variable.*/
    }
    return count + ShipCount(matrix[][], numberOfRows - 1, numberOfCellsPerRow) /*"numberOfRows - 1" takes you to the next row.*/
}

#2で頑張ってください:)

于 2012-06-04T18:26:20.287 に答える