Как будет работать условие в JOptionPane?

Я пытаюсь сделать программу викторины с двумя категориями: Java или C++. Я хочу задать вопрос с 4 ответами (множественный выбор), но я не знаю, как будет работать условие и как будет сохраняться оценка пользователей.

Приложение использует JOptionPanes для взаимодействия с пользователем.

Это то, что я имею до сих пор:

import javax.swing.JOptionPane;

public class Quiz1
{
    public static void main(String[] args) 
    {
        int score = 0;
        JOptionPane.showMessageDialog(null,"WELCOME");
        String name = JOptionPane.showInputDialog(null,"Enter Your Name: ");

        String [] Intro = new String [] {"JAVA","C++"};
        int option = JOptionPane.showOptionDialog(null, "Choose a Category" , "Menu", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, null,  Intro, Intro[0]);


        if (option == JOptionPane.YES_OPTION) // I just make YES or NO option since there are 2 choices
        {
            JOptionPane.showMessageDialog(null, "Hello "+ name + "\n Welcome to Java Quiz!");
            JOptionPane.showMessageDialog(null, "1. Please read the questions carefully \n 2. Answer all the question \n 3. Scores will be computed after the quiz \n 4. No Cheating!","RULES",JOptionPane.WARNING_MESSAGE);
            JOptionPane.showMessageDialog(null, "This Quiz consist of \n 1. Multiple Choice \n 2.Enumeration \n 3. True/False");
            JOptionPane.showMessageDialog(null,"Quiz #1: Enter the correct letter of the answer");

            // STRING OF QUESTIONS
            String[] quesJava = new String [] {"1) The JDK command to compile a class in the file Test.java is", "2)    Java was developed by_____."};


            String[] answers1 = new String[] {"A) java Test.java", "B) java Test","C) javac Test","D) javac Test.java"};
            int answer1 = JOptionPane.showOptionDialog(null, quesJava[0], "JAVA", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, answer1, answer1[0]);

            if (answer1== ???????????) // the answer is letter "D" but I don't know what will I put in here
            {
                score++;
            }

            String[] answer2 = new String[] {"A) IBM ", "B) Microsoft ","C) Sun Microsystem ","D) Oracle"};
            int answer2 = JOptionPane.showOptionDialog(null, quesJava[1], "JAVA", JOptionPane.DEFAULT_OPTION, JOptionPane.QUESTION_MESSAGE, null, answer2, answer2[0]);
            {
                if (answer2== )
                {
                    score++;
                }
            }
            JOptionPane.showMessageDialog(null,"your score is"+score);
        }
    }
}

2 ответа

Решение

Я собираюсь переписать код, который вы предоставили, чтобы сделать это немного проще...

Это конечный результат:

import java.util.Random;
import javax.swing.JOptionPane;

public class Quiz {

    /**
     * This holds all the java questions.
     */
    private static final Question[] JAVA_QUESTIONS = new Question[]{
        new Question("Who developed Java?", 2, "Google", "Sun Microsystems", "Microsoft", "Oracle"),
        //This creates the question: Who developed java with 4 answers (google, Sun, Microsoft and Oracle)
        //The correct answer is 2 (Sun).
        new Question("What modifier is used to make a variable constant?", 3, "public", "abstract", "final", "import")
    };

    /**
     * This holds all the c++ questions.
     */
    private static final Question[] CPP_QUESTIONS = new Question[]{
        new Question("C++ is?", 4, "Interpreted", "A scripting language", "The first programming language", "Compiled")
    };

    /**
     * The users score
     */
    private int score;

    /**
     * The users name
     */
    private String name;

    /**
     * What language the user selected.
     */
    private Language lang;

    private Quiz() {
        setLookAndFeel();//Makes everything look nice
        showOpeningDialogs();//Shows the welcome dialogs
        askQuestions(10);//Asks random questions 10 times depending on what language is selected. 
    }

    /**
     * Asks random questions depending on the language chosen.
     *
     * @param maxScore the number of questions to ask
     */
    private void askQuestions(int maxScore) {
        for (int i = 0; i < maxScore; i++) {
            Question q = getRandomQuestion(lang);//Gets a random question for the language chosen.
            if (ask(q)) {//Checks if they got it correct
                JOptionPane.showMessageDialog(null, "You answered correctly");//Tell them they got it correct
                score++;//Increment their score.
            } else {//If they got it wrong
                JOptionPane.showMessageDialog(null, "You answered incorrectly. The answer is: " + q.getChoices()[q.getCorrectAnswer()]);
                //Tell them they got it wrong and what the correct answer is.
            }
        }

        JOptionPane.showMessageDialog(null, "Your score is: " + score + "/" + maxScore);//At the end, tell them their score
    }

    /**
     * Asks a question and returns whether the player got it correct.
     *
     * @param question
     * @return
     */
    private boolean ask(Question question) {
        //Shows a dialog with the question and answers.
        int choice = JOptionPane.showOptionDialog(
                null,
                question.getQuestion(),
                lang.getDisplayName(),
                JOptionPane.DEFAULT_OPTION,
                JOptionPane.QUESTION_MESSAGE,
                null,
                question.getChoices(),
                question.getChoices()[0]);

        //Checks to see if the answer is correct. This is determined by the answer variable in the question object.
        if (choice == question.getCorrectAnswer()) {
            return true;
        }

        return false;
    }

    /**
     * Just makes everything look nice. You don't have to worry about this.
     */
    private void setLookAndFeel() {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if (/**What java look and feel*/
                        "Windows".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            //Very unlikely to happen
        }
    }

