2017-05-02 13 views
-3

私のジャワの戦艦プログラムで、ユーザが入力した座標を印刷していないという問題があります。ユーザーがボード上のある場所を推測すると、ヒットした場合はスペースを "X"で更新するはずです。そうでなければボードは同じままです。しかし、ユーザーが私のプログラムで間違っていると推測すると、ユーザーが推測した場所以外のすべてが表示されます。私はボードが更新されている私のelseステートメントは問題だと信じていますが、ボードを変更しても何も印刷されませんでした。ジャバの戦艦プログラムが正しく印刷されていない

import java.util.Random; 
import java.util.Scanner; 



class Battleship { 
    public static char randChar(){ 
     final String alphabet = "ABCDE"; 
     final int N = alphabet.length(); 
     char rand; 
     Random r = new Random(); 
     rand = alphabet.charAt(r.nextInt(N)); 
     return rand; 
    } 

    public static void main (String[] args) throws java.lang.Exception { 
     char[] letters = {' ', 'A', 'B', 'C', 'D', 'E'}; 
     int[] numbers ={1, 2, 3, 4, 5}; 
     int[][] ships = new int[7][2]; 
     char colGuess; 
     int rowGuess; 
     Boolean boardFlag=false; 
     Scanner scan = new Scanner(System.in); 
     //creates the board 
     for (int i = 0 ; i <= 5 ; i++) { 
      for (int j = 0 ; j <= 5 ; j++) { 
       if (i == 0) {       
        System.out.print(letters[j] + " "); 
       } 
       else if (j == 0) { 
        System.out.print(numbers[i - 1]); 
       } 
       else { 
        System.out.print(letters[j] + "" + numbers[i-1]); 
       }   
       System.out.print(" "); 
      } 
     System.out.println(); 
     } 
     //assigns ships to random spots 
     assignShips(ships); 
     System.out.println("Enter your guess for the column:"); 
     colGuess = scan.next().charAt(0); 
     //converts to uppercase 
     colGuess = Character.toUpperCase(colGuess); 
     System.out.println("Enter your guess for the row:"); 
     rowGuess = scan.nextInt(); 
     //shows player what they entered 
     System.out.println("you entered: " + (char) colGuess + rowGuess); 
     //calls method to check for a hit 
     fire(colGuess, rowGuess, ships); 
     boardFlag = fire(colGuess, rowGuess, ships); 
     System.out.println(boardFlag); 
     //updates the board 
     for (int i = 0 ; i <= 5 ; i++) { 
      for (int j = 0 ; j <= 5 ; j++) { 
       if (i == 0) { 
        System.out.print(letters[j] + " "); 
       } 
       else if (j == 0) { 
        System.out.print(numbers[i - 1]); 
       } 
       else { 
        if(letters[j] == colGuess && numbers[i - 1] == rowGuess) { 
         if(boardFlag==true) { 
          System.out.print(" " + "X"); 
         } 
        } 
        else { 
         System.out.print(letters[j] + "" + numbers[i - 1]); 
        } 
       }   
       System.out.print(" "); 
      } 
      System.out.println(); 
     } 
    } 

    public static void assignShips(int[][] ships) { 
     Random random = new Random(); 
     for(int ship = 0; ship < 7; ship++) { 
      ships[ship][0] = randChar(); 
      ships[ship][1] = random.nextInt(5); 
      //gives location of ships, for testing purposes 
      System.out.print("Ship:" + (ship+1)+ " is located at"+(char)ships[ship][0]+ships[ship][1]+"\n"); 
     } 
    } 

    //checks user input to see if we have a hit 
    public static Boolean fire(char colGuess, int rowGuess, int[][] ships) { 
     Boolean hitFlag=false; 
     for(int ship = 0; ship < ships.length; ship++){ 
      if(colGuess ==ships[ship][0] && rowGuess == ships[ship][1]){ 
       hitFlag=true; 
      } 
     } 
     if(hitFlag == true) { 
      System.out.println("we hit em at "+(char)colGuess+rowGuess+" chief!"); 
     } 
     else { 
      System.out.println("sorry chief we missed em"); 
     } 
     return hitFlag; 
    } 
} 
+4

