-1

理由はわかりませんが、あなたまたはコンピューターがゲームでヒットすると、両方のグリッドが更新されます。プレーヤーとコンピューターのグリッドは「-」文字の多次元配列であり、ヒットすると「x」に変わります。ゲーム ループでは、それらはプレイヤー グリッドとコンピューター グリッドであり、私はそれらを別々の時間に別々に更新しますが、それらが両方とも同じように印刷されると更新します。誰か助けてくれませんか?プログラミング初心者ですみません

public class Game{
  public static void main(String[] args){
    Grid grid = new Grid();
    Computer computer = new Computer();
    Player player = new Player();
    String playerGuess;
    player.setPlayerShips();
    computer.setComputerShips();
    char[][] playerGrid= Grid.gridArray;
    char[][] computerGrid = Grid.gridArray;

    System.out.println("Welcome to BATTLESHIP");
    System.out.println("You are to sink your opponents 3 ships, each 3 units in length.");
    System.out.println("The ships can be both vertical and horizontal.");
    System.out.println("Enter your coordinate guess in the form A1, B5, F6, etc.");
    System.out.println("Since the grid is 7x7, coordinates go from A1-G7.");
    System.out.println("Letters are vertical, numbers are horizontal.");
    System.out.println("You will also have 3 ships placed randomly, which the computer will also try to guess.");
    System.out.println("During the game, enter exit if you would like to quit.");
    System.out.println();
    while(true){
      System.out.println("Your Grid");
      grid.printGrid(playerGrid);
      System.out.println("Opponent's Grid");
      grid.printGrid(computerGrid);
      System.out.println();
      playerGuess=player.getGuess();
      if(playerGuess.equals("exit")){
        break;
      }else{
        playerGuess=grid.convert(playerGuess);
      }
      player.setFirstCo(playerGuess);
      player.setSecondCo(playerGuess);
      System.out.println();
       if(player.isHit(player.firstCo, player.secondCo)){
        player.addHits(player.firstCo, player.secondCo);
        System.out.println("Hit!");
        System.out.println();
        computerGrid=Grid.newGrid(computerGrid,player.firstCo,player.secondCo);
       }else{
        System.out.println("Miss.");
        System.out.println();
      }
       if(player.hasWon()){
        System.out.println("Congratulations, you have sunk all your opponents ships!");
        break;
        }

      computer.guess=computer.getGuess();
      computer.lastGuess=computer.guess;
      if(computer.isHit(computer.guess[0],computer.guess[1])){
        computer.addHits(computer.guess[0],computer.guess[1]);
        System.out.println("Computer has hit!");
        System.out.println();
        playerGrid=grid.newGrid(playerGrid,  computer.guess[0], computer.guess[1]);
        if(computer.hasWon()){
          System.out.println("Computer has sunk all your ships! You lose.");
          break;
        }
      }else{
        System.out.println("Computer has missed.");
        System.out.println();
      }
}
}
}

グリッドを個別に印刷するようにしましたが、配置船の方法に問題があります。誰か見てもらえませんか?ランダムな x,y 座標 (船ごとに 3 点) を選択し、これを 3 つの船に対して行うとします。時々4ポイントが連続して配置され、他の船はありません(船が重なっているだけだと思いますが、修正を加えようとしました)。とにかく、助けていただければ事前に感謝します。

