Probeklausur
This commit is contained in:
commit
d9cd9f2c21
9 changed files with 670 additions and 0 deletions
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
|
@ -0,0 +1 @@
|
|||
highscores.txt
|
BIN
17_ProbePE_Sem1_DartsCounter.pdf
Normal file
BIN
17_ProbePE_Sem1_DartsCounter.pdf
Normal file
Binary file not shown.
45
src/de/dhbw_ka/probe_pe/darts_counter/Board.java
Normal file
45
src/de/dhbw_ka/probe_pe/darts_counter/Board.java
Normal file
|
@ -0,0 +1,45 @@
|
|||
package src.de.dhbw_ka.probe_pe.darts_counter;
|
||||
|
||||
/**
|
||||
* Class representing the Game Board
|
||||
*/
|
||||
public class Board {
|
||||
/**
|
||||
* All fields a player can hit with a throw
|
||||
*
|
||||
* @see Field
|
||||
*/
|
||||
private Field[] fields = new Field[63];
|
||||
|
||||
/**
|
||||
* Initiates the board with all fields
|
||||
*/
|
||||
public Board() {
|
||||
for (int i = 1; i <= 20; i++) {
|
||||
fields[(i - 1) * 3] = new Field("" + i, i, false);
|
||||
fields[(i - 1) * 3 + 1] = new Field("D" + i, i * 2, true);
|
||||
fields[(i - 1) * 3 + 2] = new Field("T" + i, i * 3, false);
|
||||
}
|
||||
fields[60] = new Field("25", 25, false);
|
||||
fields[61] = new Field("BULL", 50, true);
|
||||
fields[62] = new Field("x", 0, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the matching field for a (user input) string or null
|
||||
*
|
||||
* @param label
|
||||
* @return the field with the matching label
|
||||
* @see Field
|
||||
*/
|
||||
public Field parseField(String label) {
|
||||
for (Field f : fields) {
|
||||
if (f == null)
|
||||
continue;
|
||||
if (f.getLabel().equalsIgnoreCase(label))
|
||||
return f;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
26
src/de/dhbw_ka/probe_pe/darts_counter/DartsCounter.java
Normal file
26
src/de/dhbw_ka/probe_pe/darts_counter/DartsCounter.java
Normal file
|
@ -0,0 +1,26 @@
|
|||
package src.de.dhbw_ka.probe_pe.darts_counter;
|
||||
|
||||
/**
|
||||
* Darts counter application
|
||||
*/
|
||||
public class DartsCounter {
|
||||
|
||||
/**
|
||||
* Application entry point
|
||||
*
|
||||
* @param args
|
||||
* command line arguments
|
||||
*/
|
||||
public static void main(String[] args) {
|
||||
|
||||
final Board b = new Board();
|
||||
|
||||
final Player[] players = new Player[] { new Player("Luke Humphries"), new Player("Luke Littler")
|
||||
};
|
||||
|
||||
final Game g = new Game(b, players);
|
||||
g.start();
|
||||
|
||||
}
|
||||
|
||||
}
|
61
src/de/dhbw_ka/probe_pe/darts_counter/Field.java
Normal file
61
src/de/dhbw_ka/probe_pe/darts_counter/Field.java
Normal file
|
@ -0,0 +1,61 @@
|
|||
package src.de.dhbw_ka.probe_pe.darts_counter;
|
||||
|
||||
/**
|
||||
* Class representing a dart board field
|
||||
*/
|
||||
public class Field {
|
||||
/**
|
||||
* Label of the Field
|
||||
*/
|
||||
private String label;
|
||||
/**
|
||||
* Value of the Field
|
||||
*/
|
||||
private int value;
|
||||
/**
|
||||
* If the field is a double value field
|
||||
*/
|
||||
private boolean doubleField;
|
||||
|
||||
/**
|
||||
* Initiates a new Field
|
||||
*
|
||||
* @param label
|
||||
* @param value
|
||||
* @param doubleField
|
||||
*/
|
||||
public Field(String label, int value, boolean doubleField) {
|
||||
this.label = label;
|
||||
this.value = value;
|
||||
this.doubleField = doubleField;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return Label of the field
|
||||
*/
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return value of the field
|
||||
*/
|
||||
public int getValue() {
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return true if the field is a double value field
|
||||
*/
|
||||
public boolean getDoubleField() {
|
||||
return doubleField;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.label;
|
||||
}
|
||||
}
|
169
src/de/dhbw_ka/probe_pe/darts_counter/Game.java
Normal file
169
src/de/dhbw_ka/probe_pe/darts_counter/Game.java
Normal file
|
@ -0,0 +1,169 @@
|
|||
package src.de.dhbw_ka.probe_pe.darts_counter;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.Paths;
|
||||
import java.nio.file.StandardOpenOption;
|
||||
import java.util.Scanner;
|
||||
|
||||
/**
|
||||
* Class representing the darts game
|
||||
*/
|
||||
public class Game {
|
||||
/**
|
||||
* Instance of the Board
|
||||
*
|
||||
* @see Board
|
||||
*/
|
||||
private Board board;
|
||||
/**
|
||||
* Array of the players playing
|
||||
*
|
||||
* @see Player
|
||||
*/
|
||||
private Player[] players;
|
||||
/**
|
||||
* Index of the player who has the next turn
|
||||
*/
|
||||
private int nextTurnPlayerIndex = 0;
|
||||
|
||||
/**
|
||||
* Initiates a new game
|
||||
* The game has to be started with `game.start();`
|
||||
*
|
||||
* @param board
|
||||
* @param players
|
||||
*/
|
||||
public Game(Board board, Player[] players) {
|
||||
this.board = board;
|
||||
this.players = players;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if the game is ended.
|
||||
*
|
||||
* @return true if the game is ended
|
||||
*/
|
||||
private boolean gameEnd() {
|
||||
Boolean ended = false;
|
||||
for (Player p : players) {
|
||||
if (p.getRemainingPoints() == 0)
|
||||
ended = true;
|
||||
}
|
||||
if (players[nextTurnPlayerIndex].getVisitsCount() == 10)
|
||||
ended = true;
|
||||
return ended;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the player who has won.
|
||||
*
|
||||
* @return Winner
|
||||
* @see Player
|
||||
*/
|
||||
private Player getWinner() {
|
||||
for (Player p : players) {
|
||||
if (p.getRemainingPoints() == 0)
|
||||
return p;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a user input string to a visit
|
||||
*
|
||||
* @param input
|
||||
* @return visit matching the input string
|
||||
* @see Visit
|
||||
*/
|
||||
private Visit inputToVisit(String input) {
|
||||
String[] parts = input.split(" ");
|
||||
Field[] fields = new Field[parts.length];
|
||||
for (int i = 0; i < fields.length; i++)
|
||||
fields[i] = board.parseField(parts[i]);
|
||||
return new Visit(fields);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a checkout for the remaining points is possible
|
||||
*
|
||||
* @param points
|
||||
* @return null or a string of fields
|
||||
*/
|
||||
private String checkout(int points) {
|
||||
if (points > 170)
|
||||
return null;
|
||||
|
||||
Path checkoutsFile = Path.of("src/de/dhbw_ka/probe_pe/darts_counter/checkouts.txt");
|
||||
try {
|
||||
BufferedReader reader = Files.newBufferedReader(checkoutsFile, StandardCharsets.UTF_8);
|
||||
for (int i = 0; i < (points - 1); i++)
|
||||
reader.readLine();
|
||||
String checkout = reader.readLine();
|
||||
reader.close();
|
||||
if (!checkout.equals("-"))
|
||||
return checkout;
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to load checkouts file.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts the game
|
||||
*/
|
||||
public void start() {
|
||||
Scanner in = new Scanner(System.in);
|
||||
while (!gameEnd()) {
|
||||
Player currentTurnPlayer = this.players[this.nextTurnPlayerIndex];
|
||||
nextTurnPlayerIndex = (nextTurnPlayerIndex + 1) % this.players.length;
|
||||
System.out.println("Player: " + currentTurnPlayer);
|
||||
if (this.checkout(currentTurnPlayer.getRemainingPoints()) != null) {
|
||||
System.out.println("Checkout possible with: " + this.checkout(currentTurnPlayer.getRemainingPoints()));
|
||||
}
|
||||
System.out.print("Enter visit: ");
|
||||
String inputString = in.nextLine();
|
||||
Visit visit = this.inputToVisit(inputString);
|
||||
Boolean success = currentTurnPlayer.addVisit(visit);
|
||||
if (success) {
|
||||
System.out.println("Scored: " + visit.getValue());
|
||||
} else {
|
||||
System.out.println("Invalid visit");
|
||||
}
|
||||
System.out.println("=============================");
|
||||
}
|
||||
in.close();
|
||||
|
||||
Player winner = this.getWinner();
|
||||
if (winner == null) {
|
||||
System.out.println("You're too bad for this game");
|
||||
} else {
|
||||
System.out.println("Game shot and the leg, " + winner.getName());
|
||||
this.writeWinnerToFile(winner);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the winner into the highscores.txt file
|
||||
*
|
||||
* @param winner
|
||||
* @see Player
|
||||
*/
|
||||
private void writeWinnerToFile(Player winner) {
|
||||
Path winnerFile = Paths.get("highscores.txt");
|
||||
|
||||
try {
|
||||
BufferedWriter writer = Files.newBufferedWriter(winnerFile, StandardCharsets.UTF_8, StandardOpenOption.APPEND);
|
||||
writer.write(winner.getName() + " won with " + winner.getCountDartsThrown() + " darts.\n");
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
System.err.println("Failed to write highscore file.");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
135
src/de/dhbw_ka/probe_pe/darts_counter/Player.java
Normal file
135
src/de/dhbw_ka/probe_pe/darts_counter/Player.java
Normal file
|
@ -0,0 +1,135 @@
|
|||
package src.de.dhbw_ka.probe_pe.darts_counter;
|
||||
|
||||
/**
|
||||
* Class representing a player in the darts game
|
||||
*/
|
||||
public class Player {
|
||||
/**
|
||||
* Name of the player
|
||||
*/
|
||||
private String name;
|
||||
/**
|
||||
* Amount of darts the player has already thrown
|
||||
*/
|
||||
private int countDartsThrown = 0;
|
||||
/**
|
||||
* Array of visits the player has already done (max 10)
|
||||
*
|
||||
* @see Visit
|
||||
*/
|
||||
private Visit[] visits = new Visit[10];
|
||||
|
||||
/**
|
||||
* Initiates a new player
|
||||
*
|
||||
* @param name Name of the player
|
||||
*/
|
||||
public Player(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the players name
|
||||
*
|
||||
* @return name
|
||||
*/
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the players name
|
||||
*
|
||||
* @param name
|
||||
*/
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the amount of darts this player has thrown
|
||||
*
|
||||
* @return amount of darts
|
||||
*/
|
||||
public int getCountDartsThrown() {
|
||||
return countDartsThrown;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the amount of visits the player has already done
|
||||
*
|
||||
* @return already done visits
|
||||
*/
|
||||
public int getVisitsCount() {
|
||||
int visitCount = 0;
|
||||
for (Visit v : visits) {
|
||||
if (v == null)
|
||||
continue;
|
||||
visitCount++;
|
||||
}
|
||||
return visitCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the remaining points of this player
|
||||
*
|
||||
* @return remaining points
|
||||
*/
|
||||
public int getRemainingPoints() {
|
||||
int pointsRemaining = 501;
|
||||
for (Visit v : visits) {
|
||||
if (v == null)
|
||||
continue;
|
||||
pointsRemaining -= v.getValue();
|
||||
}
|
||||
return pointsRemaining;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attempts to add a visit
|
||||
*
|
||||
* @param visit The visit to add
|
||||
* @return success of the visit
|
||||
* @see Visit
|
||||
*/
|
||||
public boolean addVisit(Visit visit) {
|
||||
/**
|
||||
* Count up the darts thrown
|
||||
*/
|
||||
this.countDartsThrown += visit.getFields().length;
|
||||
|
||||
/**
|
||||
* Don't allow visits to have a higher value than the remaining points
|
||||
*/
|
||||
if (visit.getValue() > this.getRemainingPoints())
|
||||
return false;
|
||||
|
||||
/**
|
||||
* Only allow finishing the game with a double field
|
||||
*/
|
||||
if (visit.getValue() == this.getRemainingPoints() && !visit.getLastField().getDoubleField())
|
||||
return false;
|
||||
|
||||
/**
|
||||
* Don't allow a player to get exactly 1 point
|
||||
*/
|
||||
if (this.getRemainingPoints() - visit.getValue() == 1)
|
||||
return false;
|
||||
|
||||
/**
|
||||
* Add visit to array
|
||||
*/
|
||||
int currentVisitCount = this.getVisitsCount();
|
||||
if (currentVisitCount >= 10)
|
||||
return false;
|
||||
|
||||
this.visits[currentVisitCount] = visit;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return this.name + ", " + this.getRemainingPoints() + " points remaining.";
|
||||
}
|
||||
}
|
63
src/de/dhbw_ka/probe_pe/darts_counter/Visit.java
Normal file
63
src/de/dhbw_ka/probe_pe/darts_counter/Visit.java
Normal file
|
@ -0,0 +1,63 @@
|
|||
package src.de.dhbw_ka.probe_pe.darts_counter;
|
||||
|
||||
/**
|
||||
* Class representing a dart visit
|
||||
*/
|
||||
public class Visit {
|
||||
/**
|
||||
* Array of all the fields hit in this visit
|
||||
*
|
||||
* @see Field
|
||||
*/
|
||||
private Field[] fields;
|
||||
|
||||
/**
|
||||
* Create a new Visit instance for the hit fields
|
||||
*
|
||||
* @param fields array of fields hit (must be less or eqal to 3)
|
||||
* @see Field
|
||||
*/
|
||||
public Visit(Field[] fields) {
|
||||
if (fields.length > 3)
|
||||
throw new IllegalArgumentException("Thrown too many darts for one visit!");
|
||||
|
||||
this.fields = fields;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return All the fields hit in this visit
|
||||
* @see Field
|
||||
*/
|
||||
public Field[] getFields() {
|
||||
return fields;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the value of this visit
|
||||
*
|
||||
* @return value of the visit
|
||||
*/
|
||||
public int getValue() {
|
||||
int value = 0;
|
||||
for (Field f : fields) {
|
||||
if (f == null)
|
||||
continue;
|
||||
value += f.getValue();
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the last field for checking if the player finished with a double
|
||||
* field
|
||||
*
|
||||
* @return last field of the visit
|
||||
* @see Field
|
||||
*/
|
||||
public Field getLastField() {
|
||||
if (fields.length == 0)
|
||||
return null;
|
||||
return fields[fields.length - 1];
|
||||
}
|
||||
}
|
170
src/de/dhbw_ka/probe_pe/darts_counter/checkouts.txt
Normal file
170
src/de/dhbw_ka/probe_pe/darts_counter/checkouts.txt
Normal file
|
@ -0,0 +1,170 @@
|
|||
-
|
||||
D1
|
||||
1 D1
|
||||
D2
|
||||
1 D2
|
||||
D3
|
||||
1 D3
|
||||
D4
|
||||
1 D4
|
||||
D5
|
||||
1 D5
|
||||
D6
|
||||
1 D6
|
||||
D7
|
||||
1 D7
|
||||
D8
|
||||
1 D8
|
||||
D9
|
||||
1 D9
|
||||
D10
|
||||
1 D10
|
||||
D11
|
||||
3 D10
|
||||
D12
|
||||
5 D10
|
||||
6 D10
|
||||
7 D10
|
||||
D14
|
||||
9 D10
|
||||
D15
|
||||
1 D15
|
||||
D16
|
||||
1 D16
|
||||
D17
|
||||
3 D16
|
||||
D18
|
||||
5 D16
|
||||
6 D16
|
||||
7 D16
|
||||
D20
|
||||
1 D20
|
||||
2 D20
|
||||
3 D20
|
||||
4 D20
|
||||
5 D20
|
||||
6 D20
|
||||
7 D20
|
||||
16 D16
|
||||
9 D20
|
||||
10 D20
|
||||
11 D20
|
||||
12 D20
|
||||
13 D20
|
||||
14 D20
|
||||
15 D20
|
||||
16 D20
|
||||
17 D20
|
||||
18 D20
|
||||
19 D20
|
||||
20 D20
|
||||
25 D18
|
||||
T10 D16
|
||||
T13 D12
|
||||
T16 D8
|
||||
25 D20
|
||||
T10 D18
|
||||
T17 D8
|
||||
T20 D4
|
||||
T13 D15
|
||||
T10 D20
|
||||
T17 D10
|
||||
T12 D18
|
||||
T19 D8
|
||||
T18 D10
|
||||
T17 D12
|
||||
T20 D8
|
||||
T19 D10
|
||||
T18 D12
|
||||
T13 D20
|
||||
T20 D10
|
||||
T15 D18
|
||||
T14 D20
|
||||
T17 D16
|
||||
T20 D12
|
||||
T15 D20
|
||||
T18 D16
|
||||
T17 D18
|
||||
T16 D20
|
||||
T19 D16
|
||||
T18 D18
|
||||
T17 D20
|
||||
T20 D16
|
||||
T19 D18
|
||||
T18 D20
|
||||
T19 D19
|
||||
T20 D18
|
||||
T19 D20
|
||||
T20 D19
|
||||
T20 7 D16
|
||||
T20 D20
|
||||
T17 BULL
|
||||
T20 10 D16
|
||||
T20 3 D20
|
||||
T18 BULL
|
||||
T20 13 D16
|
||||
T20 10 D18
|
||||
T19 BULL
|
||||
T20 16 D16
|
||||
T20 17 D16
|
||||
T20 18 D16
|
||||
T20 19 D16
|
||||
T20 20 D16
|
||||
T20 13 D20
|
||||
T20 14 D20
|
||||
T20 15 D20
|
||||
T20 16 D20
|
||||
T20 17 D20
|
||||
T20 18 D20
|
||||
T20 19 D20
|
||||
T20 20 D20
|
||||
T20 T7 D20
|
||||
T18 T12 D16
|
||||
T19 T10 D18
|
||||
T20 14 BULL
|
||||
25 T20 D20
|
||||
T19 19 BULL
|
||||
T20 T17 D8
|
||||
T18 T14 D16
|
||||
T19 T12 D18
|
||||
T20 20 BULL
|
||||
T20 T17 D10
|
||||
T20 T12 D18
|
||||
T20 T11 D20
|
||||
T20 T14 D16
|
||||
T17 T20 D12
|
||||
T20 T20 D8
|
||||
T19 T20 D10
|
||||
T20 T18 D12
|
||||
T19 T14 D20
|
||||
T20 T20 D10
|
||||
T20 T19 D12
|
||||
T20 T14 D20
|
||||
T20 T17 D16
|
||||
T20 T20 D12
|
||||
T20 T15 D20
|
||||
T20 T18 D16
|
||||
T19 T18 D18
|
||||
T20 T16 D20
|
||||
T20 T19 D16
|
||||
T20 T18 D18
|
||||
T20 T17 D20
|
||||
T20 T20 D16
|
||||
T20 T19 D18
|
||||
T20 T18 D20
|
||||
T20 T19 D19
|
||||
T20 T20 D18
|
||||
T20 T19 D20
|
||||
T20 T20 D19
|
||||
-
|
||||
T20 T20 D20
|
||||
T20 T17 BULL
|
||||
-
|
||||
-
|
||||
T20 T18 BULL
|
||||
-
|
||||
-
|
||||
T20 T19 BULL
|
||||
-
|
||||
-
|
||||
T20 T20 BULL
|
Loading…
Add table
Add a link
Reference in a new issue