diff --git a/Nim.zip b/Nim.zip new file mode 100644 index 0000000..422beb3 Binary files /dev/null and b/Nim.zip differ diff --git a/src/Main.java b/src/Main.java index 3e59c38..1159ef1 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,5 +1,26 @@ +import java.util.Iterator; + +import fr.iut_fbleau.raw_api_body.entity.*; + public class Main { public static void main(String[] args) { - System.out.println("Hello world!"); + PlateauNim jeu = new PlateauNim(5, Player.JOUEUR1); + jeu.doPly(new NimPly(2)); + jeu.doPly(new NimPly(1)); + jeu.doPly(new NimPly(1)); + jeu.doPly(new NimPly(1)); + if (jeu.isFinished()) { + int resultat = jeu.getResult(); + if (resultat == Result.PERDU) { + System.out.println("Le joueur 1 a perdu !"); + } else if (resultat == Result.GAGNE) { + System.out.println("Le joueur 1 a gagné !"); + } else { + System.out.println("Égalité !"); + } + } + else { + System.out.println("C'est pas fini : " + jeu.isFinished()); + } } } \ No newline at end of file diff --git a/src/fr/iut_fbleau/raw_api_body/entity/NimPly.java b/src/fr/iut_fbleau/raw_api_body/entity/NimPly.java new file mode 100644 index 0000000..1c1a75f --- /dev/null +++ b/src/fr/iut_fbleau/raw_api_body/entity/NimPly.java @@ -0,0 +1,24 @@ +package fr.iut_fbleau.raw_api_body.entity; + +/** + * Represents a move in the Nim game. + */ +public class NimPly extends Ply { + private final int allumettes; + + // Constructor to initialize the move with a number of allumettes to remove + public NimPly(int allumettes) { + this.allumettes = allumettes; + } + + // Returns the number of allumettes removed + public int getallumettes() { + return allumettes; + } + + + @Override + public String toString() { + return "Remove " + allumettes + " allumettes."; + } +} diff --git a/src/fr/iut_fbleau/raw_api_body/entity/PlateauNim.java b/src/fr/iut_fbleau/raw_api_body/entity/PlateauNim.java new file mode 100644 index 0000000..beef23c --- /dev/null +++ b/src/fr/iut_fbleau/raw_api_body/entity/PlateauNim.java @@ -0,0 +1,108 @@ +package fr.iut_fbleau.raw_api_body.entity; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * Implements the Plateau interface for the game of Nim. + */ +public class PlateauNim implements Plateau { + + private int allumettesRestantes; // Number of remaining allumettes + private Player currentPlayer; // Current player + private boolean gameFinished; // Game status + private int result; // Game result: 1 (win), 0 (draw), -1 (loss) + private List playHistory; // History of moves + + // Constructor initializes the game with a given number of allumettes and a starting player + public PlateauNim(int initialallumettes, Player startingPlayer) { + this.allumettesRestantes = initialallumettes; + this.currentPlayer = startingPlayer; + this.gameFinished = false; + this.result = 0; + this.playHistory = new ArrayList<>(); + } + + @Override + public Player getPlayer() { + if (gameFinished) { + throw new NullPointerException("Game is over."); + } + return this.currentPlayer; + } + + @Override + public boolean isFinished() { + return this.gameFinished; + } + + @Override + public int getResult() { + if (!gameFinished) { + throw new NullPointerException("Game is not over."); + } + return this.result; + } + + @Override + public Iterator givePlies() { + if (gameFinished) { + throw new NullPointerException("Game is over."); + } + // Generate legal moves (remove 1, 2, or 3 allumettes, but not more than remaining allumettes) + List legalPlies = new ArrayList<>(); + for (int i = 1; i <= Math.min(3, allumettesRestantes); i++) { + legalPlies.add(new NimPly(i)); + } + return legalPlies.iterator(); + } + + @Override + public void doPly(Ply ply) { + if (!(ply instanceof NimPly)) { + throw new IllegalArgumentException("Invalid move type."); + } + NimPly nimPly = (NimPly) ply; + + if (nimPly.getallumettes() < 1 || nimPly.getallumettes() > Math.min(3, allumettesRestantes)) { + throw new IllegalArgumentException("Invalid move."); + } + + // Update the state + allumettesRestantes -= nimPly.getallumettes(); + playHistory.add(nimPly); + + // Check if game is finished + if (allumettesRestantes == 0) { + gameFinished = true; + if (this.currentPlayer == Player.JOUEUR1){ + result = -1; // Player 2 Win + } + else{ + result = 1; // Player 1 Win + } + } else { + // Switch players if game is not finished + currentPlayer = (currentPlayer == Player.JOUEUR1) ? Player.JOUEUR2 : Player.JOUEUR1; + } + } + + @Override + public void undoPly(Ply ply) { + if (playHistory.isEmpty()) { + throw new IllegalStateException("No moves to undo."); + } + if (!playHistory.get(playHistory.size() - 1).equals(ply)) { + throw new IllegalStateException("Cannot undo a non-last move."); + } + + // Revert the move + NimPly lastMove = (NimPly) playHistory.remove(playHistory.size() - 1); + allumettesRestantes += lastMove.getallumettes(); + + // Switch back to previous player + currentPlayer = (currentPlayer == Player.JOUEUR1) ? Player.JOUEUR2 : Player.JOUEUR1; + gameFinished = false; // If game was finished, it's no longer + } +}