5 Commits

4 changed files with 149 additions and 5 deletions

View File

@@ -1,3 +1,6 @@
# === Environnements ===
TEST_ENV = "bin:/usr/share/java/junit.jar:/usr/share/java/hamcrest-core.jar"
# === Répertoires ===
SRC_DIR = fr
BIN_DIR = bin
@@ -12,12 +15,16 @@ SOURCES := $(shell find $(SRC_DIR) -name "*.java")
# === Classe principale ===
MAIN_CLASS = fr.iut_fbleau.Avalam.Main
# === Classe de test ===
TEST_CLASS = fr.iut_fbleau.Tests.AvalamBoardTest
# === Commandes Java ===
JC = javac
JCFLAGS = -d $(BIN_DIR)
JCFLAGS = -d $(BIN_DIR) -cp $(TEST_ENV)
JAVA = java
JAVAFLAGS = -cp $(BIN_DIR)
JAVAFLAGS_TESTS = -cp $(TEST_ENV)
# === Règle par défaut ===
all: build
@@ -43,6 +50,12 @@ run:
@echo "===> Lancement du jeu Avalam..."
@$(JAVA) $(JAVAFLAGS) $(MAIN_CLASS)
# === Tests ===
test:
@echo "===> Lancement des tests..."
@$(JAVA) $(JAVAFLAGS_TESTS) org.junit.runner.JUnitCore $(TEST_CLASS)
@echo "... Fin des tests."
# === Nettoyage ===
clean:
@echo "===> Suppression des fichiers compilés..."

View File

