java / javafx问题与静态方法& “封闭的课程”

时间:2016-04-07 18:42:45

标签: java javafx

我正在尝试创建一个简单的tic-tac-toe游戏,到目前为止一直很好,但是我遇到了以我想要的方式操纵变量的问题。

我有两个类,一个叫做Run,另一个是DrawBoard。 DrawBoard包含创建字母(X,O,板本身)的所有方法,而Run包含许多主要方法调用和单击处理程序。

我的问题是,如果我使绘图方法不是静态的,我不能引用方法来修改Run中的板状态变量(各种getter和setter),但是如果我将它们设置为静态,那么当我将它们设置为静态时尝试在Run中使用DrawBoard中的方法,但出于某种原因,只有那些封装在click处理程序中的方法(注意Drawboard.DrawMainBoard有效)。错误说“Drawboard不是一个封闭的类”。

我对Java很新,所以这可能不是最有效的做事方式,但这是我的代码。

public class Run extends Application
{
    Group root = new Group();
    Pane characters = new Pane();
    boolean isPlayerOneTurn = true;

    //Values representing state of a square
    int TL, TM, TR, ML, M, MR, BL, BM, BR;

    public void start (Stage primaryStage)
    {
        Scene mainScene = new Scene(root, 600, 600);

        DrawBoard.DrawMainBoard board = new DrawBoard.DrawMainBoard();

        clicky(mainScene);

        root.getChildren().addAll(board,characters);
        primaryStage.setTitle("Test Game");
        primaryStage.setScene(mainScene);
        primaryStage.show();

    }

    void clicky (Scene scene)
    {
        scene.setOnMousePressed(new EventHandler<MouseEvent>() {
            @Override public void handle(MouseEvent event) {
                if (!event.isControlDown())
                {
                    double mouseXPos = event.getSceneX();
                    double mouseYPos = event.getSceneY();

                    if(isPlayerOneTurn)
                    {
                        DrawBoard.drawX ex = new DrawBoard.drawX(mouseXPos, mouseYPos);
//The 2 method calls I was referring to

                        characters.getChildren().add(ex);
                        isPlayerOneTurn = false;
                   }
                    else
                    {
                        DrawBoard.drawO oh = new DrawBoard.drawO(mouseXPos, mouseYPos);
                        characters.getChildren().add(oh);
                        isPlayerOneTurn = true;
                    }
                }

            }
        });
    }
 public int getTL()
    {
        return TL;
    }
    public int getTM()
    {
        return TM;
    }
    public int getTR()
    {
        return TR;
    }
    public int getML()
    {
        return ML;
    }
    public int getM()
    {
        return M;
    }
    public int getMR()
    {
        return MR;
    }
    public int getBL()
    {
        return BL;
    }
    public int getBM()
    {
        return BM;
    }
    public int getBR()
    {
        return BR;
    }

    public void setTL(int newTL)
    {
        TL = newTL;
    }
    public void setTM(int newTM)
    {
        TM = newTM;
    }
    public void setTR(int newTR)
    {
        TR = newTR;
    }
    public void setML(int newML)
    {
        ML = newML;
    }
    public void setM(int newM)
    {
        M = newM;
    }
    public void setMR(int newMR)
    {
        MR = newMR;
    }
    public void setBL(int newBL)
    {
        BL = newBL;
    }
    public void setBM(int newBM)
    {
        BM = newBM;
    }
    public void setBR(int newBR)
    {
        BR = newBR;
    }
}



public class DrawBoard extends Run
{

    public static class DrawMainBoard extends Pane
    {
        public DrawMainBoard()
        {
            Line v1 = new Line();
            Line v2 = new Line();
            Line h1 = new Line();
            Line h2 = new Line();

            v1.setStartX(200);
            v1.setStartY(0);
            v1.setEndX(200);
            v1.setEndY(600);

            v2.setStartX(400);
            v2.setStartY(0);
            v2.setEndX(400);
            v2.setEndY(600);

            h1.setStartX(0);
            h1.setStartY(200);
            h1.setEndX(600);
            h1.setEndY(200);

            h2.setStartX(0);
            h2.setStartY(400);
            h2.setEndX(600);
            h2.setEndY(400);

            getChildren().addAll(v1,v2,h1,h2);
        }
    }