//set player ships coordinates, can be numbers from 0-6
  public static void setPlayerShips(){
      int randX, randY;
      int direction; //will be random int 0-1, determines direction ship will extend(up/down, left/right)

      randX=(int)(Math.random()*7);
      randY=(int)(Math.random()*7);
      direction=(int)(Math.random()*2);

      playerShip1[0]=randX;
      playerShip1[1]=randY;
      if(direction==0){//extend upwards or downwards 2 units(y values change, x stays the same)
          playerShip1[2]=randX;
          playerShip1[4]=randX;
          if(randY>3){//if y value is greater than 3, has to extend down or it wont fit
              playerShip1[3]=randY-1;
              playerShip1[5]=randY-2;
          }else if(randY<2){//if y value is less than 2, has to extend up or it wont fit
              playerShip1[3]=randY+1;
              playerShip1[5]=randY+2;
          }else{//if direction doesnt matter, just extend upwards
              playerShip1[3]=randY+1;
              playerShip1[5]=randY+2;
          }
      }else if(direction==1){//extends left or right 2 units(y values stay the same, x changes)
          playerShip1[3]=randY;
          playerShip1[5]=randY;
          if(randX>3){//if x is greater than 3, must extend left or it wont fit
              playerShip1[2]=randX-1;
              playerShip1[4]=randX-2;
          }else if(randX<2){//if x is less than 2, must extend right or it wont fit
              playerShip1[2]=randX+1;
              playerShip1[4]=randX+2;
          }else{//if direction doesnt matter, just extend right
              playerShip1[2]=randX+1;
              playerShip1[4]=randX+2;
          }
      }
      //do same for both other ships, do quick checks to make sure original coordinates arent the same
      do{
          randX=(int)(Math.random()*7);
          randY=(int)(Math.random()*7);
      }while(randX==playerShip1[0] && randY==playerShip1[1]);  
      direction=(int)(Math.random()*2);

      playerShip2[0]=randX;
      playerShip2[1]=randY;
      if(direction==0){
          playerShip2[2]=randX;
          playerShip2[4]=randX;
          if(randY>3){
              playerShip2[3]=randY-1;
              playerShip2[5]=randY-2;
          }else if(randY<2){
              playerShip2[3]=randY+1;
              playerShip2[5]=randY+2;
          }else{
              playerShip2[3]=randY+1;
              playerShip2[5]=randY+2;
          }
      }else if(direction==1){
          playerShip2[3]=randY;
          playerShip2[5]=randY;
          if(randX>3){
              playerShip2[2]=randX-1;
              playerShip2[4]=randX-2;
          }else if(randX<2){
              playerShip2[2]=randX+1;
              playerShip2[4]=randX+2;
          }else{
              playerShip2[2]=randX+1;
              playerShip2[4]=randX+2;
          }
      }
      do{
          randX=(int)(Math.random()*7);
          randY=(int)(Math.random()*7);
      }while((randX==playerShip1[0]&& randY==playerShip1[1])&&(randX==playerShip2[0] && randY==playerShip2[1]));
      direction=(int)(Math.random()*2);

      playerShip3[0]=randX;
      playerShip3[1]=randY;
      if(direction==0){
          playerShip3[2]=randX;
          playerShip3[4]=randX;
          if(randY>3){
              playerShip3[3]=randY-1;
              playerShip3[5]=randY-2;
          }else if(randY<2){
              playerShip3[3]=randY+1;
              playerShip3[5]=randY+2;
          }else{
              playerShip3[3]=randY+1;
              playerShip3[5]=randY+2;
          }
      }else if(direction==1){
          playerShip3[3]=randY;
          playerShip3[5]=randY;
          if(randX>3){
              playerShip3[2]=randX-1;
              playerShip3[4]=randX-2;
          }else if(randX<2){
              playerShip3[2]=randX+1;
              playerShip3[4]=randX+2;
          }else{
              playerShip3[2]=randX+1;
              playerShip3[4]=randX+2;
          }
      }
  }
4

1 に答える 1

2

これが問題です:

char[][] playerGrid= Grid.gridArray;
char[][] computerGrid = Grid.gridArray;

ここには、実際には1つのchar[][]オブジェクトしかありません。両方の変数が同じオブジェクトを参照しています...そのオブジェクトに加えられた更新は、両方の変数を介して表示されます。

実際には静的変数のように見えますが、これは別の問題です。ほぼ確実に、それをインスタンス変数にしたいと思うでしょう...そして、 1つではなく2つのインスタンスを作成します。Grid.gridArrayGrid

基本的に、私は一歩下がって、のインスタンスが何Gridを表すのかを理解します。本当にgridArray変数を公開する必要がありますか?グリッドがそれ自体を印刷できないのはなぜですか?

于 2013-01-16T07:27:30.223 に答える