From 77a14ab64b95afec9c3a0ea9f2444e6315481ed6 Mon Sep 17 00:00:00 2001
From: koz01 <koz01@PCCPIT1V203-040.msad.vsb.cz>
Date: Mon, 31 Oct 2022 12:15:50 +0100
Subject: [PATCH] solution

---
 src/main/java/lab/GameController.java | 83 +++++++++++++++++++++++++++
 src/main/java/lab/Score.java          | 41 +++++++++++++
 src/main/resources/lab/GameView.fxml  | 21 ++++++-
 3 files changed, 143 insertions(+), 2 deletions(-)
 create mode 100644 src/main/java/lab/Score.java

diff --git a/src/main/java/lab/GameController.java b/src/main/java/lab/GameController.java
index 9d52ea1..5fe297c 100644
--- a/src/main/java/lab/GameController.java
+++ b/src/main/java/lab/GameController.java
@@ -1,11 +1,26 @@
 	package lab;
 
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Random;
+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 {
 
@@ -26,12 +41,23 @@ public class GameController {
 	@FXML
 	private Label hits;
 	
+	@FXML
+	private TextField name;
+	
+	@FXML
+	private ListView<Score> highScores;
+	
+	private List<Score> scores;
+	
+	
 	private AnimationTimer animationTimer;
 	
 	public GameController() {
 	}
 	
 	public void startGame() {
+		scores = new LinkedList<>();
+		highScores.setItems(FXCollections.observableList(scores));
 		this.world = new World(canvas.getWidth(), canvas.getHeight());
 		this.world.setGameListener(new GameListenerImpl());
 		//Draw scene on a separate thread to avoid blocking UI.
@@ -80,4 +106,61 @@ public class GameController {
 		}
 		
 	}
+	
+	@FXML
+	private void gameOver() {
+		Random rnd = new Random();
+		int value = rnd.nextInt(101);
+		Score score = new Score(value, name.getText());
+		scores.add(score);
+		Collections.sort(scores,(o1, o2) ->  Integer.compare(o2.getScore(), o1.getScore()));
+		//Collections.sort(scores, comparing((Score::getScore)));
+		highScores.setItems(FXCollections.observableList(scores));
+	}
+	
+	@FXML
+	private void highScore() {
+		Set<Score> tempSet= new HashSet<>(scores);
+		/*
+		Iterator<Score> iter =  scores.iterator();
+		while (iter.hasNext()) {
+			Score val = iter.next();
+			
+			
+		}
+		for(Score score: scores) {
+			tempSet.add(score);
+		}
+	*/
+		scores.clear();
+		scores.addAll(tempSet);
+		highScores.setItems(FXCollections.observableList(scores));
+	}
+	
+	@FXML
+	private void load() {
+		scores.clear();
+		try (BufferedReader br = new BufferedReader(new FileReader("data.csv"))){
+			String line;
+			while (null != (line = br.readLine())) {
+				String [] token = line.split(";");
+				Score score = new Score(Integer.parseInt(token[1]),token[0]);
+				scores.add(score);
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		highScores.setItems(FXCollections.observableList(scores));
+	}
+	
+	@FXML
+	private void save() {
+		try (PrintWriter pw = new PrintWriter(new FileWriter("data.csv"))) {
+			for (Score score: scores) {
+				pw.printf("%s;%d\n", score.getName(), score.getScore());
+			}
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+	}
 }
diff --git a/src/main/java/lab/Score.java b/src/main/java/lab/Score.java
new file mode 100644
index 0000000..ad31f4e
--- /dev/null
+++ b/src/main/java/lab/Score.java
@@ -0,0 +1,41 @@
+package lab;
+
+final public class Score {
+
+	private final int score;
+	
+	private final String name;
+
+	public Score(int score, String name) {
+		this.score = score;
+		this.name = name;
+	}
+
+	public int getScore() {
+		return score;
+	}
+	
+	public String getName() {
+		return name;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (obj instanceof Score other) {
+			return name.equals(other.name);
+		}
+		return false;
+	}
+	
+	@Override
+	public int hashCode() {
+		return name.hashCode();
+	}
+
+	
+	@Override
+	public String toString() {
+		return name + ": " + score;
+	}
+	
+}
diff --git a/src/main/resources/lab/GameView.fxml b/src/main/resources/lab/GameView.fxml
index e0732c4..ae527f3 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 prefHeight="200.0" prefWidth="100.0" BorderPane.alignment="CENTER">
+         <children>
+            <TextField fx:id="name" />
+            <Button fx:id="gameOverBtn" mnemonicParsing="false" onAction="#gameOver" prefHeight="25.0" prefWidth="114.0" text="Game over" VBox.vgrow="ALWAYS" />
+            <Button fx:id="highScoresBtn" mnemonicParsing="false" onAction="#highScore" prefHeight="25.0" prefWidth="108.0" text="High scores" />
+            <Button fx:id="saveScoreBtn" mnemonicParsing="false" onAction="#save" prefHeight="25.0" prefWidth="113.0" text="Save Score" />
+            <Button fx:id="loadScoreBtn" mnemonicParsing="false" onAction="#load" prefHeight="25.0" prefWidth="118.0" text="Load Score" />
+         </children>
+      </VBox>
+   </left>
+   <right>
+      <ListView fx:id="highScores" BorderPane.alignment="CENTER" />
+   </right>
 </BorderPane>
-- 
GitLab