当前位置: 首页 > 知识库问答 >
问题:

Java下一步覆盖2D数组[重复]

欧阳哲
2023-03-14

以下代码是康威在终端中的生活游戏。我想在这里做的是将当前步骤覆盖到下一步。我有一个临时的2D数组在动画()方法。同样在主方法中,我打印了三次动画变化(),这就是我想要改变的。基本上,我想覆盖董事会,而不是打印三次,因为视觉上它相当丑陋,而循环。

public class GameOfLifeTerminal {
    private int WIDTH;
    private int HEIGHT;
    private int[][] board;
    private int aliveNeighbours = 0;


    public GameOfLifeTerminal(int width, int height) {
        this.WIDTH = width;
        this.HEIGHT = height;
        this.board = new int[width][height];
    }

    /*Getters & Setters*/
    public void setAlive(int x, int y) {
        this.board[x][y] = 1;
    } //true
    public void setDead(int x, int y) {
        this.board[x][y] = 0;
    } // false, currently not being used
    //get the rows in the y axis
    public int getRows(){ return board.length; }
    //get the columns in the x axis
    public int getColumns(){ return board[0].length; }

    /*Methods and functions*/
    public void printBoard() { //prints the board
        for (int y = 0; y < HEIGHT; y++) {
            String line = "";
            for (int x = 0; x < WIDTH; x++) {
                if (this.board[x][y] == 0) {
                    line += "·";
                } else {
                    line += "O";
                }
            }
            System.out.println(line);
        }
        System.out.println();
    }

    public int countAliveNeighbours(int x, int y) {    //count the number of alive neighbours
        int count = 0;
        /*
        for(int i = x-1; i < x+1; i++) {
            for (int j = y - 1; i < y + 1; j++) {
                if (getState(i, j) == 1) count++;
            }
        }
         if(getState(x, y) == 1) count--;
        */

        //checks each position one by one and calls the getState() method to be inside the bounds
        count += getState(x - 1, y - 1);
        count += getState(x, y - 1);
        count += getState(x + 1, y - 1);

        count += getState(x - 1, y);
        count += getState(x + 1, y);

        count += getState(x - 1, y + 1);
        count += getState(x, y + 1);
        count += getState(x + 1, y + 1);
        //System.out.println(count);
        return count;
    }

    public int getState(int x, int y) { //get state neighbours in case is out of bounds
        if (x < 0 || x >= WIDTH) return 0;
        if (y < 0 || y >= HEIGHT) return 0;
        return this.board[x][y];
    }

    public void animateChanges() { //applies the rules and then prints the board with current state of the cells
        //temporary board
        int[][] newBoard = new int[WIDTH][HEIGHT];
        for (int y = 0; y < HEIGHT; y++) {
            for (int x = 0; x < WIDTH; x++) {
                aliveNeighbours = countAliveNeighbours(x, y);
                //rules
                if (getState(x, y) == 1) { //if true
                    if (aliveNeighbours < 2) { // le ded
                        newBoard[x][y] = 0;
                    } else if (aliveNeighbours == 2 || aliveNeighbours == 3) { //alive
                        newBoard[x][y] = 1;
                    } else if (aliveNeighbours > 3) { // le ded
                        newBoard[x][y] = 0;
                    }
                } else {
                    if (aliveNeighbours == 3) { //create new cells
                        newBoard[x][y] = 1;
                    }
                }
            }
        }
        this.board = newBoard;
        
        //System.out.println("Alive cells " + aliveNeighbours);
        printBoard();
    }
    //main method
    public static void main(String[] args) {
        GameOfLifeTerminal simulation = new GameOfLifeTerminal(8, 5);
        simulation.setAlive(2, 2);
        simulation.setAlive(3, 2);
        simulation.setAlive(4, 2);

        simulation.animateChanges();
        simulation.animateChanges();
        simulation.animateChanges();
    }
}

共有1个答案

邢小云
2023-03-14

您似乎已经在使用此调用“覆盖”animateChanges()方法中的板:this。板=新板 为什么不简单地删除对printBoard()的调用 来自相同的animateChanges()方法?然后,您可以调用printBoard()何时以及如何执行此操作。

 类似资料:
  • 问题内容: 假设我在课堂上说两种方法 和 那是什么感觉 重载还是重载? 问题答案: 重载是指两个或多个具有相同名称但参数不同的方法,就像您的示例一样。重载是从接口或抽象类实现一个方法的,因此超类中的方法具有实现,而子类中的方法具有不同的实现,它们仍然具有相同的方法名称和参数。

  • 问题内容: 嗨,我只是想确保我正确理解这些概念。Java中的重载意味着您​​可以拥有具有不同数量的参数或不同数据类型的构造函数或方法。即 这个方法怎么样?由于它返回不同的数据类型,是否仍会被视为重载? 第二个问题是:java中有什么重载?它与继承有关吗?让我们有以下内容: 所以现在让我说以下 如果我打电话 这将返回车辆类的价格20,000 如果我打电话 这将返回卡车级别的价格14,000 我的知识

  • 我正在尝试使用fscanf加载一些结构数组的默认值,这看起来像 数据按如下方式存储在文本文件中(使用不同的值重复多次): 我用fscanf/fscanf_s(尝试两者)读取的值如下: 然而,VS2012在最后抛出了一个异常,称列表已损坏。调试显示,在阅读了上述示例文本的前四行后,结构的“map”部分包含以下内容 其中X是未初始化的值。 似乎fscanf正在试图“null terminate”我的整

  • 我有一个Maven插件,它在POM文件中配置为 现在我想从命令行覆盖那个,所以我运行 我可以看到的值仍然是,而不是。可以从命令行覆盖配置参数吗?

  • 我仍在学习封装。我有一个,其中每个emcapsulated都有一个数组,以及它们的所有设置程序 现在在我的程序中,我注意到数组listRule(其中添加了与语法相关的规则)在每次添加新语法时都会被覆盖。我已经能够识别出错误发生在会清空listRule中所有其他语法的内容,因此listRule似乎对所有语法都是一样的。我的数组listRule创建不正确还是我的循环?

  • 所以,我有两个多维数组。 数组值示例: 这就是我想要的 我想从组合中获得所有唯一的数组,并用它填充唯一的组合。 我尝试了这个函数,但它只填充了5个数组,真奇怪!