我目前正在为大学的作业制作TicTacToe课程。我的主板配有3x3 JTextFields,每个都有一个动作监听器。我需要做的是创建另一个将检查错误的类(例如,用户将放置一个非x或o的数字或字母)他们应该得到一个对话框,说明错误,他们试图输入的JTextField将返回空白。我将如何通过try-catch-finally方法实现错误检查?
另一个问题,我有一个GameGUI类,我也想拥有一个GameLogic类。如果游戏获胜,如何从GameLogic查看?在我的GameLogic中,我会有类似
的内容如果j1,j2和j3都是x或o,则显示对话框“x player wins”。
答案 0 :(得分:0)
我将尝试回答关于一般棋盘游戏的问题。你的面向对象思维分裂成不同的类是正确的。我通常做的是我让GameLogic包含我对游戏的逻辑和验证,以及确定游戏是否结束等等。
GameGUI类将具有GameLogic类型的实例变量,该变量在创建GameGUI类型的对象时初始化。按照我的想法,我会让GameLogic用2D阵列字符表示电路板状态。 GameGUI将用于将用户的输入转发给GameLogic,以确定游戏是否结束。 GameLogic应该抛出你要澄清的类型的异常,然后GameGUI应该尝试使用JText字段中用户的输入文本更新电路板,从GameLogic中捕获错误(如果有的话),然后重新绘制根据获得的输入向用户显示的GUI。我将在下面举例说明我的观点,虽然我不会提供TicTacToe游戏的实际实现,但你可以自己轻松完成。
public class GameLogic {
....
char[][]board;
public GameLogic() {
//initialize the board representation for game
}
public boolean gameOver() {
//determine if the game is over by checking the board 2D array
// 3 xs or os in a row, column, or diagonal should determine the game is over or if there are no more moves
}
public void move(char character, int x, int y) {
//update a certain position with a character should throw an Exception if the character is invalid or if the the character is valid but it's not the character that the user owns player1 plays with x for example but puts o.
//should also have the logic for the turns
}
...
}
public class GameGUI {
.....
GameLogic engine;
public GameGUI() {
engine = new GameLogic();
}
public void actionPerformed(ActionEvent e) {
// here you would get the co-ordinates of the clicked JTextButton
// then call the method move on the engine instance
try {
engine.move(character, x, y);
} catch(Exception e) {
//display the validation for the error that happened
}
//repaint the representation from the engine to be displayed on the GUI Frame that you are using
}
...
}
还有一件事是我会将JTextFields声明为JTextFields的2D数组,而不是单独的实例变量来镜像GameLogic类中的表示。如果你使用JButton类而不是JTextField,你也可以一起避免验证,如果轮到他并且之前没有使用过该按钮,那么用户就可以获得他在点击按钮上玩的角色。