我有一个基于两个文本区域的井字游戏(ta1 用于输入(标记位置),ta2 用于网格输出)。 player_input() 不起作用,因为它从 ta1 中获取空文本。如何让ta1等待输入并按ENTER键然后返回位置?我相信整个程序因此而崩溃。
import extendsFX.BaseApps;
import extendsFX.BaseConsole;
import extendsFX.BaseGraphics;
import static extendsFX.BaseApps.nL;
import java.awt.RenderingHints;
import static javafx.application.Application.launch;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import java.awt.event.KeyEvent;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
public class tictactoe extends BaseConsole{
void display_board(char[] board){
ta2.appendText(" | | " +nL);
ta2.appendText(" " + board[7] + " | " + board[8] + " | " + board[9] + " "+nL);
ta2.appendText(" | | "+nL);
ta2.appendText("-----------"+nL);
ta2.appendText(" | | "+nL);
ta2.appendText(" " + board[4] + " | " + board[5] + " | " + board[6] + " "+nL);
ta2.appendText(" | | "+nL);
ta2.appendText("-----------"+nL);
ta2.appendText(" | | "+nL);
ta2.appendText(" " + board[1] + " | " + board[2] + " | " + board[3] + " "+nL);
ta2.appendText(" | | "+nL);
}
boolean is_over(char[] board){
if (board[1] == board[2] && board[2] == board[3] && board[1] != ' ' && board[2] != ' ' && board[3] != ' ')
return true;
else if(board[4] == board[5] && board[5] == board[6] && board[4] != ' ' && board[5] != ' ' && board[6] != ' ')
return true;
else if(board[7] == board[8] && board[8] == board[9] && board[7] != ' ' && board[8] != ' ' && board[9] != ' ')
return true;
else if(board[1] == board[4] && board[4] == board[7] && board[1] != ' ' && board[4] != ' ' && board[7] != ' ')
return true;
else if(board[2] == board[5] && board[5] == board[8] && board[2] != ' ' && board[5] != ' ' && board[8] != ' ')
return true;
else if(board[3] == board[6] && board[6] == board[9] && board[3] != ' ' && board[6] != ' ' && board[9] != ' ')
return true;
else if(board[1] == board[5] && board[5] == board[9] && board[1] != ' ' && board[5] != ' ' && board[9] != ' ')
return true;
else if(board[3] == board[5] && board[5] == board[7] && board[3] != ' ' && board[5] != ' ' && board[7] != ' ')
return true;
return false;
}
void place_marker(char[] board, char marker, int position){
if (board[position] == ' ')
board[position] = marker;
else
ta2.appendText("Position is already taken! Please choose another spot"+nL);
while(true) {
int loc = player_input();
if (board[loc] == ' ')
{
board[loc] = marker;
break;
}
}
}
int player_input(){
ta2.appendText("Location: " + nL);
int location = Integer.parseInt(ta1.getText());
return location;
}
boolean is_full(char[] board){
for(int n = 1; n < 10; n++){
if (board[n] == ' ')
return false;
}
return true;
}
boolean check_for_draw(char[] board){
if(is_over(board) == false && is_full(board) == true){
ta2.appendText("Draw!"+nL);
return true;
}
return false;
}
char[] board = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};
char[] board_test = {'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'};
// public void TextArea1KeyPressed(KeyEvent evt, int input1)
// {
// if (evt.getKeyCode() == KeyEvent.VK_ENTER)
// {
// input1 = player_input();
// }
// }
@Override
public void createControls() {
super.createControls()
}
@Override
public void start(Stage stage) throws Exception {
stage.setTitle("TicTacToe");
super.start(stage);
//display_board(board_test);
while(true){
//Player1 turn
ta2.appendText("Player1's turn:"+nL);
int input1 = 0;
place_marker(board, 'X', input1);
ta2.clear();
display_board(board);
if (is_over(board) == true){
ta2.appendText("Player 1 won!"+nL);
break;
}
if(check_for_draw(board) == true)
break;
//Player2 turn
ta2.appendText("Player2's turn:"+nL);
int input2 = player_input();
place_marker(board, 'O', input2);
ta2.clear();
display_board(board);
if (is_over(board) == true){
ta2.appendText("Player 2 won!"+nL);
break;
}
if(check_for_draw(board) == true)
break;
}
}
public static void main(String[] args) {
launch();
}
}
最佳答案
这是处理您的问题的一种方法的粗略示例。首先,您的 displayBoard()
方法将抛出 IndexOutOfBounds
错误。我猜你的棋盘尺寸是 9,这使得 board[9]
超出范围。请记住,Java
中的数组
是从零开始索引的。这意味着最后一个索引是数组大小 - 1. 回到问题 -> 该程序允许用户输入一个数字并按 Enter 键。然后,它使用该数字将 X
或 O
放置在板上的该位置。请记住,数组是从零开始索引的,因此如果您希望用户能够输入 1 到 9 之间的数字,则程序必须从输入的每个数字中减去 1。此代码中的 Listener
可能正是您解决问题所需要的。它监听输入 TextArea
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
/**
*
* @author blj0011
*/
public class JavaFXApplication374 extends Application
{
TextArea taInput = new TextArea();
TextArea taBoard = new TextArea();
char[] currentBoardState = new char[9];
char turn;
@Override
public void start(Stage primaryStage)
{
taBoard.setEditable(false);//Don't allow user to alter board
turn = 'X';//Set who is going first X or O.
//Set all the character to empty space.
for (int i = 0; i < currentBoardState.length; i++) {
currentBoardState[i] = ' ';
}
displayBoard(currentBoardState);//Display initial board.
VBox root = new VBox(taInput, taBoard);//Add input and board to the scene.
//Use listener to update board state
taInput.setOnKeyReleased((event) -> {
if (event.getCode() == KeyCode.ENTER) {
String[] tempInput = taInput.getText().split("\n");
for (int i = 0; i < tempInput.length; i++) {
currentBoardState[Integer.parseInt(tempInput[i]) - 1] = turn;//Change the 0 based array to a 1 based array.
//Switch turn to other player
if (turn == 'X') {
turn = 'O';
}
else {
turn = 'X';
}
}
displayBoard(currentBoardState);//display board after update.
}
});
Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");
primaryStage.setScene(scene);
primaryStage.show();
}
public void displayBoard(char[] board)
{
StringBuilder boardString = new StringBuilder();
boardString.append(board[6]).append(" | ").append(board[7]).append(" | ").append(board[8]).append(System.lineSeparator())
.append("----------").append(System.lineSeparator())
.append(board[3]).append(" | ").append(board[4]).append(" | ").append(board[5]).append(System.lineSeparator())
.append("----------").append(System.lineSeparator())
.append(board[0]).append(" | ").append(board[1]).append(" | ").append(board[2]).append(System.lineSeparator());
taBoard.setText(boardString.toString());
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
}
关于JAVA TextArea 等待输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58301441/