    public class drawX extends Pane
    {
        public drawX(double mouseXPos, double mouseYPos)
        {
            Line x1 = new Line();
            Line x2 = new Line();
            //Top Left
            if(mouseXPos < 200 && mouseYPos < 200)
            {
                if(getTL() != 1 && getTL() != 2)
                {
                    x1.setStartX(50);
                    x1.setStartY(50);
                    x1.setEndX(150);
                    x1.setEndY(150);

                    x2.setStartX(150);
                    x2.setStartY(50);
                    x2.setEndX(50);
                    x2.setEndY(150);
                    setTL(1);
                }

            }
            //Top middle
            else if (mouseXPos > 200 && mouseXPos < 400 && mouseYPos < 200 )
            {
                if(getTM() != 1 && getTM() != 2)
                {
                    x1.setStartX(250);
                    x1.setStartY(50);
                    x1.setEndX(350);
                    x1.setEndY(150);

                    x2.setStartX(350);
                    x2.setStartY(50);
                    x2.setEndX(250);
                    x2.setEndY(150);
                    setTM(1);
                }
            }
            //Top right
            else if (mouseXPos > 400 && mouseYPos < 200)
            {
                if(getTR() != 1 && getTR() != 2)
                {
                    x1.setStartX(450);
                    x1.setStartY(50);
                    x1.setEndX(550);
                    x1.setEndY(150);

                    x2.setStartX(550);
                    x2.setStartY(50);
                    x2.setEndX(450);
                    x2.setEndY(150);
                    setTR(1);
                }
            }
            //Middle left
            else if (mouseXPos < 200 && mouseYPos > 200 && mouseYPos < 400)
            {
                x1.setStartX(50);
                x1.setStartY(250);
                x1.setEndX(150);
                x1.setEndY(350);

                x2.setStartX(150);
                x2.setStartY(250);
                x2.setEndX(50);
                x2.setEndY(350);
                setML(1);
            }
            //middle
            else if (mouseXPos > 200 && mouseXPos < 400 &mouseYPos > 200 && mouseYPos < 400)
            {
                x1.setStartX(250);
                x1.setStartY(250);
                x1.setEndX(350);
                x1.setEndY(350);

                x2.setStartX(350);
                x2.setStartY(250);
                x2.setEndX(250);
                x2.setEndY(350);
                setM(1);
            }
            //middle right
            else if (mouseXPos > 400 && mouseYPos > 200 && mouseYPos < 400)
            {
                x1.setStartX(450);
                x1.setStartY(250);
                x1.setEndX(550);
                x1.setEndY(350);

                x2.setStartX(550);
                x2.setStartY(250);
                x2.setEndX(450);
                x2.setEndY(350);
                setMR(1);
            }
            //bottom left
            else if (mouseXPos < 200 && mouseYPos > 400)
            {
                x1.setStartX(50);
                x1.setStartY(450);
                x1.setEndX(150);
                x1.setEndY(550);

                x2.setStartX(150);
                x2.setStartY(450);
                x2.setEndX(50);
                x2.setEndY(550);
                setBL(1);
            }
            //bottom middle
            else if (mouseXPos > 200 && mouseXPos < 400 && mouseYPos > 400)
            {
                x1.setStartX(250);
                x1.setStartY(450);
                x1.setEndX(350);
                x1.setEndY(550);

                x2.setStartX(350);
                x2.setStartY(450);
                x2.setEndX(250);
                x2.setEndY(550);
                setBM(1);
            }
            //bottom right
            else if(mouseXPos > 400 && mouseYPos > 400)
            {
                x1.setStartX(450);
                x1.setStartY(450);
                x1.setEndX(550);
                x1.setEndY(550);

                x2.setStartX(550);
                x2.setStartY(450);
                x2.setEndX(450);
                x2.setEndY(550);
                setBR(1);
            }
            getChildren().addAll(x1,x2);

        }
    }

    public class drawO extends Pane
    {

        public drawO (double mouseXPos, double mouseYPos)
        {
            Circle circle = new Circle(75);

            //Top Left
            if(mouseXPos < 200 && mouseYPos < 200)
            {
                circle.setCenterX(100);
                circle.setCenterY(100);
            }
            //Top middle
            else if (mouseXPos > 200 && mouseXPos < 400 && mouseYPos < 200 )
            {
                circle.setCenterX(300);
                circle.setCenterY(100);
            }
            //Top right
            else if (mouseXPos > 400 && mouseYPos < 200)
            {
                circle.setCenterX(500);
                circle.setCenterY(100);
            }
            //Middle left
            else if (mouseXPos < 200 && mouseYPos > 200 && mouseYPos < 400)
            {
                circle.setCenterX(100);
                circle.setCenterY(300);
            }
            //middle
            else if (mouseXPos > 200 && mouseXPos < 400 &mouseYPos > 200 && mouseYPos < 400)
            {
               circle.setCenterX(300);
                circle.setCenterY(300);
            }
            //middle right
            else if (mouseXPos > 400 && mouseYPos > 200 && mouseYPos < 400)
            {
                circle.setCenterX(500);
                circle.setCenterY(300);
            }
            //bottom left
            else if (mouseXPos < 200 && mouseYPos > 400)
            {
                circle.setCenterX(100);
                circle.setCenterY(500);
            }
            //bottom middle
            else if (mouseXPos > 200 && mouseXPos < 400 && mouseYPos > 400)
            {
               circle.setCenterX(300);
                circle.setCenterY(500);
            }
            //bottom right
            else if(mouseXPos > 400 && mouseYPos > 400)
            {
               circle.setCenterX(500);
                circle.setCenterY(500);
            }
            getChildren().addAll(circle);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

为什么DrawBoard会扩展Run?这对我来说毫无意义。删除它。

DrawBoard board;成为Run的成员。

你甚至不需要DrawMainBoard课程,它也应该是DrawBoard的简单函数:

public Pane drawMainBoard()
{ ... your code here ... }

另一点是因为这种类嵌套真的很奇怪:

有这样一个班级public class drawO extends Pane的背后是什么?

此方法可以是DrawBoard的方法:

public Pane drawO(double mouseXPos, double mouseYPos)

drawX也是如此。

这样: 运行成员drawBoard,您可以将主板添加为:root.getChildren().addAll(drawBoard.drawMainBoard(),characters);,您可以像drawBoard.drawO(x,y);

那样绘制X和O

对于A.Sharma的评论:是的,您应该了解differencecomposition之间inheritance的内容。