提问人:Dawa 提问时间:7/3/2021 更新时间:7/3/2021 访问量:98
如何从事件中获取数据到主函数?
How to get data from events to the main function?
问:
我目前正在创建一个国际象棋游戏。这也是我尝试创建 gui 的第一个项目,所以请告诉我是否有更简洁的方法来编写此代码。因此,我使用 java swing 创建了 64 个按钮,这些按钮在按下时会将其坐标打印到控制台。
我还设法在我的 main 方法中创建一个循环,以使用控制台输入运行我的国际象棋引擎。我的问题是我不知道如何将坐标从我的 eventListeners 获取到我的主循环,以便它移动一段。
我添加了主循环和操作执行方法。希望这足以解决我的挣扎。
感谢所有花时间帮助我的人!
public static void main(String[] args) throws IOException{
int[] coordinates = new int[4];
Player player = new Player();
Board board = new Board();
Input input = new Input();
board.showBoard();
// here I give the gui object the references to my input and board objects
// so that it can call their methods and thereby give the information to them
Gui gui = new Gui(board, input);
while(!player.isCheckmate(board)) {
coordinates = input.getInput(board, player).clone();// get coordinates xpos, ypos, xposnew, yposnew
Piece activePiece = board.getPiece(coordinates[0], coordinates[1]); // get the chosen piece
if(!activePiece.isLegalMove(board, coordinates[2], coordinates[3]))// move the active piece to chosen destination
{
System.out.println("No legal move. Try again");
continue;
}
activePiece.move(board, coordinates[2], coordinates[3]);
player.switchPlayerTurn();
player.isCheckmate(board);
board.showBoard();
}
}
下面是 actionPerformed 方法
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
// TODO Auto-generated method stub
JButton button = (JButton) e.getSource();
String[] numbers = button.getActionCommand().split("");
if(coordinates[2] !=-1)
{
for(int i = 0; i < coordinates.length; i++)
coordinates[i] = -1;
}
if(coordinates[0] == -1) {
coordinates[0] = Integer.parseInt(numbers[0]);
coordinates[1] = Integer.parseInt(numbers[1]);
} else if(coordinates[2] == -1) {
coordinates[2] = Integer.parseInt(numbers[0]);
coordinates[3] = Integer.parseInt(numbers[1]);
}
System.out.println("x coodinate = " + Integer.toString(coordinates[0]));
System.out.println("y coodinate = " + Integer.toString(coordinates[1]));
System.out.println("destination x coodinate = " + Integer.toString(coordinates[2]));
System.out.println("destination y coodinate = " + Integer.toString(coordinates[3]));
}
答:
2赞
Tim Hunter
7/3/2021
#1
关于将数据从事件传递到主事件,您需要携带对管理坐标的对象的引用(我假设这是您的对象)。您需要添加如下内容:Piece
Board
class Board {
//Other class stuff
public void setPiecePosition(Piece targetPiece, Point coordPoint) {
//Code to update your tracking
}
}
然后将如下内容添加到您的事件中:
board.setPiecePosition(targetPiece, new Point(xCoord, yCoord));
评论
0赞
Dawa
7/3/2021
感谢 Tim Hunter 提供的解决方案和教程链接。两者都非常有帮助!
1赞
Tim Hunter
7/3/2021
@Dawa 建议...仔细考虑责任划分。应该关心什么?管理与其他对象的交互是对象的工作,还是对象的工作?是否关心它的位置或关心?句柄坐标和对象应该占据它们,还是应该将其委托给对象?这些问题没有错误的答案,只是在整体设计方法中需要考虑的问题。Piece
Piece
Piece
Board
Piece
Board
Board
Tile
0赞
Dawa
7/3/2021
再次感谢。我没有花太多心思。我会在我的下一个项目中牢记这一点。再次感谢!
评论
Piece
Piece