Compare commits

..

1 Commits

Author SHA1 Message Date
8d5bc6b0a7 Refaire Undo 2024-10-09 14:19:22 +02:00
25 changed files with 174 additions and 110 deletions

3
.idea/.gitignore vendored
View File

@ -1,3 +0,0 @@
# Default ignored files
/shelf/
/workspace.xml

View File

@ -1,8 +0,0 @@
<component name="ArtifactManager">
<artifact type="jar" name="API_BUT5.5:jar">
<output-path>$PROJECT_DIR$/out/artifacts/API_BUT5_5_jar</output-path>
<root id="archive" name="API_BUT5.5.jar">
<element id="module-output" name="API_BUT5.5" />
</root>
</artifact>
</component>

View File

@ -1,8 +0,0 @@
<component name="ArtifactManager">
<artifact type="jar" name="API_BUT5.5:jar2">
<output-path>$PROJECT_DIR$/out/artifacts/API_BUT5_5_jar2</output-path>
<root id="archive" name="API_BUT5.5.jar">
<element id="module-output" name="API_BUT5.5" />
</root>
</artifact>
</component>

View File

@ -1,9 +0,0 @@
<component name="libraryTable">
<library name="API_BUT5.5">
<CLASSES>
<root url="jar://$PROJECT_DIR$/out/artifacts/API_BUT5_5_jar/API_BUT5.5.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</component>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/API_BUT5.5.iml" filepath="$PROJECT_DIR$/API_BUT5.5.iml" />
</modules>
</component>
</project>

View File

@ -1,6 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="" vcs="Git" />
</component>
</project>

BIN
Nim.zip Normal file

Binary file not shown.

View File

@ -10,7 +10,4 @@ Création de l'API publique
- Ajout de la documentation
### 09/10/2024 - 10h10 :
- Ajout de l'archive JAR
### 09/10/2024 - 16h25 :
- Ajout de méthodes et d'une classe pour l'implémentation du carnet
- Ajout de l'archive JAR

View File

@ -1,3 +0,0 @@
Manifest-Version: 1.0
Main-Class: Main

Binary file not shown.

View File

@ -1,3 +0,0 @@
Manifest-Version: 1.0
Main-Class: Main

View File

@ -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());
}
}
}

View File

@ -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.";
}
}

View File

@ -35,7 +35,7 @@ public interface Plateau {
*
* @return the result
*/
Result getResult();
int getResult();
/**
* List next legals moves
@ -63,44 +63,4 @@ public interface Plateau {
*/
void undoPly(Ply ply);
/**
* Used to verify if the Situation is already in the bookmarks
*
* @throws UnsupportedOperationException if the method is not yet implemented
*
* @return the answer
*/
default boolean isAlreadyDone(){
throw new UnsupportedOperationException("Feature not yet implemented");
}
/**
* Used to check the value of the current Situation
*
* @throws UnsupportedOperationException if the method is not yet implemented
*
* @throws IllegalStateException if the Situation is not in the bookmarks
*
* @return the value
*/
default int getSituationValue(){
throw new UnsupportedOperationException("Feature not yet implemented");
}
/**
* Used to add a Situation to the bookmarks
*
* @throws UnsupportedOperationException if the method is not yet implemented
*
* @throws IllegalStateException if the Situation is already in the bookmarks
*/
default void addSituation(Result res){
throw new UnsupportedOperationException("Feature not yet implemented");
}
}

View File

@ -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<Ply> 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<Ply> 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<Ply> 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
}
}

View File

@ -2,4 +2,5 @@ package fr.iut_fbleau.raw_api_body.entity;
public abstract class Ply {
}
}

View File

@ -3,8 +3,19 @@ package fr.iut_fbleau.raw_api_body.entity;
/**
* The type Result.
*/
public enum Result {
GAGNE,
EGALITE,
PERDU;
}
public class Result {
/**
* The constant GAGNE.
*/
public final static int GAGNE = 1;
/**
* The constant EGALITE.
*/
public final static int EGALITE = 0;
/**
* The constant PERDU.
*/
public final static int PERDU = -1;
}

View File

@ -1,4 +0,0 @@
package fr.iut_fbleau.raw_api_body.entity;
public abstract class Situation {
}