Java 2D数组特定动作

时间:2018-11-20 18:22:01

标签: java

我开设了一个班级,其中生成了一个6x10 2D阵列以用作电路板。

然后在构造函数中生成一个随机的起始位置。我只希望可以进行相邻的移动。

例如,如果随机位置已生成为(2,3),则例如用户输入(1,2),这将是有效的移动,而(6,1)将是无效的移动。 / p>

然后,如果用户输入说(1,2),则他们可以转到(1,2)中的任何相邻单元格。

我已经包含了下面的类,以及我试图对其进行测试的相邻方法,但是我对如何实现此方法感到有些困惑。

import java.util.Arrays;
import java.util.Random;

public class Test {

    public static final int ROWS = 6;
    public static final int COLUMNS = 10;
    public int[][] board;

    public static void main(String[] args)
    {
        Test t = new Test();
        t.getBoard();
        t.makeMove(6,1);  //I want this to be an invalid move.
        t.getBoard();
        t.makeMove(1,2);  // this should be a valid move
        t.getBoard();

    }

    public Test()
    {
        board = new int[ROWS][COLUMNS];
        createRandomLocation();
    }

    public void createRandomLocation()
    {
        Random rand = new Random();
        int x = rand.nextInt(6);
        int y = rand.nextInt(10);
        board[x][y] = 1;
    }



    public void makeMove(int x,int y){
    if (Math.abs(x-cur_x)==0 || Math.abs(y-cur_y)==0) {
        board[x][y] = 1;
    }

    public String getBoard() {
        for (int i = 0; i < board.length; i++) {
            for (int j = 0; j < board[i].length; j++) {
                System.out.print(board[i][j] + " ");
            }
            System.out.println();
        }
        System.out.println();

        return Arrays.deepToString(board);
    }



}

相邻

/*public boolean isMoveAllowed(int [][] array,int x, int y){
            boolean adjacent = false;
            int trueCount = 0;
            if(array[x-1][y-1] == 0) trueCount++; //topleft
            if(array[x-1][y] == 0) trueCount++; //top
            if(array[x-1][y+1] == 0) trueCount++;//topright
            if(array[x][y+1] == 0) trueCount++;//right
            if(array[x][y-1] == 0) trueCount++;//left
            if(array[x+1][y-1] == 0) trueCount++;//bottomleft
            if(array[x+1][y] == 0) trueCount++;//bottom
            if(array[x+1][y+1] == 0) trueCount++; //bottomright

            if (trueCount == 8)
            {
                adjacent = true;
            }
            return adjacent;
        }*/

2 个答案:

答案 0 :(得分:1)

您的问题描述已经包含了答案。如果a和c之间以及b和d之间的距离为零或一,则您希望从(a,b)到(c,d)的任何移动都是合法的。因此,如果看到xsl:number,那是非法的举动。因此:将当前位置存储在某些变量中,然后将它们与所需的新位置进行比较:

Math.abs(a-c)>1

由Board类负责跟踪坐标:

public static void main(String[] args)
{
    Board b = new Board(6, 10);
    try {
      b.tryMove(6,1);
    } catch(IllegalMoveException e) {
      // do whatever you need to do to inform the user that move is illegal
    }
}

答案 1 :(得分:0)

测试真实情况比测试当前情况要容易得多,isMoveAllowed方法看起来应该像这样:

public boolean isMoveAllowed(int[][] array, int x, int y) {
    return ((array[x + 1][y] == 1) || 
            (array[x - 1][y] == 1) || 
            (array[x][y + 1] == 1) || 
            (array[x][y - 1] == 1));
}

如果移动靠近当前玩家位置,则返回true