生命游戏数组索引越界

2023-12-14

我正在玩康威的生命游戏。我很确定我即将完成,但是当我运行它时,我得到Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1 at game.of.life.GameOfLife.generation(GameOfLife.java:77) at game.of.life.GameOfLife.main(GameOfLife.java:32) Java Result: 1

我假设当检查数组边缘的邻居的方法时,那里没有任何东西,所以它死了或者什么的。我只是不知道如何做到这一点,以免发生这种情况。有人有想法吗?代码如下。

package game.of.life;
import java.util.Scanner;
public class GameOfLife {
static boolean[][] current = new boolean[10][10];
static boolean[][] old = new boolean[10][10];
static int population = 10;
public static void main(String[] args) {
    String a = " @ ";
    String b = " ' ";
    int choice = 9;
    int gencount = 0;
    Scanner input = new Scanner(System.in);
    System.out.print("Choose population density. i.e. 10 = 10%: ");
    population = input.nextInt();
    populate();
    copy();
    for(int r = 0; r < current.length; r++){
        for(int c = 0; c < current[r].length; c++){
            if(current[r][c] == true){
                System.out.print(a);
            }
            else
                System.out.print(b);
        }
        System.out.println();
    }
    System.out.print("Generation " + gencount + ".");
    while(choice != 0){
        System.out.print("Make a selection: 1 - Advance Generation 0 - Exit");
        choice = input.nextInt();
        if(choice == 1){
            generation();
            for(int r = 0; r < current.length; r++){
                for(int c = 0; c < current[r].length; c++){
                    if(current[r][c] == true){
                        System.out.print(a);
                    }
                    else
                        System.out.print(b);
                }
                System.out.println();
            }
            copy();
            gencount += 1;
            System.out.println("Generation" + gencount + ".");
        }
    }
}
private static void generation(){
    for(int r = 0; r < old.length; r++){
        for(int c = 0; c < old[r].length; c++){
            if (old[r][c] == true){
                int neighbors = 0;
                if(old[r + 1][c] == true)
                    neighbors += 1;
                if(old[r - 1][c] == true)
                    neighbors += 1;
                if(old[r][c + 1] == true)
                    neighbors += 1;
                if(old[r][c - 1] == true)
                    neighbors += 1;
                if(old[r + 1][c + 1] == true)
                    neighbors += 1;
                if(old[r + 1][c - 1] == true)
                    neighbors += 1;
                if(old[r - 1][c - 1] == true)
                    neighbors += 1;
                if(old[r - 1][c + 1] == true)
                    neighbors += 1;
                if(neighbors != 3 || neighbors != 2)
                    current[r][c] = false;
            }
            else if(old[r][c] == false){
                int neighbors = 0;
                if(old[r + 1][c] == true)
                    neighbors += 1;
                if(old[r - 1][c] == true)
                    neighbors += 1;
                if(old[r][c + 1] == true)
                    neighbors += 1;
                if(old[r][c - 1] == true)
                    neighbors += 1;
                if(old[r + 1][c + 1] == true)
                    neighbors += 1;
                if(old[r + 1][c - 1] == true)
                    neighbors += 1;
                if(old[r - 1][c - 1] == true)
                    neighbors += 1;
                if(old[r - 1][c + 1] == true)
                    neighbors += 1;
                if(neighbors == 3)
                    current[r][c] = true;
            }
        }
    }
}
private static void populate(){
    for(int r = 0; r < current.length; r++){
        for(int c = 0; c < current[r].length; c++){
            int q = (int)(Math.random() * 100);
            if(q < population){
                current[r][c] = true;
            }
            else{
                current[r][c] = false;
            }
        }
    }
}
private static void copy(){
    for(int r = 0; r < old.length; r++){
        for(int c = 0; c < old[r].length; c++)
            old[r][c] = current[r][c];
    }
}
}

如果有人可以帮助我,我将不胜感激。


When r is 0,这个无效:old[r - 1][c].
因此,您会得到您发布的异常。

