Compare commits
4 Commits
Verificati
...
tests
| Author | SHA1 | Date | |
|---|---|---|---|
| dea162182b | |||
| c0cd120b1e | |||
| fa578b86d2 | |||
| 14e5df4332 |
15
Makefile
15
Makefile
@@ -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..."
|
||||
|
||||
15
README.md
15
README.md
@@ -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)** \
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package fr.iut_fbleau.Avalam;
|
||||
|
||||
import fr.iut_fbleau.Bot.AlphaBetaBot;
|
||||
import fr.iut_fbleau.Bot.DivineBot;
|
||||
import fr.iut_fbleau.Bot.IdiotBot;
|
||||
import fr.iut_fbleau.GameAPI.AbstractGamePlayer;
|
||||
import fr.iut_fbleau.GameAPI.Player;
|
||||
@@ -15,8 +14,7 @@ import java.util.List;
|
||||
|
||||
/**
|
||||
* Fenêtre pour le mode Arène.
|
||||
* Permet de sélectionner trois bots (Idiot, Alpha-Beta, Divin), de configurer la profondeur
|
||||
* de recherche pour les bots intelligents, de choisir le nombre de parties, et d'afficher les résultats.
|
||||
* Permet de sélectionner deux bots, le nombre de parties, et affiche les résultats.
|
||||
*
|
||||
* @version 1.0
|
||||
*/
|
||||
@@ -249,7 +247,14 @@ public class ArenaWindow extends JFrame {
|
||||
} else if (botType.equals("Bot Alpha-Beta")) {
|
||||
return new AlphaBetaBot(player, depth);
|
||||
} else if (botType.equals("Bot Divin")) {
|
||||
return new DivineBot(player, depth);
|
||||
// Pour l'instant, le Bot Divin n'est pas implémenté, on utilise IdiotBot
|
||||
JOptionPane.showMessageDialog(
|
||||
this,
|
||||
"Le Bot Divin n'est pas encore implémenté. Utilisation du Bot Idiot à la place.",
|
||||
"Avertissement",
|
||||
JOptionPane.WARNING_MESSAGE
|
||||
);
|
||||
return new IdiotBot(player);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
123
fr/iut_fbleau/Tests/AvalamBoardTest.java
Normal file
123
fr/iut_fbleau/Tests/AvalamBoardTest.java
Normal 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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user