mirror of
https://github.com/kmitresse/Cards-Rush.git
synced 2026-05-16 17:11:48 +00:00
Changes by kmitr
This commit is contained in:
@@ -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>
|
||||
<% } %>
|
||||
|
||||
Reference in New Issue
Block a user