From a5c046f89167a31025af1caa67eea99643f5455e Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Sat, 1 Feb 2025 00:09:25 +0100 Subject: [PATCH] feat: good leaderboard --- app/src/main/java/game/Game.java | 19 ++++++- app/src/main/java/game/Player.java | 2 +- .../java/gui/widget/LeaderboardRenderer.java | 54 +++++++++++++++++-- .../main/java/gui/widget/SudokuRenderer.java | 2 +- .../java/network/client/ClientConnexion.java | 2 +- .../java/network/server/ServerConnexion.java | 6 +-- 6 files changed, 74 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/game/Game.java b/app/src/main/java/game/Game.java index 4daf004..ad4d2e6 100644 --- a/app/src/main/java/game/Game.java +++ b/app/src/main/java/game/Game.java @@ -1,6 +1,9 @@ package game; +import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import sudoku.structure.MultiDoku; @@ -12,11 +15,13 @@ public class Game { } private final Map players; + private final List leaderboard; private GameState gameState; private MultiDoku doku; public Game() { this.players = new HashMap<>(); + this.leaderboard = new ArrayList<>(); this.gameState = GameState.GameNotStarted; } @@ -26,10 +31,18 @@ public class Game { public void addPlayer(Player player) { players.put(player.getId(), player); + leaderboard.add(player); + } + + public void setPlayerScore(Player player, int newScore) { + player.setScore(newScore); + Collections.sort(this.leaderboard, + (player1, player2) -> Integer.compare(player1.getScore(), player2.getScore())); } public void removePlayer(int id) { - players.remove(id); + this.leaderboard.remove(getPlayerById(id)); + this.players.remove(id); } public Map getPlayers() { @@ -49,4 +62,8 @@ public class Game { return doku; } + public List getLeaderboard() { + return leaderboard; + } + } diff --git a/app/src/main/java/game/Player.java b/app/src/main/java/game/Player.java index 9c76a5f..cfcda50 100644 --- a/app/src/main/java/game/Player.java +++ b/app/src/main/java/game/Player.java @@ -20,7 +20,7 @@ public class Player implements Serializable { return score; } - public void setScore(int score) { + void setScore(int score) { this.score = score; } diff --git a/app/src/main/java/gui/widget/LeaderboardRenderer.java b/app/src/main/java/gui/widget/LeaderboardRenderer.java index d87efc2..461ece4 100644 --- a/app/src/main/java/gui/widget/LeaderboardRenderer.java +++ b/app/src/main/java/gui/widget/LeaderboardRenderer.java @@ -3,23 +3,69 @@ package gui.widget; import game.Game; import game.Player; import imgui.ImGui; +import imgui.ImVec2; +import imgui.ImVec4; +import imgui.flag.ImGuiCol; +import imgui.flag.ImGuiStyleVar; public class LeaderboardRenderer { private final Game game; private final Player currentPlayer; + private final float cellHeight = 75; + private final ImVec2 cellSize = new ImVec2(12 * cellHeight, cellHeight); + private final ImVec2 rankSize = new ImVec2(cellHeight, cellHeight); + private final ImVec2 scoreSize = rankSize; + private final ImVec2 nameSize = new ImVec2(cellSize.x - cellHeight * 2.0f, cellHeight); + private final ImVec4 cellColorPlayer = new ImVec4(0.20f, 0.67f, 1.0f, 0.5f); + private final ImVec4 cellColorEnemy = new ImVec4(1.0f, 0.0f, 0.0f, 0.5f); + private final int maxPlayersShowed = 2; + public LeaderboardRenderer(Game game, Player player) { this.game = game; this.currentPlayer = player; } + private void renderRank(int rank) { + ImGui.button(Integer.toString(rank), rankSize); + } + + private void renderName(String name) { + ImGui.button(name, nameSize); + } + + private void renderScore(int score) { + ImGui.button(Integer.toString(score), scoreSize); + } + + private void renderCell(Player player, int rank, ImVec4 color) { + ImGui.pushStyleColor(ImGuiCol.Button, color); + ImGui.pushStyleColor(ImGuiCol.ButtonHovered, color); + ImGui.pushStyleColor(ImGuiCol.ButtonActive, color); + ImGui.beginChild(player.getPseudo() + "##" + player.getId(), cellSize); + renderRank(rank); + ImGui.sameLine(); + renderName(player.getPseudo()); + ImGui.sameLine(); + renderScore(player.getScore()); + ImGui.endChild(); + ImGui.popStyleColor(3); + } + public void render() { - ImGui.text("Leaderboard"); - for (var entry : game.getPlayers().entrySet()) { - Player player = entry.getValue(); - ImGui.text(player.getPseudo() + " : " + player.getScore()); + ImGui.text("Placeholder for timer"); + var displaySize = ImGui.getIO().getDisplaySize(); + ImGui.setCursorPosX(displaySize.x / 2.0f - cellSize.x / 2.0f); + ImGui.beginChild("Leaderboard", new ImVec2(cellSize.x + 15.0f, cellHeight * maxPlayersShowed)); + ImGui.pushStyleVar(ImGuiStyleVar.ItemSpacing, new ImVec2()); + ImGui.pushStyleVar(ImGuiStyleVar.FrameBorderSize, 3.0f); + for (int i = 0; i < game.getLeaderboard().size(); i++) { + Player player = game.getLeaderboard().get(i); + renderCell(player, i + 1, player == currentPlayer ? cellColorPlayer : cellColorEnemy); } + ImGui.popStyleVar(2); + ImGui.endChild(); } } diff --git a/app/src/main/java/gui/widget/SudokuRenderer.java b/app/src/main/java/gui/widget/SudokuRenderer.java index fb56168..4b38cf1 100644 --- a/app/src/main/java/gui/widget/SudokuRenderer.java +++ b/app/src/main/java/gui/widget/SudokuRenderer.java @@ -107,7 +107,7 @@ public class SudokuRenderer { if (offsetX > 0) { ImGui.setCursorPosX(offsetX); } - ImGui.beginChild(1, new ImVec2(cellSize.x * doku.getWidth(), cellSize.y * doku.getHeight())); + ImGui.beginChild("sudokuChild", new ImVec2(cellSize.x * doku.getWidth(), cellSize.y * doku.getHeight())); ImGui.pushStyleVar(ImGuiStyleVar.FrameBorderSize, 2.0f); ImGui.pushStyleVar(ImGuiStyleVar.ItemSpacing, new ImVec2(0.0f, 0.0f)); diff --git a/app/src/main/java/network/client/ClientConnexion.java b/app/src/main/java/network/client/ClientConnexion.java index 3f6bfad..83eadf2 100644 --- a/app/src/main/java/network/client/ClientConnexion.java +++ b/app/src/main/java/network/client/ClientConnexion.java @@ -85,7 +85,7 @@ public class ClientConnexion extends Connexion { public void visitPacket(UpdatePlayerScorePacket packet) { Player player = this.client.getGame().getPlayerById(packet.getPlayerId()); assert(player != null); - player.setScore(packet.getCellsLeft()); + this.client.getGame().setPlayerScore(player, packet.getCellsLeft()); System.out.println("Score for " + player.getPseudo() + " : " + packet.getCellsLeft()); } diff --git a/app/src/main/java/network/server/ServerConnexion.java b/app/src/main/java/network/server/ServerConnexion.java index 4206c17..61ba7bb 100644 --- a/app/src/main/java/network/server/ServerConnexion.java +++ b/app/src/main/java/network/server/ServerConnexion.java @@ -135,13 +135,13 @@ public class ServerConnexion extends Connexion { } if (cell.getSymbolIndex() != Cell.NOSYMBOL && packet.getNewValue() == Cell.NOSYMBOL) { cell.empty(); - player.setScore(player.getScore() + 1); + this.server.getGame().setPlayerScore(player, player.getScore() + 1); this.server.broadcastPacket(new UpdatePlayerScorePacket(player.getId(), player.getScore())); return; } // on rajoute un chiffre à la grille if (cell.trySetValue(packet.getNewValue())) { - player.setScore(player.getScore() - 1); + this.server.getGame().setPlayerScore(player, player.getScore() - 1); this.server.broadcastPacket(new UpdatePlayerScorePacket(player.getId(), player.getScore())); } } @@ -149,7 +149,7 @@ public class ServerConnexion extends Connexion { public void setSudoku(MultiDoku doku) { this.doku = doku; assert (player != null); - player.setScore(this.doku.getEmptyCells().size()); + this.server.getGame().setPlayerScore(player, this.doku.getEmptyCells().size()); this.server.broadcastPacket(new UpdatePlayerScorePacket(player.getId(), player.getScore())); }