JavaFX-需要一个for循环来暂停并等待按钮输入

时间:2018-11-19 17:04:50

标签: java javafx

我的问题已得到解答,我的问题已解决。我已经用我的最终解决方案更新了该线程

我正在做这个学校作业(测验程序),最初我们只是需要做一个纯粹的基于文本的控制台游戏,但是我想挑战自己并尝试用JavaFX创建它,而我们才刚刚开始了解。

这是一个基于回合的问答游戏,玩家将被问到一个问题,要求他/她通过两个按钮(“真”或“假”按钮)回答是非题

游戏流程:

我正在运行一个for循环,只要ArrayList中还有问题,该循环就会继续。

理想的流程如下:

0)输入名称,然后按:开始游戏按钮 1)向玩家1提出问题。 2)通过“真”按钮或“假”按钮接收输入。 3)将输入与从数组中提取的正确答案进行比较。 4)如果正确,则用户获得1分-如果错误,则继续进入玩家2。 5)切换到第二个播放器,然后重新开始,直到ArrayList中没有其他问题为止。

正在做什么 从某种意义上说,我已经实现了“正常运行”的循环,它改变了播放器并一直持续到ArrayList中没有其他问题为止。

问题 我希望for循环通过true / false按钮等待用户输入。 但是,for循环无需等待输入即可运行整个程序。

问题 是否可以“暂停” for循环并等待两个按钮之一的输入? 您还有其他建议我解决这个问题的方法吗?

如果您愿意直接解决这个问题,我将非常高兴。不管是通过这个论坛还是给我发送进一步阅读的链接都是可以的。我似乎无法通过谷歌搜索或搜索此论坛来找到解决方案。

该代码充满了System.out.println(),以供我查看程序运行的距离。请远离这个地方。

也...关于如何改进代码的任何建议将不胜感激。 Java编程仅用了8周的时间,很想学习如何做得更聪明。

主要代码

package sample;
import javafx.application.Application;
import javafx.fxml.FXMLLoader; 
import javafx.scene.Parent; 
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception{
    Parent root = FXMLLoader.load(getClass().getResource("sample.fxml"));
    primaryStage.setTitle("Expert Quiz Game");
    primaryStage.setScene(new Scene(root, 800, 600));
    primaryStage.show();
}


public static void main(String[] args) {
    launch(args);
}
}

控制器代码

package sample;

import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;
import java.util.Random;