    /**
     * Shows the welcome dialogs and so on.
     */
    private void showOpeningDialogs() {
        name = JOptionPane.showInputDialog(null, "Welcome.\nPlease enter you name:");//Gets the users name.

        String[] langs = new String[]{Language.JAVA.getDisplayName(), Language.CPP.getDisplayName()};
        int opt = JOptionPane.showOptionDialog(null, "Please chose your language", "Menu", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, null, langs, langs[0]);//Gets the language the user chose.

        //Set the language depending on the users choice.
        switch (opt) {
            case JOptionPane.YES_OPTION:
                lang = Language.JAVA;
                break;
            default:
                lang = Language.CPP;
        }

        //The instructions.
        JOptionPane.showMessageDialog(null, "Hello " + name + "\nWelcome to the " + lang.getDisplayName() + " Quiz!");
        JOptionPane.showMessageDialog(null, "1. Please read the questions carefully \n2. Answer all the question \n3. Scores will be computed after the quiz \n4. No Cheating!", "RULES", JOptionPane.WARNING_MESSAGE);
        JOptionPane.showMessageDialog(null, "This Quiz consist of \n 1. Multiple Choice");

        //Do they want to continue
        int begin = JOptionPane.showOptionDialog(null, "Are you ready to begin?", "Menu", JOptionPane.YES_NO_OPTION, JOptionPane.PLAIN_MESSAGE, null, new String[]{"Yes", "No"}, "Yes");

        if (begin != JOptionPane.YES_OPTION) {
            System.exit(0);
        }
    }

    /**
     * Gets a random question for a language
     *
     * @param lang the language
     * @return a random question
     */
    private Question getRandomQuestion(Language lang) {
        switch (lang) {
            case JAVA://If the language is java, choose a java question.
                int random = new Random().nextInt(JAVA_QUESTIONS.length);
                return JAVA_QUESTIONS[random];
            case CPP://Else choose a C++ question.
                random = new Random().nextInt(CPP_QUESTIONS.length);
                return CPP_QUESTIONS[random];
        }

        return null;
    }

    public static void main(String[] args) {
        Quiz q = new Quiz();//Just starts the application.
    }

    /**
     * This class holds a question, the correct answer and the choices.
     */
    private static final class Question {

        /**
         * The question being asked
         */
        private final String question;

        /**
         * The correct choice. The index of the choices array.
         */
        private final int correctAnswer;

        /**
         * The 4 choices the player can choose
         */
        private final String[] choices;

        public Question(String question, int correctAnswer, String... choices) {
            if (question == null) {
                throw new NullPointerException("The question cannot be null");
            }

            if (correctAnswer < 1 || correctAnswer > 4) {
                throw new IllegalArgumentException("Correct answer must be between 0 and 5 (1 to 4)");
            }

            if (choices == null) {
                throw new NullPointerException("choices cannot be null");
            }

            if (choices.length != 4) {
                throw new NullPointerException("Choices must have 4 options");
            }

            this.question = question;
            this.correctAnswer = correctAnswer - 1;
            this.choices = choices;
        }

        /**
         * @return the question
         */
        public String getQuestion() {
            return question;
        }

        /**
         * @return the correctAnswer
         */
        public int getCorrectAnswer() {
            return correctAnswer;
        }

        /**
         * @return the choices
         */
        public String[] getChoices() {
            return choices;
        }
    }

    /**
     * Which language we're using
     */
    private enum Language {

        /**
         * The Java programming language
         */
        JAVA("Java"),
        /**
         * The C++ programming language
         */
        CPP("C++");

        //The display name for the language
        private final String displayName;

        Language(String displayName) {
            this.displayName = displayName;
        }

        public String getDisplayName() {
            return displayName;
        }
    }
}

Что он делает: задает случайные вопросы в зависимости от выбранного языка.

Как оно это делает:

Он начинается с того, что спрашивает пользователя: его имя и язык, на котором он хочет опрашиваться. Это сделано в showOpeningDialogs() метод. Информация, которую они предоставили в переменных name а также lang,

Затем он переходит к заданию вопросов (важная часть)

В самом верху класса у нас есть два массива, содержащих вопросы, один для Java (JAVA_QUESTIONS) и другой для C++ (CPP_QUESTIONS). Эти массивы содержат вопросы, ответы и правильный ответ. Чтобы добавить больше вопросов, просто добавьте новый вопрос в массив.

Метод askQuestions(int maxScore) называется. Это начинается с получения случайного вопроса из метода getRandomQuestion(Language lang)то вызывает метод ask(Question question) который показывает вопрос пользователю и возвращает его правильно. Если они получили это исправить score переменная увеличивается, и диалог говорит им, что они поняли это правильно, если они ошиблись, появится диалоговое окно, сообщающее им правильный ответ. Это повторяет сколько раз вы указали с помощью переменной maxScore (это, вероятно, должно быть меньше, чем количество вопросов в массиве).

Код достаточно хорошо документирован, чтобы показать вам, что происходит.

Вам придется немного поиграть с кодом, чтобы получить полное представление о нем, но по большей части то, что вы хотите, довольно просто.

Хорошо, если вы посмотрели на документацию JOptionPane Вы могли видеть:

public Object[] getSelectionValues():

Возвращает входные значения выбора.

А также public Object getValue():

Возвращает значение, выбранное пользователем. UNINITIALIZED_VALUE подразумевает, что пользователь еще не сделал выбор, ноль означает, что пользователь закрыл окно, ничего не выбрав. В противном случае возвращаемое значение будет одним из параметров, определенных в этом объекте.

Что делает вашу проблему легко решаемой.

Другие вопросы по тегам