Попытка использовать игру JavaFX connect4 с сервером для школы - PullRequest
0 голосов
/ 03 октября 2018

У меня есть оставшийся школьный проект, который я не смог получить, как планировалось.У класса была текстовая игра 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)

1 Ответ

0 голосов
/ 03 октября 2018

Вы получаете ошибку IllegalArgumentException, говорящую о том, что вы пытаетесь добавить Node к одному и тому же Parent более одного раза - это не разрешено в JavaFX.Если вы посмотрите на трассировку стека, вы увидите, где в вашем коде это происходит.

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)

Первый кадр, который не является внутренним кодом JavaFX, - это Connect4.ui.Connect4GUI$1.handle(Connect4GUI.java:128), в котором указано, что ошибка происходит в сети.128 вашего Connect4GUI класса внутри метода с именем handle.Вы не указываете, какая строка является строкой 128, но на основе вашего кода и вышеуказанной информации, которую мы знаем, чтобы сосредоточиться на этой части вашего кода:

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()
});

Глядя на код, проблема может бытьнаходится внутри блока else, который находится внутри блока if(gameWon(gridLayout)):

else
{
    final Text actiontarget = new Text();
    actiontarget.setFill(Color.CRIMSON);;
    actiontarget.setText("GREEN WON!!!");
    rectangleRoot.getChildren().add(actiontarget); // DUPLICATE LINE BELOW
    actiontarget.setScaleX(10);
    actiontarget.setScaleY(10);
    actiontarget.setTranslateX(rectangleRoot.getWidth() / 5);
    rectangleRoot.getChildren().add(actiontarget); // DUPLICATE: Must be line 128
}

Удалите одно из этих утверждений, и код больше не должен бросать IllegalArgumentException.Заметьте, что трассировка стека, кстати, указывает вам прямо на ошибочную строку кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...