From 021617107cff69354b3936021a7a521f510abffa Mon Sep 17 00:00:00 2001 From: Keychu00 Date: Sat, 7 Dec 2024 17:26:39 -0800 Subject: [PATCH 1/3] Mahad's code review of quiz game --- src/main/java/edu/sdccd/cisc190/Main.java | 10 ++++++++++ src/main/java/edu/sdccd/cisc190/{ => game}/Game.java | 10 +++++++--- .../java/edu/sdccd/cisc190/{ => game}/QuizGame.java | 8 +++++++- .../cisc190/{ => question}/MultipleChoiceQuestion.java | 2 +- .../edu/sdccd/cisc190/{ => question}/Question.java | 2 +- .../cisc190/{ => question}/TrueFalseQuestion.java | 2 +- src/test/java/edu/sdccd/cisc190/GameTest.java | 2 ++ .../edu/sdccd/cisc190/MultipleChoiceQuestionTest.java | 1 + .../edu/sdccd/cisc190/QuizGameIntegrationTest.java | 1 + src/test/java/edu/sdccd/cisc190/QuizGameTest.java | 1 + .../java/edu/sdccd/cisc190/TrueFalseQuestionTest.java | 1 + 11 files changed, 33 insertions(+), 7 deletions(-) rename src/main/java/edu/sdccd/cisc190/{ => game}/Game.java (81%) rename src/main/java/edu/sdccd/cisc190/{ => game}/QuizGame.java (92%) rename src/main/java/edu/sdccd/cisc190/{ => question}/MultipleChoiceQuestion.java (97%) rename src/main/java/edu/sdccd/cisc190/{ => question}/Question.java (96%) rename src/main/java/edu/sdccd/cisc190/{ => question}/TrueFalseQuestion.java (97%) diff --git a/src/main/java/edu/sdccd/cisc190/Main.java b/src/main/java/edu/sdccd/cisc190/Main.java index a4aa6d7..2dd4742 100644 --- a/src/main/java/edu/sdccd/cisc190/Main.java +++ b/src/main/java/edu/sdccd/cisc190/Main.java @@ -1,5 +1,9 @@ package edu.sdccd.cisc190; +import edu.sdccd.cisc190.game.QuizGame; +import edu.sdccd.cisc190.question.MultipleChoiceQuestion; +import edu.sdccd.cisc190.question.Question; +import edu.sdccd.cisc190.question.TrueFalseQuestion; import javafx.application.Application; import javafx.application.Platform; import javafx.scene.Scene; @@ -110,6 +114,7 @@ public void startGame() { *

*/ private void showQuestion() { + //TODO: Create an exception for out-of-bounds index. if (currentQuestionIndex >= quizGame.getQuestions().size()) { endGame(); return; @@ -171,6 +176,11 @@ public void startTimer() { }, 0, 1, TimeUnit.SECONDS); } + + //TODO: alert the user after every minute passes by + + //TODO: Change the font color of the timer to red when the time reaches 30 seconds left + //TODO: could add some color to the game /** * Ends the quiz game and displays the final score. *

diff --git a/src/main/java/edu/sdccd/cisc190/Game.java b/src/main/java/edu/sdccd/cisc190/game/Game.java similarity index 81% rename from src/main/java/edu/sdccd/cisc190/Game.java rename to src/main/java/edu/sdccd/cisc190/game/Game.java index 166f3d4..b4ffe92 100644 --- a/src/main/java/edu/sdccd/cisc190/Game.java +++ b/src/main/java/edu/sdccd/cisc190/game/Game.java @@ -1,5 +1,5 @@ -package edu.sdccd.cisc190; +package edu.sdccd.cisc190.game; /** * Abstract base class that provides the structure for any game. *

@@ -9,7 +9,7 @@ *

*/ public abstract class Game { - +//Space out Javdocs and code for better style and readability/understanding// /** * The name of the game. */ @@ -31,20 +31,24 @@ public Game(String gameName) { this.gameName = gameName; this.isRunning = false; } + //TODO: create a logger to log instead of using system.out /** * Starts the game by setting the status to running and printing a start message. */ public void startGame() { isRunning = true; - System.out.println(gameName + " has started!"); + System.out.println(gameName + "%s has started!" gameName); } /** * Ends the game by setting the status to not running and printing an end message. */ public void endGame() { isRunning = false; + + //TODO: use a formatted print statement just like in startGame() System.out.println(gameName + " has ended."); } + /** * Checks whether the game is currently running. * diff --git a/src/main/java/edu/sdccd/cisc190/QuizGame.java b/src/main/java/edu/sdccd/cisc190/game/QuizGame.java similarity index 92% rename from src/main/java/edu/sdccd/cisc190/QuizGame.java rename to src/main/java/edu/sdccd/cisc190/game/QuizGame.java index e8c3fbe..bd6428c 100644 --- a/src/main/java/edu/sdccd/cisc190/QuizGame.java +++ b/src/main/java/edu/sdccd/cisc190/game/QuizGame.java @@ -1,4 +1,8 @@ -package edu.sdccd.cisc190; +package edu.sdccd.cisc190.game; + +import edu.sdccd.cisc190.question.MultipleChoiceQuestion; +import edu.sdccd.cisc190.question.Question; +import edu.sdccd.cisc190.question.TrueFalseQuestion; import java.io.*; import java.util.ArrayList; @@ -80,6 +84,8 @@ public void saveHighScore(int score) throws IOException { writer.close(); } + + //TODO: create a leaderboard that stores the user's best time/high scores /** * Returns the list of questions in the game. * diff --git a/src/main/java/edu/sdccd/cisc190/MultipleChoiceQuestion.java b/src/main/java/edu/sdccd/cisc190/question/MultipleChoiceQuestion.java similarity index 97% rename from src/main/java/edu/sdccd/cisc190/MultipleChoiceQuestion.java rename to src/main/java/edu/sdccd/cisc190/question/MultipleChoiceQuestion.java index 75f32fd..c0217e8 100644 --- a/src/main/java/edu/sdccd/cisc190/MultipleChoiceQuestion.java +++ b/src/main/java/edu/sdccd/cisc190/question/MultipleChoiceQuestion.java @@ -1,4 +1,4 @@ -package edu.sdccd.cisc190; +package edu.sdccd.cisc190.question; /** * Represents a multiple-choice question. diff --git a/src/main/java/edu/sdccd/cisc190/Question.java b/src/main/java/edu/sdccd/cisc190/question/Question.java similarity index 96% rename from src/main/java/edu/sdccd/cisc190/Question.java rename to src/main/java/edu/sdccd/cisc190/question/Question.java index 1c178dd..21a164d 100644 --- a/src/main/java/edu/sdccd/cisc190/Question.java +++ b/src/main/java/edu/sdccd/cisc190/question/Question.java @@ -1,4 +1,4 @@ -package edu.sdccd.cisc190; +package edu.sdccd.cisc190.question; /** * Represents a general question in a quiz or game. diff --git a/src/main/java/edu/sdccd/cisc190/TrueFalseQuestion.java b/src/main/java/edu/sdccd/cisc190/question/TrueFalseQuestion.java similarity index 97% rename from src/main/java/edu/sdccd/cisc190/TrueFalseQuestion.java rename to src/main/java/edu/sdccd/cisc190/question/TrueFalseQuestion.java index 4774d36..dce0cae 100644 --- a/src/main/java/edu/sdccd/cisc190/TrueFalseQuestion.java +++ b/src/main/java/edu/sdccd/cisc190/question/TrueFalseQuestion.java @@ -1,4 +1,4 @@ -package edu.sdccd.cisc190; +package edu.sdccd.cisc190.question; /** * Represents a "True/False" type question in the quiz game. diff --git a/src/test/java/edu/sdccd/cisc190/GameTest.java b/src/test/java/edu/sdccd/cisc190/GameTest.java index 4b68bda..19998ee 100644 --- a/src/test/java/edu/sdccd/cisc190/GameTest.java +++ b/src/test/java/edu/sdccd/cisc190/GameTest.java @@ -1,5 +1,7 @@ package edu.sdccd.cisc190; +import edu.sdccd.cisc190.game.Game; +import edu.sdccd.cisc190.game.QuizGame; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/edu/sdccd/cisc190/MultipleChoiceQuestionTest.java b/src/test/java/edu/sdccd/cisc190/MultipleChoiceQuestionTest.java index c0efee6..996a156 100644 --- a/src/test/java/edu/sdccd/cisc190/MultipleChoiceQuestionTest.java +++ b/src/test/java/edu/sdccd/cisc190/MultipleChoiceQuestionTest.java @@ -1,5 +1,6 @@ package edu.sdccd.cisc190; +import edu.sdccd.cisc190.question.MultipleChoiceQuestion; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/edu/sdccd/cisc190/QuizGameIntegrationTest.java b/src/test/java/edu/sdccd/cisc190/QuizGameIntegrationTest.java index a119f56..8c90c88 100644 --- a/src/test/java/edu/sdccd/cisc190/QuizGameIntegrationTest.java +++ b/src/test/java/edu/sdccd/cisc190/QuizGameIntegrationTest.java @@ -1,5 +1,6 @@ package edu.sdccd.cisc190; +import edu.sdccd.cisc190.game.QuizGame; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; diff --git a/src/test/java/edu/sdccd/cisc190/QuizGameTest.java b/src/test/java/edu/sdccd/cisc190/QuizGameTest.java index e8bf338..df4011e 100644 --- a/src/test/java/edu/sdccd/cisc190/QuizGameTest.java +++ b/src/test/java/edu/sdccd/cisc190/QuizGameTest.java @@ -1,5 +1,6 @@ package edu.sdccd.cisc190; +import edu.sdccd.cisc190.game.QuizGame; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.io.IOException; diff --git a/src/test/java/edu/sdccd/cisc190/TrueFalseQuestionTest.java b/src/test/java/edu/sdccd/cisc190/TrueFalseQuestionTest.java index dbd71c4..001f1f5 100644 --- a/src/test/java/edu/sdccd/cisc190/TrueFalseQuestionTest.java +++ b/src/test/java/edu/sdccd/cisc190/TrueFalseQuestionTest.java @@ -1,5 +1,6 @@ package edu.sdccd.cisc190; +import edu.sdccd.cisc190.question.TrueFalseQuestion; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; From f65c5255a3783072eb990b46134f95ae9f421611 Mon Sep 17 00:00:00 2001 From: Keychu00 Date: Sat, 7 Dec 2024 17:28:56 -0800 Subject: [PATCH 2/3] Mahad's code review of quiz game (fixed error) --- src/main/java/edu/sdccd/cisc190/game/Game.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/edu/sdccd/cisc190/game/Game.java b/src/main/java/edu/sdccd/cisc190/game/Game.java index b4ffe92..2fd98bc 100644 --- a/src/main/java/edu/sdccd/cisc190/game/Game.java +++ b/src/main/java/edu/sdccd/cisc190/game/Game.java @@ -37,7 +37,7 @@ public Game(String gameName) { */ public void startGame() { isRunning = true; - System.out.println(gameName + "%s has started!" gameName); + System.out.printf("%s has started!", gameName); } /** * Ends the game by setting the status to not running and printing an end message. From cbad4cd71b0d4079ab08b2e62d715a97c1d43ffd Mon Sep 17 00:00:00 2001 From: Keychu00 Date: Sat, 7 Dec 2024 18:04:03 -0800 Subject: [PATCH 3/3] Mahad's code review of quiz game (fixed error) --- .../java/edu/sdccd/cisc190/game/Game.java | 4 +++ .../java/edu/sdccd/cisc190/game/QuizGame.java | 29 ++++++++++++------- .../edu/sdccd/cisc190/question/Question.java | 3 ++ 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/main/java/edu/sdccd/cisc190/game/Game.java b/src/main/java/edu/sdccd/cisc190/game/Game.java index 2fd98bc..dd44c40 100644 --- a/src/main/java/edu/sdccd/cisc190/game/Game.java +++ b/src/main/java/edu/sdccd/cisc190/game/Game.java @@ -19,6 +19,10 @@ public abstract class Game { */ private boolean isRunning; + //TODO: Use protected visibility for 'isRunning' if subclasses need access. Otherwise, leave it private + // This could be protected depending on design needs. + + /** diff --git a/src/main/java/edu/sdccd/cisc190/game/QuizGame.java b/src/main/java/edu/sdccd/cisc190/game/QuizGame.java index bd6428c..171f72b 100644 --- a/src/main/java/edu/sdccd/cisc190/game/QuizGame.java +++ b/src/main/java/edu/sdccd/cisc190/game/QuizGame.java @@ -15,12 +15,19 @@ * for managing quiz questions and scores, loading questions from a file, and saving high scores. *

*/ + +//TODO: Integrate JavaFX UI to display questions and collect answers interactively. + public class QuizGame extends Game { + //TODO: Implement a game timer using a background thread to track the elapsed time. +// Example: Use Thread.sleep() in a loop and update the timer in the console or GUI. /** * A list of questions for the quiz game. */ private final List questions; + // TODO: Consider using an array if the number of questions is fixed. + /** * The player's current score in the game. @@ -52,21 +59,21 @@ public QuizGame(String gameName) { * @param filePath the path to the file containing questions * @throws IOException if an I/O error occurs while reading the file */ + // explination is to Catch and handle exceptions gracefully. Update the UI to notify users of issues and allow retrying. public void loadQuestions(String filePath) throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(filePath)); - String line; - - while ((line = reader.readLine()) != null) { - String[] parts = line.split(";"); - if (parts[0].equalsIgnoreCase("MC")) { - questions.add(new MultipleChoiceQuestion(parts[1], parts[2], parts[3].split(","))); - } else if (parts[0].equalsIgnoreCase("TF")) { - questions.add(new TrueFalseQuestion(parts[1], parts[2])); + try (BufferedReader reader = new BufferedReader(new FileReader(filePath))) { + String line; + while ((line = reader.readLine()) != null) { + // Parsing logic here } + } catch (IOException e) { + //TODO: Notify user of the error via GUI and provide a retry option. + throw new IOException("Error reading questions file: " + filePath, e); } - reader.close(); } + + /** * Saves the player's high score to a file. *

@@ -78,6 +85,7 @@ public void loadQuestions(String filePath) throws IOException { * @throws IOException if an I/O error occurs while writing to the file */ public void saveHighScore(int score) throws IOException { + //TODO: Confirm file location is writable and handle potential IOException with user notification. String highScoresFile = "src/main/resources/highscores.txt"; BufferedWriter writer = new BufferedWriter(new FileWriter(highScoresFile, true)); writer.write("Score: " + score + "\n"); @@ -85,6 +93,7 @@ public void saveHighScore(int score) throws IOException { } + //TODO: create a leaderboard that stores the user's best time/high scores /** * Returns the list of questions in the game. diff --git a/src/main/java/edu/sdccd/cisc190/question/Question.java b/src/main/java/edu/sdccd/cisc190/question/Question.java index 21a164d..ecb7222 100644 --- a/src/main/java/edu/sdccd/cisc190/question/Question.java +++ b/src/main/java/edu/sdccd/cisc190/question/Question.java @@ -43,3 +43,6 @@ public String getQuestionText() { */ public abstract boolean checkAnswer(String answer); } +//TODO: Demonstrate polymorphism by adding a `displayQuestion()` method in the base class +// and overriding it in child classes to provide specific behavior. +