Triva game

The problem

In this programming challenge you will create a simple trivia game for two players. The program will work like this:

  • Starting with player 1, each player gets a turn at answering five trivia questions. (There are a total of 10 questions.) When a question is displayed, four possible answers are also displayed. Only one of the answers is correct, and if the player selects the correct answer he or she earns a point.
  • After answers have been selected for all of the questions, the program displays the number of points earned by each player and declares the player with the highest number of points the winner.

In this program you will design a Question class to hold the data for a trivia question. The Question class should have member variables for the following data:

  • A trivia question
  • Possible answer#1, #2, #3, and #4
  • The number of the correct answer (1, 2, 3, or 4)

The Question class should have appropriate constructor(s), accessor, and mutator functions.

The program should create an array of 10 Question objects, one for each trivia question. Make up your own trivia questions on the subject or subject of your choice for the objects.

Breaking it down

List<Question> questions;

public List<Question> getQuestions() {
    return questions;
}

TrivaGame() throws IOException {
    questions = readQuestions();
}

/**
 * This class represents question object
 */
class Question {

    private String question;
    private List<String> possibleAnswers;
    private int answer;

    @Override
    public String toString() {
        return "Question [question=" + question + ", possibleAnswers="
                + possibleAnswers + ", answer=" + answer + "]";
    }
}


/**
 * This class represents player object
 */
class Player {

    int playerNumber;
    int points;

}

/**
 * Function will accept a string based on the following format and transform
 * it into a Question object
 */
Function<String, Question> mapLineToQuestion = new Function<String, Question>() {

    public Question apply(String line) {

        Question question = new Question();

        List<String> questionPieces = Splitter.on("|").trimResults()
                .omitEmptyStrings().splitToList(line);

        question.question = questionPieces.get(0);
        question.possibleAnswers = Splitter.on(",").trimResults()
                .omitEmptyStrings().splitToList(questionPieces.get(1));
        question.answer = Integer.parseInt(questionPieces.get(2));

        return question;
    }
};

/**
 * Method will read each line of a file then mapping it to a question
 * object.
 * 
 * @return
 * @throws IOException
 */
public List<Question> readQuestions() throws IOException {

    List<Question> questions = Files
            .lines(Paths
                    .get("src/main/resources/com/levelup/java/exercises/beginner/trivia.txt"))
            .map(mapLineToQuestion).collect(Collectors.toList());

    return questions;
}

/**
 * Method should generate random number based total number of questions
 * 
 * @param numberOfQuestions
 * @return
 */
public static int getRandomQuestionNumber(int numberOfQuestions) {

    Random random = new Random();
    OptionalInt questionNumber = random.ints(1, numberOfQuestions)
            .findFirst();

    return questionNumber.getAsInt();
}

/**
 * Method should display a question passed
 * 
 * @param q
 * @param playerNum
 */
public static void displayQuestion(Question q, int playerNum) {

    // Display the player number.
    System.out.println("Question for player #" + playerNum);
    System.out.println("------------------------");

    // Display the question.
    System.out.println(q.question);
    for (int i = 0; i < q.possibleAnswers.size(); i++) {
        System.out.println((i + 1) + ". " + q.possibleAnswers.get(i));
    }
}

/**
 * Method will output summary stats and declare a winner
 * 
 * @param players
 */
public static void showGameResults(Player[] players) {

    // Display the stats.
    System.out.println("Game Over!");
    System.out.println("---------------------");
    System.out.println("Player 1's points: " + players[0].points);
    System.out.println("Player 2's points: " + players[1].points);

    // Declare the winner.
    if (players[0].points > players[1].points) {
        System.out.println("Player 1 wins!");
    } else if (players[1].points > players[0].points) {
        System.out.println("Player 2 wins!");
    } else {
        System.out.println("It's a TIE!");
    }

}

static int NUMBER_OF_PLAYERS = 2;
static int NUMBER_OF_CHANCES = 5;

public static void main(String args[]) throws IOException {

    // Initiate trivia game
    TrivaGame trivaGame = new TrivaGame();

    Scanner keyboard = new Scanner(System.in);

    // how many total questions exist
    int numberOfQuestions = trivaGame.getQuestions().size();

    // create array of players
    Player[] players = { trivaGame.new Player(), trivaGame.new Player() };

    // Play the game for each player defined and number of chances
    for (int x = 0; x < players.length; x++) {

        Player currentPlayer = players[x];

        for (int i = 0; i < NUMBER_OF_CHANCES; i++) {

            // get random question
            Question question = trivaGame.getQuestions().get(
                    getRandomQuestionNumber(numberOfQuestions));

            displayQuestion(question, x + 1);

            // ask user to enter question
            System.out.print("Enter the number of the correct answer: ");
            int currentAnswer = keyboard.nextInt();

            // answer logic
            if (currentAnswer == question.answer) {
                // The player's chosen answer is correct.
                System.out.println("Correct!\n");
                currentPlayer.points += 1;
            } else {

                // The player chose the wrong answer.
                System.out.println("Sorry, that is incorrect. The correct "
                        + "answer is " + question.answer + ".\n");
            }

        }
    }

    // close keyboard
    keyboard.close();

    // display game results
    showGameResults(players);
}

Output

Question for player #1
------------------------
Vodka, Galliano and orange juice are used to make which classic cocktail?
1. HARVEY WALLBANGER
2. Old Fashioned
3. Manhattan
4. Bloody Mary
Enter the number of the correct answer: 1
Correct!

Question for player #1
------------------------
Consecrated in 1962, where is the Cathedral Church of St Michael?
1. COVENTRY
2. Church of Hope
3. Sagrada Familia
4. Notre Dame de Paris
Enter the number of the correct answer: 1
Correct!

Question for player #1
------------------------
How many tentacles does a squid have?
1. TEN
2. Eight
3. Nine
4. Five
5. Four
Enter the number of the correct answer: 1
Correct!

Question for player #1
------------------------
Which American state is nearest to the former Soviet Union?
1. Hawaii
2. ALASKA
3. California
4. Florida
Enter the number of the correct answer: 1
Sorry, that is incorrect. The correct answer is 2.

Question for player #1
------------------------
In which year did Foinavon win the Grand National?
1. 1967
2. 1988
3. 2900
4. 1340
Enter the number of the correct answer: 2
Sorry, that is incorrect. The correct answer is 1.

Question for player #2
------------------------
In which year did Foinavon win the Grand National?
1. 1967
2. 1988
3. 2900
4. 1340
Enter the number of the correct answer: 1
Correct!

Question for player #2
------------------------
In which year did Foinavon win the Grand National?
1. 1967
2. 1988
3. 2900
4. 1340
Enter the number of the correct answer: 1
Correct!

Question for player #2
------------------------
Which American state is nearest to the former Soviet Union?
1. Hawaii
2. ALASKA
3. California
4. Florida
Enter the number of the correct answer: 1
Sorry, that is incorrect. The correct answer is 2.

Question for player #2
------------------------
How many tentacles does a squid have?
1. TEN
2. Eight
3. Nine
4. Five
5. Four
Enter the number of the correct answer: 1
Correct!

Question for player #2
------------------------
Vodka, Galliano and orange juice are used to make which classic cocktail?
1. HARVEY WALLBANGER
2. Old Fashioned
3. Manhattan
4. Bloody Mary
Enter the number of the correct answer: 1
Correct!

Game Over!
---------------------
Player 1's points: 3
Player 2's points: 4
Player 2 wins!

Level Up

  • Change the program to allow the user to enter the number of users that will play the game. Which methods will this require you to refacor and adjust for multiplayer game?