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
+2
View File
@@ -50,6 +50,8 @@ Depuis IntelliJ, ouvrir l'onglet `file > project structure` et ajouter les artef
![Onglet project_structure.png](readmeTools/project_structure.png)
Nous utilisons tomcat pour lancer notre projet.
Sur IntelliJ, vous pouvez ajouter une configuration Tomcat depuis l'onglet "edit run configurations", puis en cliquant sur le bouton "+" en haut à gauche de la fenêtre de lancement.
Editez la configuration comme suit (le port utilisé pour Tomcat conseillé est 8080, mais vous pouvez le changer si vous le souhaitez ou s'il est déjà utilisé par un autre service sur votre machine) :
![Configuration Tomcat.png](readmeTools/tomcat_configuration.png)
@@ -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>
<% } %>