diff --git a/.gitignore b/.gitignore index db44c8a723e017349e18633821c8ee475d15621c..3e5f27cda91dfd3f7c2fcabd25b2e18e05a7ac74 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ .settings/ .project .classpath +/data.csv diff --git a/src/main/java/lab/GameController.java b/src/main/java/lab/GameController.java index 9d52ea1e382775d3ee6ea3edaa3da27dc2c2ad85..0c2c83bbce921a41af06160079d0eea8df5bbfe9 100644 --- a/src/main/java/lab/GameController.java +++ b/src/main/java/lab/GameController.java @@ -1,14 +1,37 @@ package lab; +import static java.util.Comparator.comparingInt; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; +import java.util.Scanner; +import java.util.Set; + import javafx.animation.AnimationTimer; import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.canvas.Canvas; import javafx.scene.control.Label; +import javafx.scene.control.ListView; import javafx.scene.control.Slider; +import javafx.scene.control.TextField; public class GameController { + private static final String FILE_NAME = "data.csv"; + private World world; @FXML @@ -26,12 +49,24 @@ public class GameController { @FXML private Label hits; + @FXML + private TextField nameField; + + @FXML + private ListView<Score> scoreList; + + private List<Score> highScores; + private AnimationTimer animationTimer; public GameController() { } public void startGame() { + scoreList.setItems(FXCollections.observableList(new LinkedList<>())); + highScores = scoreList.getItems(); + + this.world = new World(canvas.getWidth(), canvas.getHeight()); this.world.setGameListener(new GameListenerImpl()); //Draw scene on a separate thread to avoid blocking UI. @@ -55,6 +90,54 @@ public class GameController { world.fire(); } + @FXML + private void gameOver() { + Random rnd = new Random(); + int score = rnd.nextInt(11); + highScores.add(new Score(nameField.getText(), score)); + highScores.sort(comparingInt(Score::getScore).reversed()); + + } + + @FXML + private void highScores() { + Set<Score> tempSet = new LinkedHashSet<>(); + tempSet.addAll(highScores); + highScores.clear(); + highScores.addAll(tempSet); + } + + @FXML + private void save() { + try(PrintWriter pw = new PrintWriter(new FileWriter(FILE_NAME))) { + for (Score score: highScores) { + pw.printf("%s;%d\n", score.getName(), score.getScore()); + } + + /*Iterator<Score> iterator = highScores.iterator(); + while (iterator.hasNext()) { + Score score = iterator.next(); + pw.printf("%s;%d\n", score.getName(), score.getScore()); + iterator.remove(); + }*/ + } catch (IOException e) { + e.printStackTrace(); + } + } + + @FXML + private void load() { + highScores.clear(); + try (Scanner scanner = new Scanner(new File(FILE_NAME)).useDelimiter("[;\\n]")) { + while(scanner.hasNext()) { + String name = scanner.next(); + int value = scanner.nextInt(); + highScores.add(new Score(name, value)); + } + } catch (IOException e) { + e.printStackTrace(); + } + } private void angleChanged(ObservableValue<? extends Number> observable , Number oldValue, Number newValue) { diff --git a/src/main/java/lab/Score.java b/src/main/java/lab/Score.java new file mode 100644 index 0000000000000000000000000000000000000000..6e5ffb4b9a119b75017dfce17f328852a3d50f5b --- /dev/null +++ b/src/main/java/lab/Score.java @@ -0,0 +1,38 @@ +package lab; + +public class Score { + private final String name; + private final int score; + + public Score(String name, int score) { + this.name = name; + this.score = score; + } + + public String getName() { + return name; + } + + public int getScore() { + return score; + } + + + @Override + public String toString() { + return name + ": " + score; + } + + @Override + public boolean equals(Object obj) { + if (obj instanceof Score other) { + return this.name.equals(other.name); + } + return false; + } + + @Override + public int hashCode() { + return name.hashCode(); + } +} diff --git a/src/main/java/lab/Score2.java b/src/main/java/lab/Score2.java new file mode 100644 index 0000000000000000000000000000000000000000..88cd8b126f7c96c13162e6c3c214f14041eba445 --- /dev/null +++ b/src/main/java/lab/Score2.java @@ -0,0 +1,8 @@ +package lab; + +public record Score2(String name, int score) { + + + + +} diff --git a/src/main/java/lab/World.java b/src/main/java/lab/World.java index 65dc08fdc44503487e64cf12d36ad10e48d21286..04bc1c2e98d4beb5d6b1f28d2f44616716d407d7 100644 --- a/src/main/java/lab/World.java +++ b/src/main/java/lab/World.java @@ -21,7 +21,6 @@ public class World { private DrawableSimulable []entities; public World(double width, double height) { - super(); this.width = width; this.height = height; Cannon cannon = new Cannon(this, new Point2D(50, 50), new Point2D(100, 20)); diff --git a/src/main/resources/lab/GameView.fxml b/src/main/resources/lab/GameView.fxml index e0732c4641c1ecbf46598064b90e1aa66c27711e..0ca87357c0b4395f9e417acf324fbf61ef6ca532 100644 --- a/src/main/resources/lab/GameView.fxml +++ b/src/main/resources/lab/GameView.fxml @@ -5,14 +5,17 @@ <?import javafx.scene.canvas.Canvas?> <?import javafx.scene.control.Button?> <?import javafx.scene.control.Label?> +<?import javafx.scene.control.ListView?> <?import javafx.scene.control.Slider?> +<?import javafx.scene.control.TextField?> <?import javafx.scene.layout.BorderPane?> <?import javafx.scene.layout.ColumnConstraints?> <?import javafx.scene.layout.GridPane?> <?import javafx.scene.layout.HBox?> <?import javafx.scene.layout.RowConstraints?> +<?import javafx.scene.layout.VBox?> -<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/17" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.GameController"> +<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" xmlns="http://javafx.com/javafx/18" xmlns:fx="http://javafx.com/fxml/1" fx:controller="lab.GameController"> <bottom> <HBox alignment="CENTER" BorderPane.alignment="CENTER_LEFT"> <children> @@ -41,11 +44,25 @@ <Label text="Shoots:" /> <Label fx:id="shoots" text="0" GridPane.columnIndex="1" /> <Label text="Hits:" GridPane.rowIndex="1" /> - <Label fx:id="hits" text="0" GridPane.rowIndex="1" GridPane.columnIndex="1" /> + <Label fx:id="hits" text="0" GridPane.columnIndex="1" GridPane.rowIndex="1" /> </children> </GridPane> <Canvas fx:id="canvas" height="400.0" width="600.0" /> </children> </Group> </center> + <left> + <VBox prefWidth="100.0" BorderPane.alignment="CENTER"> + <children> + <TextField fx:id="nameField" /> + <Button mnemonicParsing="false" onAction="#gameOver" prefWidth="100.0" text="Game Over" /> + <Button mnemonicParsing="false" onAction="#highScores" prefWidth="100.0" text="High Scores" /> + <Button mnemonicParsing="false" onAction="#save" prefWidth="100.0" text="Save" /> + <Button mnemonicParsing="false" onAction="#load" prefWidth="100.0" text="Load" /> + </children> + </VBox> + </left> + <right> + <ListView fx:id="scoreList" prefWidth="200.0" BorderPane.alignment="CENTER" /> + </right> </BorderPane>