我的ConnectFour游戏是正方形网格而不是矩形网格

时间:2019-11-01 03:54:59

标签: java

GRID_HEIGHTGRID_WIDTH相同时,我的四个连接游戏程序可以工作,但是我的分配要求高度为6,宽度为7。设置时不起作用到6和7,但是由于某种原因,当宽度为7而高度为6时,它可以工作,尽管我需要相反的操作。对于此版本,尽管在正方形网格上可以正常运行,但当输入输入时,系统会立即崩溃。感谢您的帮助!

import java.util.Scanner;

public class WrittenStuff 
{
  public static final int GRID_HEIGHT=7;
  public static final int GRID_WIDTH=7;
  int totalMovesPlayed;
  char[][] board;

  public WrittenStuff()
  {
    board=new char[GRID_HEIGHT][GRID_WIDTH];
    totalMovesPlayed=0;
  }

  public static void main(String args[])
  {

    Scanner input = new Scanner(System.in);
    WrittenStuff c4=new WrittenStuff();
    System.out.println("WELCOME TO CONNECT FOUR!!!");
    c4.printBoard();
    outer:
      while(true)
    {
      int column=0;
      //PLAYER 1.
      while(true)
      {
        System.out.print("\n\nPlayer 1 play:");
        column = input.nextInt();
        column = column-1;
        if(c4.isPlayable(column))
        {
          if(c4.playMove(column, 'X'))
          {
            c4.printBoard();
            System.out.println("\n\nPlayer 1 wins!!!");
            break outer;
          }
          break;
        }
        else{
          System.out.println("Column "+column+" is already full!!");
        }
      }
      c4.printBoard();

      //PLAYER 2.    
      while(true)
      {
        System.out.print("\n\nPlayer 2 play:");
        column = input.nextInt();
        column = column-1;
        if(c4.isPlayable(column))
        {
          if(c4.playMove(column, 'O'))
          {
            c4.printBoard();
            System.out.println("\n\nPlayer 2 wins!!!");
            break outer;
          }
          break;
        }
        else{
          System.out.println("Column "+column+" is already full!!");
        }
      }
      c4.printBoard();

      if(c4.isFull())
      {
        System.out.print("Game drawn. Both of you suck at this!!! ");
        break;
      }
    }
  }

  public void printBoard()
  {
    for(int vert=0;vert<board.length;vert++)
    {
      for(int hori=0;hori<board[0].length;hori++)
      {
        if(board[vert][hori] == 0)
        {
          System.out.print("|" + "_" + "|");
        }
        else
        {


        System.out.print("|" + board[vert][hori] + "|");
        }
      }
      System.out.println();
    }

    for(int vert=0;vert<GRID_WIDTH;vert++)
      System.out.print(" "+(vert+1)+" ");
    System.out.println();
  }

  public boolean playMove(int column, char playerNum)
  {
    int vert=0;
    for(vert=0;vert<GRID_HEIGHT;vert++)
    {
      if(board[vert][column] == 'X' || board[vert][column] == 'O')
      {
        board[vert-1][column]=playerNum;
        break;
      }
    }
    if(vert == GRID_HEIGHT)
    {
      board[vert-1][column]=playerNum;
    }

    totalMovesPlayed++;
    return isConnected(vert-1,column);
  }

  public boolean isPlayable(int column)
  {
    return board[0][column] == 0; 
  }

  public boolean isFull()
  {
    return totalMovesPlayed == GRID_HEIGHT*GRID_WIDTH;
  }

  public boolean isConnected(int x, int y)
  {
    int num=board[x][y];
    int count=0;
    int vert=y;

    //HORIZONTAL.
    while(vert<GRID_WIDTH && board[x][vert] == num)
    {
      count++; vert++;
    }
    vert=y-1;
    while(vert>=0 && board[x][vert] == num)
    {
      count++; vert--;
    }
    if(count == 4){
      return true;}

    //VERTICAL.
    count=0; int hori=x;
    while(hori<GRID_HEIGHT && board[hori][y] == num)
    {
      count++; hori++;
    }
    if(count == 4){
      return true;}

    //SECONDARY DIAGONAL.
    count=0; vert=x; hori=y;
    while(vert<GRID_WIDTH && hori<GRID_HEIGHT && board[vert][hori] == num)
    {
      count++; vert++; hori++;
    }
    vert=x-1; hori=y-1;
    while(vert>=0 && hori>=0 && board[vert][hori] == num)
    {
      count++; vert--; hori--;
    }
    if(count == 4){
      return true;}

    //LEADING DIAGONAL.
    count=0; vert=x; hori=y;
    while(vert<GRID_WIDTH && hori>=0 && board[vert][hori] == num)
    {
      count++; vert++; hori--;
    }
    vert=x-1; hori=y+1;
    while(vert>=0 && hori<GRID_HEIGHT && board[vert][hori] == num)
    {
      count++; vert--; hori++;
    }
    if(count == 4){
      return true;}

    return false;
  }
}

1 个答案:

答案 0 :(得分:0)

看着您对board的所有使用,我发现:

board[vert][hori]
board[vert][hori]
board[vert][column]
board[vert][column]
board[vert-1][column]
board[vert-1][column]
board[0][column]
board[x][y]
board[x][vert]
board[x][vert]
board[hori][y]
board[vert][hori]
board[vert][hori]
board[vert][hori]
board[vert][hori]

因此,如果第一维由vert索引,第二维由hori索引,那么为什么第二维变量有时命名为column而不是hori?一致的命名对于人类理解您的代码(包括您自己的代码)非常重要,可以防止编码错误。

但更重要的是,[x][y][x][vert][hori][y]到底是怎么回事?假设y等效于vert,并且假设x等效于hori(同样,请使用一致的命名), 撤消