我正在尝试创建一个简单的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);
}
}
}
答案 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);
对于A.Sharma的评论:是的,您应该了解difference和composition之间inheritance的内容。