public class Controller {
@FXML
TextField player1;
@FXML
TextField player2;
@FXML
Text score1;
@FXML
Text score2;
@FXML
Text questionText;
@FXML
Text questionsLeft;
@FXML
Text gameStatus;
@FXML
Button startGame;
@FXML
Button buttonTrue;
@FXML
Button buttonFalse;
//@FXML
//Button nextRound;

@FXML
private void handleStartGame(ActionEvent event) {

    // ******* DECLARE VARIABLES ********

    String playerOneName = player1.getText(); //Saves the name for later use
    String playerTwoName = player2.getText(); //Saves the name for later use
    int playerOneScore = 0;
    int playerTwoScore = 0;
    Random randomQuestionNumber1 = new Random();
    //Random randomQuestionNumber2 = new Random();

    System.out.println(playerOneName + " TEST"); //To TEST if the name is saved
    System.out.println(playerTwoName + " TEST"); //To TEST if the name is saved

    // ******* DECLARE QUESTION ARRAY ********

    ArrayList<String> questionsArray = new ArrayList<String>();
    questionsArray.add("Question 1");
    questionsArray.add("Question 2");
    questionsArray.add("Question 3");
    questionsArray.add("Question 4");
    questionsArray.add("Question 5");
    questionsArray.add("Question 6");

    // ******* DECLARE ANSWER ARRAY ********

    ArrayList<String> answerArray = new ArrayList<String>();
    answerArray.add("True");
    answerArray.add("True");
    answerArray.add("False");
    answerArray.add("True");
    answerArray.add("False");
    answerArray.add("True");

    //int randomQuestionA = randomQuestionNumber1.nextInt(questionsArray.size()); //+0
    //int randomQuestionB = randomQuestionNumber2.nextInt(questionsArray.size()); //+0

    //Button clickedButton = (Button) event.getTarget();
    //String buttonLabel = clickedButton.getText();
    int player = 1;

    for (int i = 0; i < questionsArray.size(); i++) {

        if (player == 1) {

            int randomQuestionA = randomQuestionNumber1.nextInt(questionsArray.size());

            // ****** RETRIEVE AND PRESENT FIRST QUESTION ******

            System.out.println("1. Player: " + playerOneName); // WRITE TO CONSOLE THE CURRENT PLAYER * CAN BE REMOVED
            questionText.setText("Question: " + questionsArray.get(randomQuestionA)); // PRINTS QUESTION TO THE UI
            System.out.println("2. "+questionsArray.get(randomQuestionA)); // WRITES TO CONSOLE THE QUESTION * CAN BE REMOVED

            // ****** GET ANSWER FOR THE QUESTION ******

            String answerFromArray = answerArray.get(randomQuestionA); // TAKES THE ANSWER FROM THE ARRAY AND SAVES AS A NEW STRING
            System.out.println("3." + answerArray.get(randomQuestionA)); // WRITES THE ANSWER FROM THE ARRAY TO CONSOLE * CAN BE REMOVED

            // ****** TEST IF ANSWER IS TRUE ******

            String buttonTrueText = buttonTrue.getText(); // SAVES THE BUTTON TEXT AS A STRING FOR LATER COMPARISON
            String buttonFalseText = buttonFalse.getText(); // SAVES THE BUTTON TEXT AS A STRING FOR LATER COMPARISON

            // ****** IF TRUE, THEN COUNT ONE UP IN SCORE ******

            buttonTrue.setOnAction(e -> {
                System.out.println("4. Now running"); // WRITES TO CONSOLE * CAN BE REMOVED

                String buttonAnswer = " ";              // INITIALIZES THE VARIABLE WITH AN EMPTY STRING
                handleButtonAnswer(event);
                /**if (buttonText.equals("True")) {            // REGISTERS THE BUTTON PRESSED AND SAVES IT IN A VARIABLE
                    buttonAnswer = "True";
                } else if (buttonText.equals("False")) {    // REGISTERS THE BUTTON PRESSED AND SAVES IT IN A VARIABLE
                    buttonAnswer = "False";
                }**/
                if (buttonAnswer == "True" || buttonAnswer == "False") {
                    System.out.println("5. Test");
                }


                System.out.println("6. "+buttonAnswer);
                if (answerFromArray.equals(buttonAnswer)) {
                    System.out.println("7. Answer was correct - Need to count one up in score");//
                }

                score1.setText("Points: " + playerOneScore+1);
                System.out.println("8. "+playerOneScore+1);
                questionsArray.remove(randomQuestionA); // REMOVES QUESTION FROM ARRAYLIST
                answerArray.remove(randomQuestionA); // REMOVES ANSWER FROM ARRAYLIST

                int remainingQuestions = questionsArray.size();
                questionsLeft.setText(remainingQuestions + " questions left");
            });

            // ****** REMOVE THAT QUESTION + ANSWER FROM THE ARRAY  ******

            // ****** CHANGE PLAYER AND START AGAIN  ******



                player = 2;
            System.out.println("Changing to player " +player);
        } else if (player == 2) {
            //clickedButton.setText("O");

            int randomQuestionA = randomQuestionNumber1.nextInt(questionsArray.size());

            // ****** RETRIEVE AND PRESENT FIRST QUESTION ******

            System.out.println("1. Player: " + playerOneName); // WRITE TO CONSOLE THE CURRENT PLAYER * CAN BE REMOVED
            questionText.setText("Question: " + questionsArray.get(randomQuestionA)); // PRINTS QUESTION TO THE UI
            System.out.println("2. "+questionsArray.get(randomQuestionA)); // WRITES TO CONSOLE THE QUESTION * CAN BE REMOVED

            // ****** GET ANSWER FOR THE QUESTION ******

            String answerFromArray = answerArray.get(randomQuestionA); // TAKES THE ANSWER FROM THE ARRAY AND SAVES AS A NEW STRING
            System.out.println("3." + answerArray.get(randomQuestionA)); // WRITES THE ANSWER FROM THE ARRAY TO CONSOLE * CAN BE REMOVED

            // ****** TEST IF ANSWER IS TRUE ******

            String buttonTrueText = buttonTrue.getText(); // SAVES THE BUTTON TEXT AS A STRING FOR LATER COMPARISON
            String buttonFalseText = buttonFalse.getText(); // SAVES THE BUTTON TEXT AS A STRING FOR LATER COMPARISON

            // ****** IF TRUE, THEN COUNT ONE UP IN SCORE ******

            buttonTrue.setOnAction(e -> {
                System.out.println("4. Now running"); // WRITES TO CONSOLE * CAN BE REMOVED

                String buttonAnswer = " ";              // INITIALIZES THE VARIABLE WITH AN EMPTY STRING
                handleButtonAnswer(event);
                /**if (buttonText.equals("True")) {            // REGISTERS THE BUTTON PRESSED AND SAVES IT IN A VARIABLE
                 buttonAnswer = "True";
                 } else if (buttonText.equals("False")) {    // REGISTERS THE BUTTON PRESSED AND SAVES IT IN A VARIABLE
                 buttonAnswer = "False";
                 }**/
                if (buttonAnswer == "True" || buttonAnswer == "False") {
                    System.out.println("5. Test");
                }


                System.out.println("6. "+buttonAnswer);
                if (answerFromArray.equals(buttonAnswer)) {
                    System.out.println("7. Answer was correct - Need to count one up in score");//
                }

                score1.setText("Points: " + playerOneScore+1);
                System.out.println("8. "+playerOneScore+1);
                questionsArray.remove(randomQuestionA); // REMOVES QUESTION FROM ARRAYLIST
                answerArray.remove(randomQuestionA); // REMOVES ANSWER FROM ARRAYLIST

                int remainingQuestions = questionsArray.size();
                questionsLeft.setText(remainingQuestions + " questions left");
            });

            // ****** REMOVE THAT QUESTION + ANSWER FROM THE ARRAY  ******

            // ****** CHANGE PLAYER AND START AGAIN  ******

            player = 1;
            System.out.println("Changing to player " +player);

        }
    }
}
@FXML
private String handleButtonAnswer(ActionEvent event) {
    String buttonAnswer = "";
    // (1)
    Button b = (Button) event.getSource();
    // (2)
    String t = b.getText();

    System.out.println("4. the text on the button was: "+t);

    if (t.equals("True")){
        buttonAnswer = "True";  // demo
    }else if (t.equals("False")){
        buttonAnswer = "False";
    }
    return buttonAnswer;
}

}

