У меня есть оставшийся школьный проект, который я не смог получить, как планировалось.У класса была текстовая игра Connect4, затем графический интерфейс (с использованием JavaFX), затем сервер-клиент для него.
Мой автономный графический интерфейс будет работать до тех пор, пока игрок не выиграет игру, но в тот момент он вылетает, если зеленый выигрывает (длинное сообщение об ошибке, но, похоже, оно заканчивается IllegalArgumentException, связанным с родительским классом java)
Кроме того, я не знаю, возможно ли для этого взаимодействовать с сервером JavaFX, или я должен отказаться и сделать свинг, но я действительно хотел, чтобы это работало для моего спокойствия.Прямо сейчас я борюсь с идеей бэкэнда и логики графического интерфейса для победы, но это единственный дизайн, который я мог бы работать до такой степени, плохой дизайн как есть ...
Пожалуйста, дайте мне знать, если большенужна информация, я знаю, что эта программа - беспорядок, поскольку я не делал GUI прежде, и я боюсь очистить программу перед ее исправлением.Исходный файл длинный, но, похоже, ошибка связана с недопустимым аргументом исключения с родительским объектом.
@Override
public void start(Stage primaryStage)
{
GridPane rectangleRoot = new GridPane();
GridPane circleRoot = new GridPane();
makeCircleBoard(rectangleRoot, circleRoot, playerColor);
rectangleRoot.setAlignment(Pos.CENTER);
circleRoot.setAlignment(Pos.CENTER);
Scene scene = new Scene(rectangleRoot, 1000, 1000);
Rectangle gameBoardSpace = new Rectangle(scene.getWidth() / 2, scene.getHeight()
/2, Color.DARKBLUE);
rectangleRoot.getChildren().add(gameBoardSpace);
rectangleRoot.getChildren().add(circleRoot);
primaryStage.setTitle("Connect4");
primaryStage.setScene(scene);
primaryStage.show();
}
public GridPane makeCircleBoard(GridPane rectangleRoot, GridPane circleRoot, String colorPassed)
{
int rowPerCol[] = new int[7]; //for back end 2D array
int turn = 1; //game logic
for(int i = 0; i < ROWMAX; i++)
{
for(int j = 0; j < COLMAX; j++)
{
gridLayout[i][j] = ' ';
}
}
for(int row = 0; row < 6; row++)
{
for(int col = 0; col < 7; col++)
{
GameSlot newCircle = new GameSlot(30, Color.WHITE);
newCircle.setStrokeType(StrokeType.OUTSIDE);
newCircle.setStroke(Color.web("black", 1.0));
newCircle.setStrokeWidth(4);
newCircle.setLocationRow(row);
newCircle.setLocationCol(col);
newCircle.setOnMouseClicked(new EventHandler<MouseEvent>()
{
@Override
public void handle(MouseEvent e)
{
if(newCircle.getOccupied() == false)
{
if(playerColor.equals("Yellow"))
{
gridLayout[newCircle.getLocationRow()][newCircle.getLocationCol()] = 'Y';
playerColor = "Green";
newCircle.setFill(Color.YELLOW);
newCircle.setOccupiedTrue();
}
else
{
gridLayout[newCircle.getLocationRow()][newCircle.getLocationCol()] = 'G';
playerColor = "Yellow";
newCircle.setFill(Color.GREEN);
newCircle.setOccupiedTrue();
}
}
if(gameWon(gridLayout))
{
if(playerColor.equals("Green"))
{
final Text actiontarget = new Text();
actiontarget.setFill(Color.CRIMSON);;
actiontarget.setText("YELLOW WON!!!");
actiontarget.setScaleX(10);
actiontarget.setScaleY(10);
actiontarget.setTranslateX(rectangleRoot.getWidth() / 5);
rectangleRoot.getChildren().add(actiontarget);
}
else
{
final Text actiontarget = new Text();
actiontarget.setFill(Color.CRIMSON);;
actiontarget.setText("GREEN WON!!!");
rectangleRoot.getChildren().add(actiontarget);
actiontarget.setScaleX(10);
actiontarget.setScaleY(10);
actiontarget.setTranslateX(rectangleRoot.getWidth() / 5);
rectangleRoot.getChildren().add(actiontarget);
}
}
} //end handle()
});
//circle.setId(Integer.toString(i));
circleRoot.add(newCircle, row, col);
//newCircle.isWon(row, col);
}
}
Проверки для зеленого и желтого совпадают.Он проверяет различные направления для цветных символов, противоположных цвету, который следующий.Я не вижу ошибок для желтых в любых условиях выигрыша, и у них есть проверка индекса в gridLayout2.
Exception in thread "JavaFX Application Thread"
java.lang.IllegalArgumentException: Children: duplicate children added: parent = Grid hgap=0.0, vgap=0.0, alignment=CENTER
at javafx.scene.Parent$2.onProposedChange(Parent.java:454)
at com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:206)
at Connect4.ui.Connect4GUI$1.handle(Connect4GUI.java:128)
at Connect4.ui.Connect4GUI$1.handle(Connect4GUI.java:1)
at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
at javafx.event.Event.fireEvent(Event.java:198)
at javafx.scene.Scene$ClickGenerator.postProcess(Scene.java:3470)
at javafx.scene.Scene$ClickGenerator.access$8100(Scene.java:3398)
at javafx.scene.Scene$MouseHandler.process(Scene.java:3766)
at javafx.scene.Scene$MouseHandler.access$1500(Scene.java:3485)
at javafx.scene.Scene.impl_processMouseEvent(Scene.java:1762)
at javafx.scene.Scene$ScenePeerListener.mouseEvent(Scene.java:2494)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:381)
at com.sun.javafx.tk.quantum.GlassViewEventHandler$MouseEventNotification.run(GlassViewEventHandler.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleMouseEvent$353(GlassViewEventHandler.java:417)
at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleMouseEvent(GlassViewEventHandler.java:416)
at com.sun.glass.ui.View.handleMouseEvent(View.java:555)
at com.sun.glass.ui.View.notifyMouse(View.java:937)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$147(WinApplication.java:177)
at java.lang.Thread.run(Thread.java:748)