feat: good leaderboard

This commit is contained in:
2025-02-01 00:09:25 +01:00
parent a160042ef4
commit a5c046f891
6 changed files with 74 additions and 11 deletions

View File

@@ -1,6 +1,9 @@
package game; package game;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import sudoku.structure.MultiDoku; import sudoku.structure.MultiDoku;
@@ -12,11 +15,13 @@ public class Game {
} }
private final Map<Integer, Player> players; private final Map<Integer, Player> players;
private final List<Player> leaderboard;
private GameState gameState; private GameState gameState;
private MultiDoku doku; private MultiDoku doku;
public Game() { public Game() {
this.players = new HashMap<>(); this.players = new HashMap<>();
this.leaderboard = new ArrayList<>();
this.gameState = GameState.GameNotStarted; this.gameState = GameState.GameNotStarted;
} }
@@ -26,10 +31,18 @@ public class Game {
public void addPlayer(Player player) { public void addPlayer(Player player) {
players.put(player.getId(), 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) { public void removePlayer(int id) {
players.remove(id); this.leaderboard.remove(getPlayerById(id));
this.players.remove(id);
} }
public Map<Integer, Player> getPlayers() { public Map<Integer, Player> getPlayers() {
@@ -49,4 +62,8 @@ public class Game {
return doku; return doku;
} }
public List<Player> getLeaderboard() {
return leaderboard;
}
} }

View File

@@ -20,7 +20,7 @@ public class Player implements Serializable {
return score; return score;
} }
public void setScore(int score) { void setScore(int score) {
this.score = score; this.score = score;
} }

View File

@@ -3,23 +3,69 @@ package gui.widget;
import game.Game; import game.Game;
import game.Player; import game.Player;
import imgui.ImGui; import imgui.ImGui;
import imgui.ImVec2;
import imgui.ImVec4;
import imgui.flag.ImGuiCol;
import imgui.flag.ImGuiStyleVar;
public class LeaderboardRenderer { public class LeaderboardRenderer {
private final Game game; private final Game game;
private final Player currentPlayer; 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) { public LeaderboardRenderer(Game game, Player player) {
this.game = game; this.game = game;
this.currentPlayer = player; 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() { public void render() {
ImGui.text("Leaderboard"); ImGui.text("Placeholder for timer");
for (var entry : game.getPlayers().entrySet()) { var displaySize = ImGui.getIO().getDisplaySize();
Player player = entry.getValue(); ImGui.setCursorPosX(displaySize.x / 2.0f - cellSize.x / 2.0f);
ImGui.text(player.getPseudo() + " : " + player.getScore()); 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();
} }
} }

View File

@@ -107,7 +107,7 @@ public class SudokuRenderer {
if (offsetX > 0) { if (offsetX > 0) {
ImGui.setCursorPosX(offsetX); 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.FrameBorderSize, 2.0f);
ImGui.pushStyleVar(ImGuiStyleVar.ItemSpacing, new ImVec2(0.0f, 0.0f)); ImGui.pushStyleVar(ImGuiStyleVar.ItemSpacing, new ImVec2(0.0f, 0.0f));

View File

@@ -85,7 +85,7 @@ public class ClientConnexion extends Connexion {
public void visitPacket(UpdatePlayerScorePacket packet) { public void visitPacket(UpdatePlayerScorePacket packet) {
Player player = this.client.getGame().getPlayerById(packet.getPlayerId()); Player player = this.client.getGame().getPlayerById(packet.getPlayerId());
assert(player != null); assert(player != null);
player.setScore(packet.getCellsLeft()); this.client.getGame().setPlayerScore(player, packet.getCellsLeft());
System.out.println("Score for " + player.getPseudo() + " : " + packet.getCellsLeft()); System.out.println("Score for " + player.getPseudo() + " : " + packet.getCellsLeft());
} }

View File

@@ -135,13 +135,13 @@ public class ServerConnexion extends Connexion {
} }
if (cell.getSymbolIndex() != Cell.NOSYMBOL && packet.getNewValue() == Cell.NOSYMBOL) { if (cell.getSymbolIndex() != Cell.NOSYMBOL && packet.getNewValue() == Cell.NOSYMBOL) {
cell.empty(); cell.empty();
player.setScore(player.getScore() + 1); this.server.getGame().setPlayerScore(player, player.getScore() + 1);
this.server.broadcastPacket(new UpdatePlayerScorePacket(player.getId(), player.getScore())); this.server.broadcastPacket(new UpdatePlayerScorePacket(player.getId(), player.getScore()));
return; return;
} }
// on rajoute un chiffre à la grille // on rajoute un chiffre à la grille
if (cell.trySetValue(packet.getNewValue())) { 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())); this.server.broadcastPacket(new UpdatePlayerScorePacket(player.getId(), player.getScore()));
} }
} }
@@ -149,7 +149,7 @@ public class ServerConnexion extends Connexion {
public void setSudoku(MultiDoku doku) { public void setSudoku(MultiDoku doku) {
this.doku = doku; this.doku = doku;
assert (player != null); 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())); this.server.broadcastPacket(new UpdatePlayerScorePacket(player.getId(), player.getScore()));
} }