fxml代码

设计未完成-在正确设置样式之前需要使其工作

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="794.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<children>
    <Label layoutX="225.0" layoutY="47.0" prefHeight="66.0" prefWidth="334.0" text="Java ExpertQuiz" textAlignment="CENTER">
        <font>
            <Font name="Cambria Bold" size="45.0" />
        </font>
    </Label>
    <TextField fx:id="player1" layoutX="79.0" layoutY="154.0" prefHeight="39.0" prefWidth="201.0" promptText="Enter name for player1" />
    <TextField fx:id="player2" layoutX="503.0" layoutY="154.0" prefHeight="39.0" prefWidth="222.0" promptText="Enter name for player2" />
    <Text fx:id="score1" layoutX="79.0" layoutY="232.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Ponits" />
    <Text fx:id="score2" layoutX="503.0" layoutY="232.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Points" />
    <Text fx:id="questionText" layoutX="38.0" layoutY="315.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Question" textAlignment="CENTER" wrappingWidth="717.1240234375">
        <font>
            <Font size="38.0" />
        </font>
    </Text>
    <Button fx:id="startGame" layoutX="318.0" layoutY="154.0" mnemonicParsing="false" onAction="#handleStartGame" text="Start game" />

    <Text fx:id="questionsLeft" layoutX="301.0" layoutY="505.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Questions left: " textAlignment="CENTER" wrappingWidth="191.9072265625" />
    <Text fx:id="gameStatus" layoutX="320.0" layoutY="547.0" strokeType="OUTSIDE" strokeWidth="0.0" text="The winner is:" />
    <Button fx:id="buttonTrue" layoutX="150.0" layoutY="390.0" mnemonicParsing="false" onAction="#handleButtonAnswer" text="True" />
    <Button fx:id="buttonFalse" layoutX="582.0" layoutY="390.0" mnemonicParsing="false" onAction="#handleButtonAnswer" text="False" />

