Changes by kmitr

This commit is contained in:
Lucàs
2024-04-30 15:45:18 +02:00
parent 275ad640dc
commit 63be0be8da
12 changed files with 287 additions and 49 deletions
@@ -74,4 +74,11 @@ public class Card {
", value=" + value +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Card card)) return false;
return getColor() == card.getColor() && getValue() == card.getValue();
}
}
@@ -289,7 +289,7 @@ public class Game implements Serializable {
}
/**
* Tri des joueurs de la partie par score
* Tri des joueurs de la partie par score puis par rapidité
*/
public void sortPlayersByScoreAndRapidity() {
players.sort((p1, p2) -> {
@@ -305,9 +305,9 @@ public class Game implements Serializable {
*
* @return le nom du gagnant
*/
public String getWinner(){
sortPlayersByScore();
return players.get(0).getUser().getUsername();
public Player getWinner(){
this.sortPlayersByScoreAndRapidity();
return players.get(0);
}
/**
@@ -257,7 +257,7 @@ public class Player implements Serializable {
*/
public double getRatioRightClick() {
if (clickCount == 0 || rightClickCount == 0) return 0;
return (double) Math.abs(rightClickCount * 10000 / clickCount) / 100;
return (double) Math.abs(rightClickCount * 10000 / game.getNbRounds()) / 100;
}
/**
@@ -288,7 +288,7 @@ public class Player implements Serializable {
*/
public double getRatioRapidClick() {
if (clickCount == 0 || rapidClickCount == 0) return 0;
return (double) Math.abs(rapidClickCount * 10000 / clickCount) / 100;
return (double) Math.abs(rapidClickCount * 10000 / game.getNbRounds()) / 100;
}
public Deck getDeck() {
@@ -22,6 +22,9 @@ public class GameStatisticsServlet extends HttpServlet {
try {
DAO<Game> gameDAO = new Game_JPA_DAO_Factory().getDAOGame();
game = gameDAO.findById(Integer.parseInt(request.getParameter("id")));
for(Player p : game.getPlayers()) {
System.out.println(p.toString());
}
request.removeAttribute("id");
game.sortPlayersByScoreAndRapidity();
request.setAttribute("game", game);
@@ -0,0 +1,18 @@
package uppa.project.web.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(name = "rulesServlet", value = "/rules")
public class RulesServlet extends HttpServlet {
public void init() {
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
request.getRequestDispatcher("/WEB-INF/pages/rules.jsp").forward(request, response);
}
}
@@ -11,6 +11,7 @@ import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import uppa.project.database.dao.DAO;
import uppa.project.database.dao.DAOException;
import uppa.project.database.dao.EntityManagerProvider;
@@ -106,45 +107,90 @@ public class GameWS {
if (gameClickCount == 1) player.incrementRapidClickCount();
// Check if the player has clicked on the right card
switch (choice) {
case COLOR_VALUE -> {
if (gameCard.getColor().equals(playerCard.getColor()) && gameCard.getValue() == playerCard.getValue()) {
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore - 1);
}
}
case COLOR -> {
if (gameCard.getColor().equals(playerCard.getColor())) {
if (gameCard.getValue() != playerCard.getValue()) {
if (game.getDifficulty().equals(Game.Difficulty.EASY)) {
switch (choice) {
case COLOR_VALUE -> {
if (gameCard.equals(playerCard)) {
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore + 1);
player.setScore(playerScore - 1);
}
} else {
player.setScore(playerScore - 1);
}
}
case VALUE -> {
if(gameCard.getValue() == playerCard.getValue()) {
if (!gameCard.getColor().equals(playerCard.getColor())) {
case COLOR -> {
if (gameCard.getColor().equals(playerCard.getColor())) {
if (gameCard.getValue() != playerCard.getValue()) {
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore + 1);
}
} else {
player.setScore(playerScore - 1);
}
}
case VALUE -> {
if (gameCard.getValue() == playerCard.getValue()) {
if (!gameCard.getColor().equals(playerCard.getColor())) {
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore + 1);
}
} else {
player.setScore(playerScore - 1);
}
}
case NONE -> {
if (!gameCard.getColor().equals(playerCard.getColor()) && gameCard.getValue() != playerCard.getValue()) {
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore + 1);
player.setScore(playerScore - 1);
}
} else {
player.setScore(playerScore - 1);
}
}
case NONE -> {
if (!gameCard.getColor().equals(playerCard.getColor()) && gameCard.getValue() != playerCard.getValue()) {
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore - 1);
} else {
int nbSameCard = countSameCard(gameCard, game.getPlayers(), game.getCurrentRound());
int nbSameColor = countSameColor(gameCard, game.getPlayers(), game.getCurrentRound());
int nbSameValue = countSameValue(gameCard, game.getPlayers(), game.getCurrentRound());
int nbNone = countNone(gameCard, game.getPlayers(), game.getCurrentRound());
switch (choice) {
case COLOR_VALUE -> {
if ((nbSameCard >= nbSameColor) && (nbSameCard >= nbSameValue) && (nbSameCard >= nbNone)) {
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore - 1);
}
}
case COLOR -> {
if ((nbSameCard >= nbSameColor) && (nbSameCard >= nbSameValue) && (nbSameCard >= nbNone)) {
player.setScore(playerScore + 1);
} else if ((nbSameColor > nbSameCard) && (nbSameColor >= nbSameValue) && (nbSameColor >= nbNone)) {
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore - 1);
}
}
case VALUE -> {
if ((nbSameCard >= nbSameColor) && (nbSameCard >= nbSameValue) && (nbSameCard >= nbNone)) {
player.setScore(playerScore + 1);
} else if ((nbSameValue > nbSameCard) && (nbSameValue > nbSameColor) && (nbSameValue >= nbNone)) {
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore - 1);
}
}
case NONE -> {
if ((nbNone > nbSameCard) && (nbNone >= nbSameColor) && (nbNone > nbSameValue)){
player.incrementRightClickCount();
player.setScore(playerScore + 2);
} else {
player.setScore(playerScore - 1);
}
}
}
}
@@ -194,6 +240,78 @@ public class GameWS {
}
}
/**
* Retourne le nombre de joueurs avec une carte identique à celle du plateau
* @param gameCard carte du plateau
* @param players liste des joueurs
* @param currentRound manche courante
* @return nombre de cartes identiques à celle du plateau
*/
private int countSameCard(Card gameCard, List<Player> players, int currentRound) {
int counter = 0;
for (Player player : players) {
Card card = player.getDeck().getCards().get(currentRound);
if (gameCard.equals(card)) {
counter ++;
}
}
return counter;
}
/**
* Retourne le nombre de joueurs avec une carte avec seulement la couleur correspondante à celle du plateau
* @param gameCard
* @param players
* @param currentRound
* @return nombre de couleurs identiques à celle du plateau
*/
private int countSameColor(Card gameCard, List<Player> players, int currentRound) {
int counter = 0;
for (Player player : players) {
Card card = player.getDeck().getCards().get(currentRound);
if (gameCard.getColor().equals(card.getColor()) && !gameCard.getValue().equals(card.getValue())) {
counter ++;
}
}
return counter;
}
/**
* Retourne le nombre de joueurs avec une carte avec seulement la valeur correspondante à celle du plateau
* @param gameCard carte du plateau
* @param players liste des joueurs
* @param currentRound manche courante
* @return nombre de valeurs identiques à celle du plateau
*/
private int countSameValue(Card gameCard, List<Player> players, int currentRound) {
int counter = 0;
for (Player player : players) {
Card card = player.getDeck().getCards().get(currentRound);
if (gameCard.getValue().equals(card.getValue()) && !gameCard.getColor().equals(card.getColor())) {
counter ++;
}
}
return counter;
}
/**
* Retourne le nombre de joueurs avec une carte totalement différente de celle du plateau
* @param gameCard
* @param players
* @param currentRound
* @return nombre de cartes totalement différentes de celle du plateau
*/
private int countNone(Card gameCard, List<Player> players, int currentRound) {
int counter = 0;
for (Player player : players) {
Card card = player.getDeck().getCards().get(currentRound);
if (!gameCard.getColor().equals(card.getColor()) && !gameCard.getValue().equals(card.getValue())) {
counter ++;
}
}
return counter;
}
private void broadcast(String message) {
for (Player player : games.get(game)) {
try {
@@ -46,18 +46,19 @@
<div id="gameStarted" style="display:none;">
<div class="columns" id="otherCards"></div>
<div class="columns">
<div class="column" id="deck"></div>
<div class="column" id="choice">
<button class="button" data-value="COLOR_VALUE">Même couleur et valeur</button>
<button class="button" data-value="VALUE">Même valeur</button>
<button class="button" data-value="COLOR">Même couleur</button>
<button class="button" data-value="NONE">Aucun</button>
<div class="column is-flex is-flex-direction-column is-align-items-center" id="deck"></div>
<div class="column is-one-quarter is-justify-content-center" id="choice"
style="position: absolute; right: 0; z-index: 9999">
<div class="buttons is-flex-direction-column">
<p id="round"></p>
<button class="button is-fullwidth" data-value="COLOR_VALUE">Même couleur et valeur</button>
<button class="button is-fullwidth" data-value="COLOR">Même couleur</button>
<button class="button is-fullwidth" data-value="VALUE">Même valeur</button>
<button class="button is-fullwidth" data-value="NONE">Aucun</button>
</div>
</div>
</div>
<div class="columns">
<div class="column" id="myCard">
</div>
<div class="columns is-centered" id="myCard">
</div>
</div>
</component:hero>
@@ -10,7 +10,7 @@
<component:card title="Menu principal">
<ul>
<li><a href="${pageContext.request.contextPath}/new">Nouvelle partie</a></li>
<%-- <li><a href="${pageContext.request.contextPath}/join">Rejoindre une partie</a></li>--%>
<li><a href="${pageContext.request.contextPath}/rules">Règles du jeu</a></li>
</ul>
</component:card>
</div>
@@ -0,0 +1,81 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="layout" tagdir="/WEB-INF/tags/layouts" %>
<%@taglib prefix="component" tagdir="/WEB-INF/tags/components" %>
<layout:base title="Règles du jeu">
<component:hero>
<div class="columns">
<div class="column">
<component:card title="Règles du jeu">
<div class="content">
<div class="is-flex is-justify-content-center">
<img class="py-5" src="${pageContext.request.contextPath}/static/img/CardsRushLogoBlack.svg"/>
</div>
<p>
Card Rush est un jeu de rapidité multijoueur en ligne.<br>
Chaque joueur possède un jeu de carte identique mélangé aléatoirement. Au centre du plateau un jeu de carte
similaire.<br>
Votre objectif si vous l'acceptez, identifier les similitudes entre votre main et celle du plateau le plus
rapidement possible.
Plusieurs choix sont possibles:
</p>
<ul>
<li>Les cartes comparées sont identiques</li>
<li>Les cartes comparées ont la même couleur mais pas la même valeur</li>
<li>Les cartes comparées ont la même valeur mais pas la même couleur</li>
<li>Les cartes comparées sont totalement différentes</li>
</ul>
<h2 class="title is-5">Modes de difficultés</h2>
<p>Deux modes de difficultés s'offrent à vous :</p>
<ul>
<li><p>Le mode <span class="tag is-light is-medium is-primary">facile</span>: Vous ne devez effectuer des
comparaisons uniquement entre voter main et celle du plateau.</p>
<p>
Exemple : <br>
Vous : 4 de pique <br>
Plateau : 4 de trèfle <br>
La réponse à selectionner est "Même valeur".
</p>
</li>
<li><p>Le mode <span class="tag is-light is-medium is-primary">difficile</span>: Vous devez effectuer des
comparaisons avec les mains de chaque joueur et opter pour la réponse correspondant aux plus grand nombre
de joueur</p>
<p>
Exemple: (4 joueurs) <br>
Joueur 1 : 4 de pique <br>
Joueur 2 : Roi de carreau <br>
Joueur 3 : 4 de coeur <br>
Joueur 4 : As de pique <br>
Plateau : Roi de pique <br>
La réponse à selectionner est "Même couleur" car elle représente 2 joueurs sur les 4.
</p></li>
</ul>
<h2 >Gestion des scores</h2>
<p>Les scores sont définits comme suit:</p>
<ul>
<li>Bonne réponse : <span class="tag is-success">+2pts</span></li>
<li>Réponse partielle : <span class="tag is-success">+1pt</span> (Exemple: la carte est identique mais le joueur a identifié une similitude
uniquement sur la couleur (resp. la valeur)
</li>
<li>Aucune réponse : <span class="tag is-light">+0pt</span></li>
<li>Mauvaise réponse : <span class="tag is-danger">-1pt</span></li>
</ul>
<h2 class="title is-5">Vainqueur de la partie</h2>
<p>Le vainqueur d'une partie est celui qui aura accumulé le plus de points, en cas d'égalité, le joueur le plus rapide est déclaré vainqueur.<br>
Si l'égalité subsiste, des manches supplémentaires départagerons les joueurs.</p>
<h3 class="is-justify-content-centered"> Alors affûtez votre agilité et visez
la victoire!</h3>
<a href="${pageContext.request.contextPath}/lobby" class="button is-light is-right">
<span class="icon">
<i class="fa-solid fa-arrow-left"></i>
</span>
<span>Retour</span>
</a>
</div>
</component:card>
</div>
</div>
</component:hero>
</layout:base>
@@ -71,7 +71,7 @@
<td><%= player.getScore() %></td>
<td><%= player.getRightClickCount() %> (<%= player.getRatioRightClick() %>%)</td>
<td><%= player.getRapidClickCount() %> (<%= player.getRatioRapidClick()%>%)</td>
<td><% if (player.getUser().getUsername().equals(game.getWinner())){ %> <i class="fa-solid fa-crown" style="color: #FFD43B;"></i> <% } %></td>
<td><% if (player.getUser().getUsername().equals(game.getWinner().getUser().getUsername())){ %> <i class="fa-solid fa-crown" style="color: #FFD43B;"></i> <% } %></td>
</tr>
<% } %>
</tbody>
@@ -79,10 +79,19 @@
<div class="navbar-item">
<% if (request.getParameter("endGame") != null){ %>
<a href="${pageContext.request.contextPath}/lobby" class="button is-light is-right">
<span class="icon">
<i class="fa-solid fa-arrow-left"></i>
</span>
<span>Retour</span>
</a>
<% } else {%>
<a href="${pageContext.request.contextPath}/profile" class="button is-light is-right">
<span class="icon">
<i class="fa-solid fa-arrow-left"></i>
</span>
<span>Retour</span>
</a>
<%}%>
</div>
@@ -29,8 +29,6 @@
</div>
</div>
<%-- TODO: Si le temps nous le permet, mettre en place un système de pagination --%>
<h4 class="title is-4">Parties jouées </h4>
<table class="table is-fullwidth">
<thead>
@@ -44,11 +42,12 @@
<tbody>
<% for (int i = 0; i < user.getPlayedGames().size(); i++) {
Player player = user.getPlayedGames().get(i);
System.out.println(player.toString());
%>
<tr>
<td><%= player.getGame().getCreatedAt().toLocaleString() %></td>
<td><%= player.getScore() %></td>
<td><%= player.getGame().getWinner() %></td>
<td><%= player.getGame().getWinner().getUser().getUsername() %></td>
<td><a href="${pageContext.request.contextPath}/game-statistics?id=<%= player.getGame().getId() %>">Voir</a></td>
</tr>
<% } %>