我建议你像这样简化它。

    boolean isValidPosition(int r, int c){
        return 
            0 <= r && r < N &&
            0 <= c && c < M;

    }

    int getNeighboursCount(boolean[][] old, int r, int c){
        int neighbors = 0;
        for (int i=-1; i<=1; i++){
            for (int j=-1; j<=1; j++){
                if (i!=0 || j!=0){
                    if (isValidPosition(r + i, c + j)){
                        if(old[r + i][c + j])
                        {
                            neighbors++;
                        }
                    }
                }
            }
        }
        return neighbors;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

生命游戏数组索引越界 的相关文章

  • 类型已知,但方法指的是缺失类型

    我对 java 和 Eclipse 不太有经验 但遇到以下问题 我正在写类似的东西 Point3D myPoint myClass myMethod arg 我收到错误 方法 myMethod myType arg 引用缺失的类型 Poin
  • 是否可以使用 Java 读写 Parquet,而不依赖 Hadoop 和 HDFS?

    我一直在寻找这个问题的解决方案 在我看来 如果不引入对 HDFS 和 Hadoop 的依赖 就无法在 Java 程序中嵌入读写 Parquet 格式 它是否正确 我想在 Hadoop 集群之外的客户端计算机上进行读写 我开始对 Apache
  • 如何从 Java 访问 Windows 设备管理器中的信息?

    我有一个串行 USB 设备 并且其中多个设备可以连接到计算机 我需要查询和检索设备连接到的 COM 端口列表 在 Windows 设备管理器中 您可以获得当前连接的设备的 COM 端口 友好名称 该列表是动态的 从注册表中读取不工作 htt
  • 如何将本机数据库运算符 (postgres ~) 与 JPA 标准生成器一起使用?

    我使用 JPA 2 0 标准构建以下查询 简化 select n from notif n where n message b la 我正在使用 postgresql 数据库 我真的需要 运算符 而不是像 我可以使用与 CriteriaBu
  • 使用 kryo 注册课程的策略

    我最近发现了 kryonet 库 它非常棒并且非常适合我的需求 然而 我遇到的一个问题是制定一种好的策略来注册所有可以转移的类 我知道我可以在每个对象中编写一个静态方法 该方法将返回它使用的所有类的列表 但我真的不想这样做 为了我自己的时间
  • 如何自动转换十六进制代码以将其用作 Java 中的 byte[]?

    我这里有很多十六进制代码 我想将它们放入 Java 中 而不需要向每个实体附加 0x 喜欢 0102FFAB 和我必须执行以下操作 byte test 0x01 0x02 0xFF 0xAB 我有很多很长的十六进制代码 有什么办法可以自动做
  • 但是创建静态实用方法不应该被过度使用吗?如何避免呢? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 随着时间的推移 java项目中引入了许多实用方法来完成更复杂和简单的任务 当使用静态方法时 我们在代码中引入了紧密耦合 这使得我们的代
  • 如果数组包含一个或多个相同值,则合并数组

    我有一个数组数组 a 1 2 3 3 4 5 6 7 8 8 9 9 10 我想合并包含一个或多个相同值的所有数组 所以 a 1 2 3 4 5 6 7 8 9 10 我正在努力寻找一种简洁的方法来解决这个问题 有任何想法吗 我相信这是正确
  • 多维数组 PHP 内爆 [重复]

    这个问题在这里已经有答案了 就我的数据结构而言 我有一个 communications 数组 每个 communications id 本身包含三部分信息 id score 和 content 我想内爆这个数组以获得逗号分隔的 id 列表
  • ActiveMQ JNDI 查找问题

    尝试使用 JNDI 运行以下 ActiveMQ http activemq apache org jndi support html http ActiveMQ 20JNDI 并且我的 jboss server node lib 文件夹中有
  • 错误膨胀类 android.support.design.widget.NavigationView [启动时崩溃]

    该应用程序应该有一个导航抽屉 可以从左侧拉出并显示各种活动 但是一旦将导航栏添加到 XML Activity homescreen 文档中 应用程序一启动就会崩溃 主屏幕 java package com t99sdevelopment c
  • 使用 Guava Ordering 对对象列表进行多条件排序

    我有一个类无法实现可比较 但需要根据 2 个字段进行排序 我怎样才能用番石榴实现这一目标 假设班级是 class X String stringValue java util Date dateValue 我有一个清单 List
  • JPA Web 应用程序管理策略

    我们目前正在开发一个 J2EE Web 应用程序 使用 JPA 作为我们的数据访问层 我们目前正在研究几种不同的策略来在我们的应用程序中利用缓存 Create an EntityManager per request 在请求范围内获取缓存
  • Java 8 方法签名不一致

    Java 8 为我们提供了具有很长签名的新方法 如下所示 static
  • 在打字稿中获取类的键

    我有一个包含很多方法的类 我们称之为 myClass 我这样称呼它 myClass key 有没有办法从 key 获取可能的值 我希望有类似 keyof myClass 的东西 但我得到 myClass 引用一个值 但在这里被用作类型 问题
  • Spring - 如何在不匹配列名的情况下使用 BeanPropertyRowMapper

    我正在开发一个应用程序 该应用程序已使用行映射器从纯 JDBC 转换为 Spring 模板 我遇到的问题是数据库中的列与属性名称不匹配 这阻止我使用BeanPropertyRowMapper容易地 我看到一些关于在查询中使用别名的帖子 这会
  • java.lang.UnsatisfiedLinkError - android studio gradle 中的 NDK?

    文件夹结构 app main java jni Android mk Application mk hello jni c res 在构建 gradle apply plugin com android application androi
  • 在java中执行匿名pl/sql块并获取结果集

    我想执行匿名 PL SQL 并需要获取结果集对象 我得到了可以通过在 PL SQL 块内使用游标来完成的代码 但 PL SQL 块本身将以文本形式来自数据库 所以我无法编辑该 PL SQL 块 并且它只会返回两个值 其列名始终相同 它将返回
  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 如何在J2ME中获取数字的幂[重复]

    这个问题在这里已经有答案了 可能的重复 J2ME power double double 数学函数实现 https stackoverflow com questions 2076913 j2me powerdouble double ma

随机推荐