0

私は現在、Java クラスでのプログラミングの入門段階にあり、1 つまたは 2 つの問題に遭遇しました。

まず、現在のプログラムは「Conway's Game of Life」です。隣接するセルをチェックするアルゴリズムを除いて、すべてが機能しています。

私は Stackoverflow で約 7 つか 8 つの異なる投稿をチェックアウトし、他のサイトでいくつかの投稿をチェックアウトしましたが、これまでのところ、私が持っているアプローチを採用した人を見つけることができません。

今私が必要としているのは、私のコードを調べて、それが機能するかどうかを確認し、機能しない場合はなぜですか? 現在、次のようなランタイム エラーが発生しています。

"ArrayIndexOutOfBoundsException: Life.checkold(Life.java:151) で 5" .

コード内のこの場所をできる限りマークしました。

これらのメソッドへの私の入力は、サイズが 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;
    }
4

3 に答える 3

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 配列で行 = 2 であるとします。それ以外の場合は一部が true であり、これも true であるかどうかを検討します。

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

インデックスにアクセスしようとしている場合3、覚えておいてください: 配列のインデックスはゼロから始まります。配列の長さが 3 の場合、配列インデックスは 0,1,2 になります。2最後のインデックスになります。

于 2012-10-06T06:09:13.533 に答える
1

これらの条件は正しいですか?

      col < 0

「col > 0」を評価する必要があるようです

于 2012-10-06T06:14:37.910 に答える
0

同じブロック内の2行が原因でエラーが発生しました

 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 && row > 0 && row < lastgen[0].length-1)

それ以外の else if(col == 0 && row > 0 && row < lastgen[0].length)

array.length-1

于 2012-10-06T06:28:23.813 に答える