feat: good leaderboard
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user