2017-04-23 6 views
-2

私たちは最近、オブジェクト指向プログラミングを学びましたが、すぐにそのプロジェクトがすでに完成していますので、OOPにはあまり慣れていません。しかし、私たちは戦艦ゲームを作成するプロジェクトを割り当てられました。戦艦がバトルボードの実装にぶつかった

私は船、広場、バトルボードのクラスを作成しました。私は3つすべてをテストしましたが、Battleboardクラスの1つのメソッドを除いて、すべてのテストも合格しました。各クラスをテストするために、私はtoStringメソッドを使用しました。コードが不完全まだあるように私が見つけた問題の

for (int i = 0; i < squares.length; i++) { 
+0

**ループ反復後に 'square 'に' new Square() 'が割り当てられていることを正しく理解していますか?最初の反復の前にはどのような価値がありますか?また、 'ship'変数には何が入っていますか? –

+0

squareとshipはprivateインスタンス= nullです。 Shipは、長さ、ヒット回数、開始行/列(左上隅)、方向を返します。スクエアはそれが船を持っているかどうか、それがヒットしたかどうかを知っています。 – Levy

+0

私は 'ship'が' null'であるとは思っていません。そうでなければ 'ship.getLength()'は例外をスローします。代わりに '' 1 ''を出力に追加します。とにかく、コードは不完全です。関連するすべてのコードを表示してください。 –

答えて

0

だけのカップルが、それ以上が存在することができます::これは私の戦いボードのtoStringメソッドである

の冒頭で

A.

public boolean addShip(int length, boolean isHorizontal, int startRow, int startCol) { 

square = new Square(); 

船が目に存在するかどうかを確認するために論理的なようだがありますあなたがそれを追加する代わりに、新しい正方形に存在するかどうかをチェックします。 Squareコードはありませんが、最初は船がないと仮定します。

B.同じ方法で次のコードがあります:

if (isHorizontal == true) { 
     ship = new Ship(length, isHorizontal, startRow, startCol); 
     for (int i = 0; i < ship.getLength(); i++) { 
      if (startCol > numberOfColumns) { 
       return false; 
      } else { 
       square.addShip(ship); 
       startCol++; 
      } 
     } 
    } 

ので、船が繰り返しボードに関連していない同じブランドの新しい広場に追加されています。後で、その四角形はどこにも追加されず、今では使用されています。

これを修正する方法がわかりませんが、おそらくこのメソッドが呼び出される前にすべての四角形が初期化されている必要があります。この方法では四角形を作成しないでください。代わりに、現在の反復に対応する四角形 `を見つける必要があります。

C.次のコード

 } else if (!square.hasBeenHit() && square.hasShip()) { 
     //Returns length of ship if there is a ship that hasn't been hit 
      if (ship.getLength() == 1) { 
       toString += "1 "; 
      } else if (ship.getLength() == 2) { 
       toString += "2 "; 
      } else if (ship.getLength() == 3) { 
       toString += "3 "; 
      } else if (ship.getLength() == 4) { 
       toString += "4 "; 
      } 
     } 

は、すべての繰り返しで同じshipを使用するので、すべての反復(1を付加)で同じように振る舞います。 現在の正方形(i、j)に属する船が存在する場合はそれを見つけ、それをとするのが正しいでしょう。

D.正方形を繰り返しているにもかかわらず、新しいループが作成されます。 square = new Square()の代わりにsquare = squares[i][j]と書く方が論理的です。

コードで何が起こっているかを確認するには、デバッガを使用することをおすすめします。

+0

私はあなたがCの意味を混同しています.forループが正方形の場所を世話しないでしょうか? また、DIで、square = square [I] [j] – Levy

+0

をCに追加すると、nullPointerExceptionが発生します。 'square = new Square();'現在の反復について何も知らない新しいオブジェクトを作成します。と 'j'。 C言語ではおそらく 'squares'配列は初期化されていません。私はあなたのボードを作成するときにボード上のすべての四角形を初期化することをお勧めします。 –

+0

すべての 'square = new Square();'を消去し、[I] [j] = new Square();を追加しました。それらを初期化するが、 "2 2 - - "とは対照的に " - - - "または "2 - - "とは対照的に、出力はまだ "1 1 1 1"である。 – Levy

関連する問題