</children>
</AnchorPane>

一切正常-这是我的最终解决方案

package sample;

import java.net.URL;
import java.util.*;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;
import javafx.scene.text.Text;

public class Controller {
@FXML
TextField player1;
@FXML
TextField player2;
@FXML
Text score1;
@FXML
Text score2;
@FXML
Text statusText;
@FXML
Text questionsLeft;
@FXML
Text currentPlayer;
@FXML
Button startGame;
@FXML
Button buttonTrue;
@FXML
Button buttonFalse;
@FXML
Button nextRound;

private ArrayList<String> questionsArray = new ArrayList<String>();

private ArrayList<String> answerArray = new ArrayList<String>();

private int player = 0;

private int remainingQuestions = 0;

private int playerOneScore;

private int playerTwoScore;

private String playerOneName = "";

private String playerTwoName = "";

private String answerFromArray = "";

private String answerButtonText = "";

private Random randomQuestionNumber = new Random();

private int randomQuestion = 0;


@FXML
private void handleStartGame(ActionEvent event) {

    // ******* DECLARE VARIABLES ********

    playerOneName = player1.getText(); //Saves the name for later use
    playerTwoName = player2.getText(); //Saves the name for later use

    score1.setText(playerOneName+ " has: 0 points;");
    score2.setText(playerTwoName+ " has: 0 points;");

    playerOneScore = 0;
    playerTwoScore = 0;

    System.out.println(playerOneName + " TEST"); //To TEST if the name is saved
    System.out.println(playerTwoName + " TEST"); //To TEST if the name is saved

    // ******* DECLARE QUESTION ARRAY ********

    questionsArray.add("Question 1");
    questionsArray.add("Question 2");
    questionsArray.add("Question 3");
    questionsArray.add("Question 4");
    questionsArray.add("Question 5");
    questionsArray.add("Question 6");

    // ******* DECLARE ANSWER ARRAY ********

    answerArray.add("True");
    answerArray.add("True");
    answerArray.add("False");
    answerArray.add("True");
    answerArray.add("False");
    answerArray.add("True");

    // ******* THIS IS THE PLAYER STARTING THE ROUND ******

    player = 1;

    // ****** RETRIEVE AND PRESENT FIRST QUESTION - THIS WILL ONLY BE USED TO START THE PROGRAM ******
    randomQuestion = randomQuestionNumber.nextInt(questionsArray.size()); // GENERATES A RANDOM NUMBER TO PICK A RANDOM QUESTION FROM ARRAYLIST
    statusText.setText("Question: " + questionsArray.get(randomQuestion)); // PRINTS THE RANDOM QUESTION TO THE UI

    currentPlayer.setText("Current Player: "+playerOneName);

    buttonFalse.setDisable(false);
    buttonTrue.setDisable(false);
    startGame.setDisable(true);
}

@FXML
private void handleButtonAnswer(ActionEvent event) {
    Button answerButtonClicked = (Button) event.getSource();

    answerButtonText = answerButtonClicked.getText();
    answerFromArray = answerArray.get(randomQuestion); // PICKS THE ANSWER MATCHING THE QUESTION GENERATED BY THE RANDOM NUMBER

    if (answerFromArray.equals(answerButtonText)) {
        statusText.setText("Answer was correct! You've been awarded 1 point");
        if(player == 1){
            playerOneScore = playerOneScore+1;
            score1.setText(playerOneName+ " has: "+playerOneScore+" points;");
        }else if(player == 2){
            playerTwoScore = playerTwoScore+1;
            score2.setText(playerTwoName+ " has: "+playerTwoScore+" points;");
        }
    }else{
        statusText.setText("Answer was incorrect! No point was given.");
    }
    nextRound.setDisable(false);
    buttonFalse.setDisable(true);
    buttonTrue.setDisable(true);
}

@FXML
private void handleButtonNext(ActionEvent event) {
    if(player == 1){
        player = 2;
        currentPlayer.setText("Current Player: "+playerTwoName);
    }else if(player == 2){
        player = 1;
        currentPlayer.setText("Current Player: "+playerOneName);
    }
    questionsArray.remove(randomQuestion); // REMOVES QUESTION FROM ARRAYLIST
    answerArray.remove(randomQuestion); // REMOVES ANSWER FROM ARRAYLIST
    remainingQuestions = questionsArray.size();
    questionsLeft.setText(remainingQuestions + " questions left");
    if(questionsArray.size()!=0){
        randomQuestion = randomQuestionNumber.nextInt(questionsArray.size());
        statusText.setText("Question: " + questionsArray.get(randomQuestion)); // PRINTS QUESTION TO THE UI
    }else{
        if(playerOneScore>playerTwoScore){
            questionsLeft.setText("Game is over. The winner is: "+playerOneName);
        }else if(playerTwoScore>playerOneScore){
            questionsLeft.setText("Game is over. The winner is: "+playerTwoName);
        }else{
            questionsLeft.setText("The game ended in a DRAW. ");
        }
        startGame.setDisable(false);
        buttonFalse.setDisable(true);
        buttonTrue.setDisable(true);
    }
    nextRound.setDisable(true);
    buttonFalse.setDisable(false);
    buttonTrue.setDisable(false);
}
}

