基于文字的战舰打印两种相同网格的游戏- Java



我不知道为什么,但是每当你或电脑在我的游戏中受到打击时,网格都得到更新。玩家和计算机网格是"-"字符的多维数组,当你命中时,它会变成"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;
          }
      }
  }

这就是问题所在:

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

你只有实际上在这里得到了一个char[][]对象。两个变量都指向同一个对象…对该对象所做的任何更新都将通过两个变量可见。

看起来Grid.gridArray实际上是一个静态变量,这是另一个问题。你几乎肯定想让它成为一个实例变量…然后创建两个 Grid实例,而不是一个。

基本上,我会退后一步,找出Grid的实例意味着代表什么。您真的需要公开gridArray变量吗?为什么网格不能自己打印?

最新更新