Reputation: 161
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]);
}
}
}
Upvotes: 0
Views: 461
Reputation: 539
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;
}
Upvotes: 1
Reputation: 2383
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.
Upvotes: 0