fxml

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="800.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
<children>


    <Label layoutX="233.0" layoutY="46.0" prefHeight="66.0" prefWidth="334.0" text="Java ExpertQuiz" textAlignment="CENTER">
        <font>
            <Font name="Cambria Bold" size="45.0" />
        </font>
    </Label>
    <TextField fx:id="player1" layoutX="79.0" layoutY="154.0" opacity="0.5" prefHeight="39.0" prefWidth="201.0" promptText="Enter name for player 1" />
    <TextField fx:id="player2" layoutX="503.0" layoutY="154.0" opacity="0.5" prefHeight="39.0" prefWidth="222.0" promptText="Enter name for player 2" />
    <Text fx:id="score1" layoutX="114.0" layoutY="224.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Player 1 has: 0 points" />
    <Text fx:id="score2" layoutX="558.0" layoutY="224.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Player 2 has: 0 points" />
    <Text fx:id="statusText" layoutX="41.0" layoutY="315.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Question" textAlignment="CENTER" wrappingWidth="717.1240234375">
        <font>
            <Font size="38.0" />
        </font>
    </Text>
    <Button fx:id="startGame" layoutX="363.0" layoutY="161.0" mnemonicParsing="false" onAction="#handleStartGame" text="Start game" />

    <Text fx:id="questionsLeft" layoutX="304.0" layoutY="473.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Questions left: " textAlignment="CENTER" wrappingWidth="191.9072265625">
     <font>
        <Font size="18.0" />
     </font></Text>
    <Button fx:id="buttonTrue" disable="true" layoutX="150.0" layoutY="378.0" mnemonicParsing="false" onAction="#handleButtonAnswer" text="True" />
    <Button fx:id="buttonFalse" disable="true" layoutX="592.0" layoutY="378.0" mnemonicParsing="false" onAction="#handleButtonAnswer" text="False" />
    <Button fx:id="nextRound" disable="true" layoutX="354.0" layoutY="378.0" mnemonicParsing="false" onAction="#handleButtonNext" text="Next Question" />
  <Text fx:id="currentPlayer" layoutX="355.0" layoutY="260.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Current player:">
     <font>
        <Font size="14.0" />
     </font>
  </Text>
</children>

1 个答案:

答案 0 :(得分:1)

您可以将循环设为一个单独的函数,然后在放置按钮时调用它,而不是将其视为暂停循环。在这种情况下,它不再是循环,它只需要将循环的索引存储为函数外部的变量,或者可以将索引作为参数调用函数。我认为您的整个handleStartGame可以进一步细分。一个好的经验法则是,一个功能应该执行一项特定的任务,这将使程序的后续操作变得更加容易。如果您对此有任何疑问,请随时发表评论!