@@ -4,9 +4,11 @@
Date de création : 16/10/25
Le but est de mettre en oeuvre des jeux plus intéressants que le jeu de Nim, toujours en suivant l'API.
Date de rendu : 06/02/26
Dans un second temps, on fera des bots le plus efficace possible (probablement un alpha beta avec cut-off plus fonction d'évaluation qui peut être faite à la main ou par MonteCarlo).
Le but est de mettre en oeuvre un jeu plus intéressants que le jeu de Nim, en suivant l'API de Florent Madelaine.
Dans un second temps, nous développerons des bots les plus efficaces possible, probablement en utilisant un algorithme alpha-bêta avec cut-off et une fonction d'évaluation réalisé à la main ou par MonteCarlo.
Le jeu de notre groupe est **Avalam**.
@@ -17,6 +19,11 @@ Le jeu de notre groupe est **Avalam**.
make build
```
### Tests
```bash
make test
```
### Exécution
```bash
make run
@@ -78,13 +85,13 @@ Le plateau est représenté par une grille 9x9 où chaque case contient :
Sur un plateau de jeu, les joueurs disposent de 24 pions chacun. Le but est de créer de petites tours avec son pion de couleur au-dessus. Pour ce faire, chaque joueur déplace son pion sur une tour ou déplace une tour sur un autre pion. La personne ayant le plus de pions sur le dessus des tours gagne.
### Régles officiel :
### Règles officielles :
**Régle de base** \
Chaque joueur choisit sa couleur.
Le but du jeu est de constituer un maximum de tours de 1 à 5 pions, jamais plus, surmontées par un pion de sa couleur.
Un joueur est le propriétaire d'une tour lorsqu'un pion de sa couleur en occupe le sommet. Un pion isolé constitue également une tour.
**Deplacements** \
**Déplacements** \
Chaque joueur en effectue un seul mouvement, dans n'importe quel sens (horizontal, vertical, diagonal) avec n'importe quel pion (ou pile de pions), quelle qu'en soit la couleur. Ce mouvement consiste à empiler le ou les pions déplacés sur un trou directement voisin déjà occupé par un ou plusieurs pions.
**Mouvement interdit (1)** \

View File

@@ -205,6 +205,7 @@ public class AvalamBoard extends AbstractBoard {
Tower dst = grid[xT][yT];
if (src == null || dst == null) return false;
if (p.getPlayer() != getCurrentPlayer()) return false;
if (src.getColor() != colorForPlayer(getCurrentPlayer())) return false;
if (!areAdjacent(xF, yF, xT, yT)) return false;
if (src.getColor() == dst.getColor()) return false;

View File

@@ -0,0 +1,123 @@
package fr.iut_fbleau.Tests;
import fr.iut_fbleau.GameAPI.AbstractPly;
import fr.iut_fbleau.GameAPI.Player;
import fr.iut_fbleau.Avalam.AvalamBoard;
import fr.iut_fbleau.Avalam.AvalamPly;
import fr.iut_fbleau.Avalam.Tower;
import fr.iut_fbleau.Avalam.Color;
import org.junit.Before;
import org.junit.Test;
//import org.mockito.Mockito; //Mockito absent
import static org.junit.Assert.*;
/**
* La classe <code>AvalamBoardTest</code> test si la méthode isLegal() fonctionne comme prévu.
*/
public class AvalamBoardTest {
private Tower[][] grid;
private AvalamBoard board;
@Before
public void setUp() {
grid = new Tower[AvalamBoard.SIZE][AvalamBoard.SIZE];
//Création des tours de tests
/* Motif
1,0,2 | 2,0,3
2,1,0 | 2,3,0
0,2,1 | 0,1,1
*/
grid[4][2] = new Tower(2, Color.YELLOW);
grid[6][2] = new Tower(3, Color.RED);
grid[4][3] = new Tower(2, Color.RED);
grid[5][3] = new Tower(3, Color.YELLOW);
grid[5][4] = new Tower(1, Color.RED);
grid[6][4] = new Tower(1, Color.YELLOW);
//Joueur courant initialisé à 1, soit jaune
board = new AvalamBoard(grid); //AvalamBoard copie la grille
}
/*
@Test //Mockito absent
public void nonAvalamPly_returnsFalse() {
//Vérifie si l'instance est bien AvalamPly
AbstractPly fake = Mockito.mock(AbstractPly.class); //Crée une instance non-AvalamPly
assertFalse(board.isLegal(fake));
}*/
@Test
public void outOfBounds_returnsFalse() {
//Source "out of box"
AvalamPly p = new AvalamPly(Player.PLAYER1, -1, 2, 4, 2);
assertFalse(board.isLegal(p));
//Destination "out of box"
AvalamPly p2 = new AvalamPly(Player.PLAYER1, 6, 4, 9, 4);
assertFalse(board.isLegal(p2));
}
@Test
public void sameCell_returnsFalse() {
AvalamPly p = new AvalamPly(Player.PLAYER1, 5, 4, 5, 4);
assertFalse(board.isLegal(p));
}
@Test
public void emptySourceOrDest_returnsFalse() {
//Source null
AvalamPly p1 = new AvalamPly(Player.PLAYER1, 5, 5, 5, 4);
assertFalse(board.isLegal(p1));
//Destination null
AvalamPly p2 = new AvalamPly(Player.PLAYER1, 6, 4, 6, 3);
assertFalse(board.isLegal(p2));
}
@Test
public void sourceNotOwned_returnsFalse() {
//Le joueur courant n'est pas rouge
AvalamPly p = new AvalamPly(Player.PLAYER1, 5, 4, 6, 4);
assertFalse(board.isLegal(p));
}
@Test
public void notAdjacent_returnsFalse() {
AvalamPly p = new AvalamPly(Player.PLAYER1, 4, 2, 6, 2);
assertFalse(board.isLegal(p));
}
@Test
public void sameColor_returnsFalse() {
//La couleur des tours est identique
AvalamPly p = new AvalamPly(Player.PLAYER1, 4, 2, 5, 3);
assertFalse(board.isLegal(p));
}
@Test
public void tooTallAfterMerge_returnsFalse() {
//Hauteur maximale dépassé : 3+3 = 6 > MAX_HEIGHT (5)
AvalamPly p = new AvalamPly(Player.PLAYER1, 5, 3, 6, 2);
assertFalse(board.isLegal(p));
}
@Test
public void validMove_returnsTrue() {
AvalamPly p = new AvalamPly(Player.PLAYER1, 5, 3, 4, 3); //Hauteur limite à 5
assertTrue(board.isLegal(p));
}
@Test //À vérifier
public void currentPlayerMismatchInPlyDoesNotAffectOwnershipCheck() {
//Si le coup est construit avec le mauvais joueur
AvalamPly p = new AvalamPly(Player.PLAYER2, 4, 2, 4, 3);
assertFalse(board.isLegal(p));
}
}