尝试使用Gridworld制作康威的生命游戏。 Everything编译,但当我尝试采取“步骤”
时,我一直收到错误Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Cell.processSurrondings(Cell.java:27)
at Cell.act(Cell.java:44)
at info.gridworld.actor.ActorWorld.step(ActorWorld.java:68)
at info.gridworld.gui.GUIController.step(GUIController.java:134)
at info.gridworld.gui.GUIController$4.actionPerformed(GUIController.java:247)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2018)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2341)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6505)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4492)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:729)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:688)
at java.awt.EventQueue$3.run(EventQueue.java:686)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:702)
at java.awt.EventQueue$4.run(EventQueue.java:700)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:699)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
以下是文件 lifeWorld(actorWorld的变体)
import info.gridworld.actor.Actor;
import info.gridworld.actor.ActorWorld;
import info.gridworld.grid.Location;
import info.gridworld.grid.UnboundedGrid;
import java.util.ArrayList;
public class lifeWorld extends ActorWorld {
private static final String FIRST_LINE = "Welcome to Ern's Game of Life. (A rip off of Conway's Game of Life)\n" +
"Click a live cell to kill it, a dead cell to resurect it, or run to run the cycles!";
public lifeWorld() {
setGrid(new UnboundedGrid<Actor>());
System.setProperty("info.gridworld.gui.selection", "hide");
System.setProperty("info.gridworld.gui.tooltips", "hide");
System.setProperty("info.gridworld.gui.frametitle", "Ern's Game of Life");
}
private String setMessage() {
return FIRST_LINE;
}
public boolean locationClicked(Location loc) {
if (getGrid().get(loc) == null)
new Cell().putSelfInGrid(getGrid(), loc);
else
getGrid().get(loc).removeSelfFromGrid();
return true;
}
}
Cell(Critter的变体)
import info.gridworld.actor.Actor;
import info.gridworld.grid.Location;
import java.awt.Color;
import java.util.ArrayList;
public class Cell extends Actor {
private boolean planning;
private boolean dies;
private ArrayList<Location> cellsToAdd;
public Cell() {
setColor(Color.BLACK);
planning = true;
dies = false;
}
private void processSurrondings(){
ArrayList<Location> adjCells = getGrid().getOccupiedAdjacentLocations(getLocation());
ArrayList<Location> cellsAdd = new ArrayList<Location>();
if(adjCells.size() > 0)
for(Location a: adjCells)
if(getGrid().getOccupiedAdjacentLocations(a).size() == 3)
cellsToAdd.add(a); //The error happens here apparently
ArrayList<Location> isDead = getGrid().getOccupiedAdjacentLocations(getLocation());
dies = (!(isDead.size() == 2 || isDead.size() == 3));
}
private void executeStep() {
for(Location a: cellsToAdd){
Cell cell = new Cell();
cell.putSelfInGrid(getGrid(),a);
}
if(dies)
removeSelfFromGrid();
}
public void act() {
if (planning) {
processSurrondings();
planning = !(planning);
}
else
this.executeStep();
}
}
GameOfLifeRunner(跑步者/驱动程序文件)
import info.gridworld.actor.ActorWorld;
import info.gridworld.grid.UnboundedGrid;
import info.gridworld.actor.Actor;
public class GameOfLifeRunner {
public static void main(String[] args) {
lifeWorld world = new lifeWorld();
world.show();
}
}