简体   繁体   中英

Array index out of bounds Java game of life?

I'm trying to do the game of life project for my java programming class, and I think i've got everything right, but for some reason i keep getting an out of bounds exception even though i don't have any numbers greater than the indexes. Wondering why it is throwing this error?

Code:

Project 4:

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Scanner;

public class Project4 {

    public static void main(String[] args) throws IOException {
        Scanner input = new Scanner(System.in); // Created a scanner
        System.out.println("Enter the file name you would like to use");
        File file = new File(input.nextLine()); // Takes file name to find file
        Scanner inputFromFile = new Scanner(file);
        FileInputStream fileInput = new FileInputStream(file); // reads file
        int r;
        int y = 0;
        int i = 0;
        while ((r = fileInput.read()) != -1) { // goes through each character in
                                                // file, char by char
            char c = (char) r;
            GameOfLife.grid[i][y] = c;
            y++;
            if (y == 75) {
                y = 0;
                i++;
                if (i == 25) {
                    break;
                }
            }
        }
        // Prints the initial environment
        System.out.println("Initial set: ");
        for (int j = 0; j < GameOfLife.grid.length; j++) {
            System.out.print(GameOfLife.grid[j]);
        }

        System.out.println("Do you want to see the next generation? Y/N?");
        String q = input.nextLine();
        if (q.equalsIgnoreCase("y")) {
            GameOfLife.evolve();
        } else {
            System.exit(0);
        }
    }
}

GameOfLife:

import java.util.Arrays;

public class GameOfLife {

    static final int m = 25; // number of rows
    static final int n = 75; // number of columns
    static char[][] grid = new char[m][n]; // Creates an empty (no dots or
                                            // X's)grid of rows and columns.

    static int count_neighbors(int i, int j) {
        int nn = 0; // number of neighbors of cell(i,j)

        if (grid[i - 1][j - 1] == 'X') {
            nn++;
        }
        ;
        if (grid[i - 1][j] == 'X') {
            nn++;
        }
        ;
        if (grid[i - 1][j + 1] == 'X') {
            nn++;
        }
        ;
        if (grid[i][j - 1] == 'X') {
            nn++;
        }
        ;
        if (grid[i][j + 1] == 'X') {
            nn++;
        }
        ;
        if (grid[i + 1][j - 1] == 'X') {
            nn++;
        }
        ;
        if (grid[i + 1][j] == 'X') {
            nn++;
        }
        ;
        if (grid[i + 1][j + 1] == 'X') {
            nn++;
        }

        return nn;
    }

    static void evolve() {
        for (int i = 0; i < 23; i++) {
            for (int j = 0; j < 73; j++) {
                int s = count_neighbors(i, j);
                if (s < 2) {
                    grid[i][j] = '.';
                }
                if (s == 2 || s == 3) {
                    grid[i][j] = 'X';
                }
                if (s > 3) {
                    grid[i][j] = '.';
                }
            }
            for (int j = 0; j < GameOfLife.grid.length; j++)
                System.out.print(GameOfLife.grid[j]);
        }

    }

}

To expand on Anton's post, while you need to count the neighbors on the corners still, you have to account for the fact that you are in the corner and can only count certain sides:

static int count_neighbors(int i, int j) {
    int nn = 0; // number of neighbors of cell(i,j)

    if (i > 0 && j > 0 && grid[i - 1][j - 1] == 'X') {
        nn++;
    }
    ;
    if (i > 0 && grid[i - 1][j] == 'X') {
        nn++;
    }
    ;
    if (i > 0 && j < 72 && grid[i - 1][j + 1] == 'X') {
        nn++;
    }
    ;
    if (j > 0 && grid[i][j - 1] == 'X') {
        nn++;
    }
    ;
    if (j < 72 && grid[i][j + 1] == 'X') {
        nn++;
    }
    ;
    if (j > 0 && i < 22 && grid[i + 1][j - 1] == 'X') {
        nn++;
    }
    ;
    if (i < 22 && grid[i + 1][j] == 'X') {
        nn++;
    }
    ;
    if (i < 22 && j < 72 && grid[i + 1][j + 1] == 'X') {
        nn++;
    }

    return nn;
}

You call count_neighbors on (0,0) in your evolve method. By the way, I am pretty sure, that compiler gives you the line where this exception was thrown.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM