Initial commit
This commit is contained in:
commit
e2edd3b83a
14
QuizzleDizzle.iml
Normal file
14
QuizzleDizzle.iml
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="JAVA_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||||
|
<exclude-output />
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/resources" type="java-resource" />
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
<orderEntry type="library" name="JColor-5.0.1" level="project" />
|
||||||
|
<orderEntry type="library" name="json-20210307" level="project" />
|
||||||
|
</component>
|
||||||
|
</module>
|
5
README.md
Normal file
5
README.md
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
# A quiz written in java11 for school
|
||||||
|
|
||||||
|
Has full singleplayer and hotseat support.
|
||||||
|
Multiplayer via sockets are also implemented but not working
|
||||||
|
|
BIN
lib/JColor-5.0.1.jar
Normal file
BIN
lib/JColor-5.0.1.jar
Normal file
Binary file not shown.
BIN
lib/json-20210307.jar
Normal file
BIN
lib/json-20210307.jar
Normal file
Binary file not shown.
BIN
out/artifacts/QuizzleDizzle_jar/QuizzleDizzle.jar
Normal file
BIN
out/artifacts/QuizzleDizzle_jar/QuizzleDizzle.jar
Normal file
Binary file not shown.
3
out/artifacts/QuizzleDizzle_jar/questions.csv
Normal file
3
out/artifacts/QuizzleDizzle_jar/questions.csv
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# question;right answer index;answers...
|
||||||
|
Wie toll ist Microsoft;3;Ganz toll; nicht so toll;schlecht;*kotzgeräusche*
|
||||||
|
Was ist das beste Betriebsystem;0;Linux;Mac;Windows
|
|
3
questions.csv
Normal file
3
questions.csv
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# question;right answer index;answers...
|
||||||
|
Wie toll ist Microsoft;3;Ganz toll; nicht so toll;schlecht;*kotzgeräusche*
|
||||||
|
Was ist das beste Betriebsystem;0;Linux;Mac;Windows
|
|
3
src/META-INF/MANIFEST.MF
Normal file
3
src/META-INF/MANIFEST.MF
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Manifest-Version: 1.0
|
||||||
|
Main-Class: org.bytedream.quizzledizzle.Main
|
||||||
|
|
51
src/org/bytedream/quizzledizzle/Main.java
Normal file
51
src/org/bytedream/quizzledizzle/Main.java
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
package org.bytedream.quizzledizzle;
|
||||||
|
|
||||||
|
import org.bytedream.quizzledizzle.console.Console;
|
||||||
|
import org.bytedream.quizzledizzle.options.*;
|
||||||
|
import org.bytedream.quizzledizzle.question.Questions;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
|
||||||
|
public class Main {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Exception {
|
||||||
|
Console console = new Console();
|
||||||
|
Questions questions = Questions.loadFromCSV(new File("questions.csv"), ";");
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
Option option;
|
||||||
|
|
||||||
|
console.info("1 - Singleplayer");
|
||||||
|
console.info("2 - Hotseat");
|
||||||
|
console.info("3 - Host multiplayer game (2 players)");
|
||||||
|
console.info("4 - Join multiplayer game (2 players)");
|
||||||
|
switch (console.askInt("Choice: ")) {
|
||||||
|
case -1:
|
||||||
|
console.info("Bye, see ya later");
|
||||||
|
return;
|
||||||
|
case 1:
|
||||||
|
option = new Singleplayer(console, questions);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
option = new Hotseat(console, questions);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
option = new MultiplayerHost(console, questions);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
option = new MultiplayerClient(console, questions);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
console.error("Please enter a number between 1 and 4 (see options above) or 'q' to exit");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
console.clearScreen();
|
||||||
|
String exitMessage = option.start();
|
||||||
|
console.clearScreen();
|
||||||
|
if (exitMessage != null) {
|
||||||
|
console.error(exitMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
141
src/org/bytedream/quizzledizzle/console/Console.java
Normal file
141
src/org/bytedream/quizzledizzle/console/Console.java
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
package org.bytedream.quizzledizzle.console;
|
||||||
|
|
||||||
|
import com.diogonunes.jcolor.Ansi;
|
||||||
|
import com.diogonunes.jcolor.Attribute;
|
||||||
|
import org.bytedream.quizzledizzle.question.Question;
|
||||||
|
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
|
public class Console {
|
||||||
|
|
||||||
|
public static final boolean isWindows = System.getProperty("os.name").toLowerCase().contains("win");
|
||||||
|
private final Scanner scanner = new Scanner(System.in);
|
||||||
|
|
||||||
|
public String ask(String question) {
|
||||||
|
System.out.print(question);
|
||||||
|
return scanner.next();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int askInt(String question) {
|
||||||
|
String maybeNum;
|
||||||
|
while (true) {
|
||||||
|
System.out.print(question);
|
||||||
|
maybeNum = scanner.next();
|
||||||
|
|
||||||
|
try {
|
||||||
|
return Integer.parseInt(maybeNum);
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
if (maybeNum.equalsIgnoreCase("q")) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
System.out.println(Ansi.colorize("Please enter a number or 'q' to exit", Attribute.RED_TEXT()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void title(String content) {
|
||||||
|
System.out.println(content);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void error(String content) {
|
||||||
|
System.out.println(Ansi.colorize(content, Attribute.RED_TEXT()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void info(String content) {
|
||||||
|
System.out.println(Ansi.colorize(content, Attribute.BRIGHT_BLUE_TEXT()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shows a question
|
||||||
|
*
|
||||||
|
* @param question
|
||||||
|
* @return the answer index
|
||||||
|
*/
|
||||||
|
public int showQuestion(Question question) {
|
||||||
|
System.out.println(Ansi.colorize(question.getQuestion(), Attribute.BLUE_TEXT()));
|
||||||
|
|
||||||
|
String[] answers = question.getAnswers();
|
||||||
|
for (int i = 0; i < answers.length; i++) {
|
||||||
|
System.out.printf(" -> %d) %s\n", i + 1, answers[i]);
|
||||||
|
}
|
||||||
|
while (true) {
|
||||||
|
System.out.println("");
|
||||||
|
System.out.print("Enter a number: ");
|
||||||
|
String answer = scanner.next();
|
||||||
|
if (answer.equals("q")) {
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
int chosenAnswer = Integer.parseInt(answer) - 1;
|
||||||
|
if (chosenAnswer >= 0 && chosenAnswer < answers.length) {
|
||||||
|
return chosenAnswer;
|
||||||
|
}
|
||||||
|
} catch (NumberFormatException ignore) {}
|
||||||
|
clearLastLine();
|
||||||
|
clearLastLine();
|
||||||
|
System.err.println("Please enter a valid number");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shows the results from a question
|
||||||
|
*
|
||||||
|
* @param question
|
||||||
|
* @param chosenAnswer
|
||||||
|
*/
|
||||||
|
public void showResult(Question question, int chosenAnswer) {
|
||||||
|
String[] answers = question.getAnswers();
|
||||||
|
|
||||||
|
char answerEmoji;
|
||||||
|
for (int i = 0; i < answers.length; i++) {
|
||||||
|
if (i == chosenAnswer) {
|
||||||
|
answerEmoji = '✔';
|
||||||
|
} else {
|
||||||
|
answerEmoji = '✘';
|
||||||
|
}
|
||||||
|
if (i == question.getRightAnswerIndex()) {
|
||||||
|
System.out.println(Ansi.colorize(String.format("»» %d) %s [%s] ««", i + 1, answers[i], answerEmoji), Attribute.GREEN_TEXT()));
|
||||||
|
} else {
|
||||||
|
System.out.println(Ansi.colorize(String.format(" %d) %s [%s]", i + 1, answers[i], answerEmoji), Attribute.RED_TEXT()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clears the screen and shows the total questions and the count of right questions
|
||||||
|
*
|
||||||
|
* @param totalQuestions
|
||||||
|
* @param rightQuestions
|
||||||
|
*/
|
||||||
|
public void showClearScreen(int totalQuestions, int rightQuestions) {
|
||||||
|
clearScreen();
|
||||||
|
System.out.println(Ansi.colorize(String.format("Total questions: %d - Right questions: %d\n", totalQuestions, rightQuestions), Attribute.BLUE_TEXT()));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clears the entire screen.
|
||||||
|
* repeats \n if the plaform is windows, ansi codes are used on all other plaforms
|
||||||
|
*/
|
||||||
|
public void clearScreen() {
|
||||||
|
if (!isWindows) {
|
||||||
|
System.out.print("\033[H\033[2J");
|
||||||
|
} else {
|
||||||
|
// because windows is windows, ansi codes are not working by default and this has to be used
|
||||||
|
System.out.println("\n".repeat(1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clears the last line.
|
||||||
|
* only works on linux
|
||||||
|
*/
|
||||||
|
public void clearLastLine() {
|
||||||
|
// yep, windows again...
|
||||||
|
if (!isWindows) {
|
||||||
|
System.out.print("\033[1F\33[2K");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
69
src/org/bytedream/quizzledizzle/multiplayer/Client.java
Normal file
69
src/org/bytedream/quizzledizzle/multiplayer/Client.java
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
package org.bytedream.quizzledizzle.multiplayer;
|
||||||
|
|
||||||
|
import org.bytedream.quizzledizzle.question.Question;
|
||||||
|
|
||||||
|
import java.io.BufferedReader;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.PrintWriter;
|
||||||
|
import java.net.Socket;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class Client {
|
||||||
|
private final Socket socket;
|
||||||
|
private final BufferedReader reader;
|
||||||
|
private final PrintWriter writer;
|
||||||
|
private final long seed;
|
||||||
|
private final Random random;
|
||||||
|
private final boolean isServer;
|
||||||
|
|
||||||
|
public Client(Socket socket, BufferedReader reader, PrintWriter writer, long seed, boolean isServer) {
|
||||||
|
this.socket = socket;
|
||||||
|
this.reader = reader;
|
||||||
|
this.writer = writer;
|
||||||
|
this.seed = seed;
|
||||||
|
this.random = new Random(seed);
|
||||||
|
this.isServer = isServer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendQuestion(Question question) {
|
||||||
|
writer.printf("%s;%s;%s\n", question.getQuestion(), question.getRightAnswerIndex(), String.join(";", question.getAnswers()));
|
||||||
|
writer.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Question receiveQuestion() throws IOException {
|
||||||
|
String[] rawQuestion = reader.readLine().split(";");
|
||||||
|
return new Question(rawQuestion[0], Integer.parseInt(rawQuestion[1]), Arrays.copyOfRange(rawQuestion, 2, rawQuestion.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void sendAnswer(int answerIndex) {
|
||||||
|
writer.print(answerIndex);
|
||||||
|
writer.flush();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int receiveAnswer() throws IOException {
|
||||||
|
return Integer.parseInt(reader.readLine());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateSeed(int count) {
|
||||||
|
this.random.setSeed(seed + count);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns if the client has to send the next question to the other player
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public boolean requestSend() {
|
||||||
|
int result = random.nextInt(2);
|
||||||
|
if (isServer) {
|
||||||
|
return result == 1;
|
||||||
|
} else {
|
||||||
|
return result == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void close() throws IOException {
|
||||||
|
socket.close();
|
||||||
|
}
|
||||||
|
}
|
32
src/org/bytedream/quizzledizzle/multiplayer/Connection.java
Normal file
32
src/org/bytedream/quizzledizzle/multiplayer/Connection.java
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
package org.bytedream.quizzledizzle.multiplayer;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.net.ServerSocket;
|
||||||
|
import java.net.Socket;
|
||||||
|
|
||||||
|
public class Connection {
|
||||||
|
public static Client client(String host, int port) throws IOException {
|
||||||
|
// creates a new socket an connects directly to the client
|
||||||
|
Socket socket = new Socket(host, port);
|
||||||
|
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||||
|
PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
|
||||||
|
|
||||||
|
long seed = Long.parseLong(reader.readLine());
|
||||||
|
return new Client(socket, reader, writer, seed, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Client server(int port) throws IOException {
|
||||||
|
// creates new socket server and waits until a client connects
|
||||||
|
Socket socket = new ServerSocket(port).accept();
|
||||||
|
|
||||||
|
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
|
||||||
|
PrintWriter writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
|
||||||
|
|
||||||
|
// generates and sends a seed which is used to choose if the server or the client sends the questions
|
||||||
|
long seed = System.nanoTime();
|
||||||
|
writer.println(seed);
|
||||||
|
writer.flush();
|
||||||
|
return new Client(socket, reader, writer, seed, true);
|
||||||
|
}
|
||||||
|
}
|
47
src/org/bytedream/quizzledizzle/options/Hotseat.java
Normal file
47
src/org/bytedream/quizzledizzle/options/Hotseat.java
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package org.bytedream.quizzledizzle.options;
|
||||||
|
|
||||||
|
import org.bytedream.quizzledizzle.console.Console;
|
||||||
|
import org.bytedream.quizzledizzle.question.Question;
|
||||||
|
import org.bytedream.quizzledizzle.question.Questions;
|
||||||
|
|
||||||
|
public class Hotseat extends Option {
|
||||||
|
|
||||||
|
public Hotseat(Console console, Questions defaultQuestions) {
|
||||||
|
super(console, defaultQuestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String start() throws Exception {
|
||||||
|
int playerCount = console.askInt("Player count> ");
|
||||||
|
|
||||||
|
int count = 1;
|
||||||
|
while (true) {
|
||||||
|
int[] answers = new int[playerCount];
|
||||||
|
|
||||||
|
Question question = defaultQuestions.randomQuestion();
|
||||||
|
for (int i = 0; i < playerCount; i++) {
|
||||||
|
console.clearScreen();
|
||||||
|
console.title("Question " + count);
|
||||||
|
console.title("Player " + (i + 1));
|
||||||
|
int answer = console.showQuestion(question);
|
||||||
|
if (answer == -1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
answers[i] = answer;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.clearScreen();
|
||||||
|
console.info("Results");
|
||||||
|
for (int i = 0; i < playerCount; i++) {
|
||||||
|
console.info("Player " + (i + 1));
|
||||||
|
console.showResult(question, answers[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!console.ask("Continue? [y/N]").toLowerCase().startsWith("y")) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,34 @@
|
|||||||
|
package org.bytedream.quizzledizzle.options;
|
||||||
|
|
||||||
|
import org.bytedream.quizzledizzle.console.Console;
|
||||||
|
import org.bytedream.quizzledizzle.multiplayer.Client;
|
||||||
|
import org.bytedream.quizzledizzle.multiplayer.Connection;
|
||||||
|
import org.bytedream.quizzledizzle.question.Questions;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class MultiplayerClient extends MultiplayerOption {
|
||||||
|
public MultiplayerClient(Console console, Questions defaultQuestions) {
|
||||||
|
super(console, defaultQuestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String start() throws Exception {
|
||||||
|
String ip = console.ask("IP address to connect to> ");
|
||||||
|
int port = console.askInt("Port to connect> ");
|
||||||
|
|
||||||
|
Client client;
|
||||||
|
try {
|
||||||
|
client = Connection.client(ip, port);
|
||||||
|
console.info("Connected to server");
|
||||||
|
} catch (IOException e) {
|
||||||
|
return "Could not connect to the given ip address. Maybe the port or ip is wrong?";
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (!this.request(defaultQuestions.randomQuestion(), client)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
36
src/org/bytedream/quizzledizzle/options/MultiplayerHost.java
Normal file
36
src/org/bytedream/quizzledizzle/options/MultiplayerHost.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package org.bytedream.quizzledizzle.options;
|
||||||
|
|
||||||
|
import com.diogonunes.jcolor.Ansi;
|
||||||
|
import org.bytedream.quizzledizzle.console.Console;
|
||||||
|
import org.bytedream.quizzledizzle.multiplayer.Client;
|
||||||
|
import org.bytedream.quizzledizzle.multiplayer.Connection;
|
||||||
|
import org.bytedream.quizzledizzle.question.Questions;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class MultiplayerHost extends MultiplayerOption {
|
||||||
|
public MultiplayerHost(Console console, Questions defaultQuestions) {
|
||||||
|
super(console, defaultQuestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String start() throws Exception {
|
||||||
|
int port = console.askInt("Hosting port> ");
|
||||||
|
|
||||||
|
console.info(Ansi.colorize("Waiting for new connection on port " + port));
|
||||||
|
|
||||||
|
Client client;
|
||||||
|
try {
|
||||||
|
client = Connection.server(port);
|
||||||
|
console.info("Client connected");
|
||||||
|
} catch (IOException e) {
|
||||||
|
return "Could not create socket. Maybe the port is out of bounce or already taken?";
|
||||||
|
}
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
if (!this.request(defaultQuestions.randomQuestion(), client)) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,41 @@
|
|||||||
|
package org.bytedream.quizzledizzle.options;
|
||||||
|
|
||||||
|
import org.bytedream.quizzledizzle.console.Console;
|
||||||
|
import org.bytedream.quizzledizzle.multiplayer.Client;
|
||||||
|
import org.bytedream.quizzledizzle.question.Question;
|
||||||
|
import org.bytedream.quizzledizzle.question.Questions;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public abstract class MultiplayerOption extends Option {
|
||||||
|
|
||||||
|
public MultiplayerOption(Console console, Questions defaultQuestions) {
|
||||||
|
super(console, defaultQuestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean request(Question question, Client client) throws IOException {
|
||||||
|
int ownAnswer;
|
||||||
|
int otherAnswer;
|
||||||
|
// possible bug: the server could send the question before the client / other player is listening for it
|
||||||
|
if (client.requestSend()) {
|
||||||
|
ownAnswer = console.showQuestion(question);
|
||||||
|
client.sendQuestion(question);
|
||||||
|
otherAnswer = client.receiveAnswer();
|
||||||
|
client.sendAnswer(ownAnswer);
|
||||||
|
} else {
|
||||||
|
question = client.receiveQuestion();
|
||||||
|
ownAnswer = console.showQuestion(question);
|
||||||
|
client.sendAnswer(ownAnswer);
|
||||||
|
otherAnswer = client.receiveAnswer();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ownAnswer == -1 || otherAnswer == -1) {
|
||||||
|
client.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.showResult(question, ownAnswer);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
36
src/org/bytedream/quizzledizzle/options/Option.java
Normal file
36
src/org/bytedream/quizzledizzle/options/Option.java
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
package org.bytedream.quizzledizzle.options;
|
||||||
|
|
||||||
|
import org.bytedream.quizzledizzle.console.Console;
|
||||||
|
import org.bytedream.quizzledizzle.question.Question;
|
||||||
|
import org.bytedream.quizzledizzle.question.Questions;
|
||||||
|
|
||||||
|
public abstract class Option {
|
||||||
|
|
||||||
|
protected final Console console;
|
||||||
|
protected final Questions defaultQuestions;
|
||||||
|
|
||||||
|
private int totalQuestions = 0;
|
||||||
|
private int rightQuestions = 0;
|
||||||
|
|
||||||
|
public Option(Console console, Questions defaultQuestions) {
|
||||||
|
this.console = console;
|
||||||
|
this.defaultQuestions = defaultQuestions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void showResult(Question question, int chosenAnswer) {
|
||||||
|
if (chosenAnswer == question.getRightAnswerIndex()) {
|
||||||
|
rightQuestions++;
|
||||||
|
}
|
||||||
|
console.showResult(question, chosenAnswer);
|
||||||
|
console.showClearScreen(++totalQuestions, rightQuestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Entrypoint when the user has chosen this option
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public abstract String start() throws Exception;
|
||||||
|
|
||||||
|
}
|
23
src/org/bytedream/quizzledizzle/options/Singleplayer.java
Normal file
23
src/org/bytedream/quizzledizzle/options/Singleplayer.java
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
package org.bytedream.quizzledizzle.options;
|
||||||
|
|
||||||
|
import org.bytedream.quizzledizzle.console.Console;
|
||||||
|
import org.bytedream.quizzledizzle.question.Question;
|
||||||
|
import org.bytedream.quizzledizzle.question.Questions;
|
||||||
|
|
||||||
|
public class Singleplayer extends Option {
|
||||||
|
public Singleplayer(Console console, Questions defaultQuestions) {
|
||||||
|
super(console, defaultQuestions);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String start() throws Exception {
|
||||||
|
while (true) {
|
||||||
|
Question question = defaultQuestions.randomQuestion();
|
||||||
|
int answer = console.showQuestion(question);
|
||||||
|
if (answer == -1) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
this.showResult(question, answer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
30
src/org/bytedream/quizzledizzle/question/Question.java
Normal file
30
src/org/bytedream/quizzledizzle/question/Question.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package org.bytedream.quizzledizzle.question;
|
||||||
|
|
||||||
|
public class Question {
|
||||||
|
|
||||||
|
private final String question;
|
||||||
|
private final int rightAnswerIndex;
|
||||||
|
private final String[] answers;
|
||||||
|
|
||||||
|
public Question(String question, int rightAnswerIndex, String... answers) {
|
||||||
|
this.question = question;
|
||||||
|
this.rightAnswerIndex = rightAnswerIndex;
|
||||||
|
this.answers = answers;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getQuestion() {
|
||||||
|
if (!question.endsWith("?")) {
|
||||||
|
return question + '?';
|
||||||
|
}
|
||||||
|
return question;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getRightAnswerIndex() {
|
||||||
|
return rightAnswerIndex;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String[] getAnswers() {
|
||||||
|
return answers;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
49
src/org/bytedream/quizzledizzle/question/Questions.java
Normal file
49
src/org/bytedream/quizzledizzle/question/Questions.java
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
package org.bytedream.quizzledizzle.question;
|
||||||
|
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Random;
|
||||||
|
|
||||||
|
public class Questions {
|
||||||
|
|
||||||
|
private final String[][] questions;
|
||||||
|
|
||||||
|
public Questions(String[][] questions) {
|
||||||
|
this.questions = questions;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* shows a random question
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Question randomQuestion() {
|
||||||
|
String[] chosenQuestion = questions[new Random().nextInt(questions.length)];
|
||||||
|
return new Question(chosenQuestion[0], Integer.parseInt(chosenQuestion[1]), Arrays.copyOfRange(chosenQuestion, 2, chosenQuestion.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* loads questions from a .csv file
|
||||||
|
*
|
||||||
|
* @param file the file to read from
|
||||||
|
* @param delimiter the used delimiter
|
||||||
|
* @return
|
||||||
|
* @throws IOException if the file does not exist
|
||||||
|
*/
|
||||||
|
public static Questions loadFromCSV(File file, String delimiter) throws IOException {
|
||||||
|
BufferedReader reader = new BufferedReader(new FileReader(file));
|
||||||
|
ArrayList<String[]> items = new ArrayList<>();
|
||||||
|
|
||||||
|
String line;
|
||||||
|
while ((line = reader.readLine()) != null) {
|
||||||
|
// if a comment is in the file
|
||||||
|
if (line.startsWith("#")) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
items.add(line.split(delimiter));
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Questions(items.toArray(String[][]::new));
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user