【问题标题】:Game of life Algorithm/ Structure of if else statements生命游戏算法/ if else 语句的结构
【发布时间】:2012-09-27 06:08:27
【问题描述】:

我目前正在介绍 Java 类编程,但遇到了一两个问题。

首先我目前的程序是“康威的生命游戏”,除了检查相邻单元格的算法之外,我已经完成了所有工作。

我在 Stackoverflow 上查看了大约 7 或 8 个不同的帖子,在其他网站上查看了一些帖子,但到目前为止,我找不到任何人采用了我的方法。

现在我只需要有人检查我的代码,看看它是否应该工作,如果不能工作,为什么不呢?目前我收到一个运行时错误消息:

“ArrayIndexOutOfBoundsException: 5 at Life.checkold(Life.java:151)”

我已尽我所能在代码中标记了这个位置。

我对这些方法的输入是一个大小为 5 x 5 的数组

首先,感谢您至少阅读本文。其次,如果我需要包含其他任何内容,请发表评论或回复(这里是新的抱歉)

构建下一代:

public static boolean[][] buildnext(boolean[][] lastgen)
{
    boolean[][] nextgen = new boolean[lastgen.length][lastgen[0].length];

    for(int r = 0; r < lastgen[0].length; r++)
    {
        for(int c = 0; c < lastgen.length; c++)
        {
            nextgen[c][r] = checkold(lastgen, c, r);
        }
    }
    return nextgen;

}

我的检查方法:

public static boolean checkold(boolean[][] lastgen, int col, int row)
    {
        int acount = 0;
        boolean alive = lastgen[col][row];

        if(col == 0 && row == 0) //Top Left Corner
        {       
            if(lastgen[col][row + 1] == true) acount++; //Below
            if(lastgen[col + 1][row] == true) acount++; //Right
            if(lastgen[col + 1][row + 1] == true) acount++; //Below Right
        }

        else if(col == lastgen.length && row == 0)//Top Right Corner
        {
            if(lastgen[col][row + 1] == true) acount++; //Below
            if(lastgen[col - 1][row] == true) acount++; //Left
            if(lastgen[col - 1][row + 1] == true) acount++; //Below Left
        }
        else if(col == 0 && row == lastgen[0].length)//Bottom Left Corner
        {
            if(lastgen[col][row - 1] == true) acount++; //Above
            if(lastgen[col + 1][row] == true) acount++; //Right
            if(lastgen[col + 1][row - 1] == true) acount++; //Above Right

        }
        else if(col == lastgen.length && row == lastgen[0].length) //Bottom Right Corner
        {
            if(lastgen[col][row - 1] == true) acount++; //Above
            if(lastgen[col - 1][row] == true) acount++; //Left
            if(lastgen[col - 1][row - 1] == true) acount++; //Above Left
        }
        else if(col == 0 && row > 0 && row < lastgen[0].length) //Left Col
        {
            if(lastgen[col][row - 1] == true) acount++; //Above
                            if(lastgen[col][row + 1] == true) acount++; //Below  (This is the code that the runtime error is about)
            if(lastgen[col + 1][row] == true) acount++; //Right
            if(lastgen[col + 1][row - 1] == true) acount++; //Above Right
            if(lastgen[col + 1][row + 1] == true) acount++; //Below Right

        }
        else if(col == lastgen.length && row > 0 && row < lastgen[0].length) //Right Col
        {
            if(lastgen[col - 1][row] == true) acount++; //Left
            if(lastgen[col][row - 1] == true) acount++; //Above
            if(lastgen[col][row + 1] == true) acount++; //Below
            if(lastgen[col - 1][row - 1] == true) acount++; //Above Left
            if(lastgen[col - 1][row + 1] == true) acount++; //Below Left
        }
        else if(col < 0 && row == 0) //Top Row
        {
            if(lastgen[col][row + 1] == true) acount++; //Below
            if(lastgen[col - 1][row] == true) acount++; //Left
            if(lastgen[col + 1][row] == true) acount++; //Right
            if(lastgen[col - 1][row + 1] == true) acount++; //Below Left
            if(lastgen[col + 1][row + 1] == true) acount++; //Below Right
        }
        else if(col < 0 && row == lastgen[0].length) //Bottom Row
        {
            if(lastgen[col][row - 1] == true) acount++; //Above
            if(lastgen[col - 1][row] == true) acount++; //Left
            if(lastgen[col + 1][row] == true) acount++; //Right
            if(lastgen[col - 1][row - 1] == true) acount++; //Above Left
            if(lastgen[col + 1][row - 1] == true) acount++; //Above Right
        }
        else if(col < 0 && row < 0) //Middle Cells
        { 
            if(lastgen[col][row + 1] == true) acount++; //Below
            if(lastgen[col][row - 1] == true) acount++; //Above
            if(lastgen[col - 1][row] == true) acount++; //Left
            if(lastgen[col + 1][row] == true) acount++; //Right

            if(lastgen[col - 1][row - 1] == true) acount++; //Above Left
            if(lastgen[col + 1][row - 1] == true) acount++; //Above Right
            if(lastgen[col - 1][row + 1] == true) acount++; //Below Left
            if(lastgen[col + 1][row + 1] == true) acount++; //Below Right
        }

        if(acount == 3 && alive == false) alive = true;
        if(acount == 1) alive = false;
        if(acount == 3 && alive == true) alive = false;

        return alive;
    }

【问题讨论】:

标签: java if-statement runtime-error conways-game-of-life


【解决方案1】:

您的异常非常明显,您正在尝试访问超出范围的数组索引。

else if(col == 0 && row > 0 && row < lastgen[0].length) //Left Col
        {
            if(lastgen[col][row - 1] == true) acount++; //Above
                            if(lastgen[col][row + 1] == true) acount++; //Below  (This is the code that the runtime error is about)

您的代码在这一行失败:

if(lastgen[col][row + 1] == true) 

说lastgen数组是2X3数组并且row = 2,否则如果部分为真,考虑if也为真,现在在这里

if(lastgen[col][row + 1] == true) 

您正在尝试访问 3 索引, 记住:数组索引从零开始。如果您的数组长度为 3,则您的数组索引将为 0、1、2。 2 将是最后一个索引。

【讨论】:

  • 啊,我明白我做了什么。感谢您的解释。因此,解决此问题的一种可能方法是将 lastgen[0].length 替换为 lastgen[0].length-1。
【解决方案2】:

这些条件是否正确?

      col < 0

在我看来,您应该评估“col > 0”

【讨论】:

  • 您是对的,感谢您的发现。那会让我下一个。 (我想这就是我在午夜尝试编写代码的结果)
【解决方案3】:

由于同一块中有两行而出错

 1. if(lastgen[col][row + 1] == true) acount++;
 2. if(lastgen[col + 1][row + 1] == true) acount++;

假设您的 lastgen 元素大小为 4,并且您尝试使用 [row+1] 访问,这显然是 5

编辑

输入else if(col == 0 &amp;&amp; row &gt; 0 &amp;&amp; row &lt; lastgen[0].length-1)

而不是else if(col == 0 &amp;&amp; row &gt; 0 &amp;&amp; row &lt; lastgen[0].length)

array.length-1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2020-12-04
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    相关资源
    最近更新 更多