適切な書式設定のビットは長い道のりです。 – domsson

+1

あなたのソースコードが自分のファイルで同じに見えるのは驚きではありません。あなたのコードが何をしているのかを他の人に伝えなければならない時には、それは驚くべきことではありません。ちょうどそれを読むのは難しいので... – GhostCat

+0

私はそれに取り組んでいたように、正式なフォーマットについては申し訳ありません。異なるコンピュータ上のさまざまなプログラムからコピーして貼り付けました。 – bluphantom91

答えて

0

あなたが見逃した理由は、あなたのネットが何かを印刷するように指示しているからです。

if(letters[j] == colGuess && numbers[i-1] == rowGuess){ 
    if(boardFlag==true) { 
     System.out.print(" "+"X"); 
    } 
} 

ユーザーが入力した座標を処理するのは、ユーザーが入力した場合のみです。これを修正するには、あなたが見逃した場合に印刷を処理するためにif(boardFlag == true)の後にelseステートメントが必要です。

0

推測された場所がヒットでない場合は何もしないので、問題はコードの更新ボード部分にあります。

if(letters[j]==colGuess && numbers[i-1]==rowGuess && boardFlag) { 
    System.out.print(" "+"X"); 
} else { 
    System.out.print(letters[j]+""+numbers[i-1]); 
} 

完全更新部分:

//updates the board 
for (int i = 0 ; i <= 5 ; i++){ 
    for (int j = 0 ; j <= 5 ; j++){ 
     if (i == 0) { 
      System.out.print(letters[j]+" "); 
     } else if (j == 0){ 
      System.out.print(numbers[i-1]); 
     } else { 
      if(letters[j]==colGuess && numbers[i-1]==rowGuess && boardFlag){ 
       System.out.print(" "+"X"); 
      } else { 
       System.out.print(letters[j]+""+numbers[i-1]); 
      } 
     }   
     System.out.print(" "); 
    } 
    System.out.println(); 
} 
+0

それはちょうどelseの配置でしたか?私はループ内でそれを動かしてみましたが、それで何も印刷しませんでした。 – bluphantom91

+0

基本的には、boardFlagのチェックをifステートメントに組み合わせることができます。そのため、elseを上の方に並べ替えることができます。したがって、推測が配列の現在の位置と同じか、boardFlagが真であるかどうか、そしてそれらのどれかが偽である場合は、初めてボードを作成したときのように普通にボードを出力します。 – Mark

+0

私は実際に行と列の推測でif文にboardFlagチェックを入れようとしましたが、まだ正しく出力されていなかったので正しく実行していないはずです。ご協力ありがとうございました! – bluphantom91

0

このブロック(古いバージョン):

 if(hitFlag==true){ 
     System.out.println("we hit em at "+(char)colGuess+rowGuess+" chief!"); 
    } else { 
     System.out.println("sorry chief we missed em"); 
    } 

は(新バージョン)であるべき:

if(hitFlag==true){ 
     System.out.println("we hit em at "+(char)colGuess+rowGuess+" chief!"); 
    } else { 
     System.out.println("sorry chief we missed em at " + (char)colGuess+rowGuess); 
    } 

これが印刷されます:

sorry chief we missed em at D3  //D3 is a random possible set of coordinates 

のではなく:

sorry chief we missed em   //Old version 

だから、あなたが追加する必要があり、すべてはあなたの以前の推測の座標を出力し(char)colGuess+rowGuessは、あります。


コメントご質問がある場合は、

+0

@ bluphantom91これは非常に簡単な方法です。新しいコードは使用せず、非常に簡単です。 – CodingNinja

+0

@ bluphantom91 - 私はこのコードがうまく動作することを願っています。それが働くなら私に戻ってください – CodingNinja

関連する問題