2026-01-21 17:20:06 +01:00
package fr.iut_fbleau.HexGame ;
import fr.iut_fbleau.GameAPI.* ;
import java.util.EnumMap ;
import java.util.LinkedList ;
public class Simulation extends AbstractGame {
//ATTRIBUTS
private HexPly bestmove ;
private float bestoutcome ;
2026-01-30 09:32:17 +01:00
private int MAXDEPTH = 6 ;
2026-01-21 17:20:06 +01:00
private LinkedList < Integer [ ] > taken = new LinkedList < Integer [ ] > ( ) ;
//ATTRIBUTS QUE JE NE VOUDRAIS PAS CRÉER IDÉALEMENT
private IBoard simCurrentBoard ;
private EnumMap < Player , AbstractGamePlayer > simmapPlayers ;
//CONSTRUCTEUR
public Simulation ( IBoard b , EnumMap < Player , AbstractGamePlayer > m ) {
super ( b , m ) ;
simCurrentBoard = b ;
simmapPlayers = m ;
}
//METHODES
private float explMAX ( HexBoard position , int depth ) {
if ( position . getResult ( ) = = Result . LOSS ) {
return - 1 . 0f ;
} else if ( position . getResult ( ) = = Result . WIN ) {
return 1 . 0f ;
} else if ( depth = = MAXDEPTH ) {
return 0f ;
} else {
float bestcase = - 1 . 0f ;
HexPly bestcasemove ;
HexPly testmove ;
for ( int i = 0 ; i < position . getSize ( ) ; i + + ) {
for ( int j = 0 ; j < position . getSize ( ) ; j + + ) {
if ( depth = = 0 ) {
//System.out.println("MAX New Line :");
}
Integer [ ] t = new Integer [ ] { i , j } ;
testmove = new HexPly ( Player . PLAYER1 , i , j ) ;
if ( ! taken . contains ( t ) & & position . isLegal ( testmove ) ) {
//System.out.println(" MAX test move : "+Integer.toString(i)+","+Integer.toString(j));
taken . add ( t ) ;
position . doPly ( testmove ) ;
float val = explMIN ( position , depth + 1 ) ;
if ( val > = bestcase ) {
//System.out.println(" MAX new best case");
bestcase = val ;
bestcasemove = testmove ;
if ( depth = = 0 ) {
this . bestoutcome = bestcase ;
this . bestmove = bestcasemove ;
}
}
position . undoPly ( ) ;
taken . remove ( t ) ;
}
}
}
return bestcase ;
}
}
private float explMIN ( HexBoard position , int depth ) {
if ( position . getResult ( ) = = Result . LOSS ) {
return - 1 . 0f ;
} else if ( position . getResult ( ) = = Result . WIN ) {
return 1 . 0f ;
} else if ( depth = = MAXDEPTH ) {
return 0f ;
} else {
float bestcase = 1 . 0f ;
HexPly bestcasemove ;
HexPly testmove ;
for ( int i = 0 ; i < position . getSize ( ) ; i + + ) {
for ( int j = 0 ; j < position . getSize ( ) ; j + + ) {
if ( depth = = 0 ) {
//System.out.println("MIN New Line :");
}
Integer [ ] t = new Integer [ ] { i , j } ;
testmove = new HexPly ( Player . PLAYER2 , i , j ) ;
if ( ! taken . contains ( t ) & & position . isLegal ( testmove ) ) {
//System.out.println(" MIN test move : "+Integer.toString(i)+","+Integer.toString(j));
taken . add ( t ) ;
position . doPly ( testmove ) ;
float val = explMAX ( position , depth + 1 ) ;
if ( val < = bestcase ) {
//System.out.println(" MIN new best case");
bestcase = val ;
bestcasemove = testmove ;
if ( depth = = 0 ) {
this . bestoutcome = bestcase ;
this . bestmove = bestcasemove ;
}
}
position . undoPly ( ) ;
taken . remove ( t ) ;
}
}
}
return bestcase ;
}
}
private AbstractPly GiveBestMove ( IBoard board ) {
if ( ! ( board instanceof HexBoard ) ) {
throw new IllegalArgumentException ( " Ce joueur attend un HexBoard. " ) ;
}
HexBoard hb = ( HexBoard ) board ;
float bestcase ;
if ( hb . getCurrentPlayer ( ) = = Player . PLAYER1 ) {
bestcase = explMAX ( hb , 0 ) ;
} else {
bestcase = explMIN ( hb , 0 ) ;
}
return this . bestmove ;
}
@Override
public Result run ( ) {
while ( ! simCurrentBoard . isGameOver ( ) ) {
AbstractGamePlayer player = simmapPlayers . get ( simCurrentBoard . getCurrentPlayer ( ) ) ;
IBoard board = simCurrentBoard . safeCopy ( ) ;
AbstractPly ply = GiveBestMove ( board ) ;
HexPly concretePly = ( HexPly ) ply ;
if ( simCurrentBoard . isLegal ( ply ) ) {
simCurrentBoard . doPly ( ply ) ;
taken . add ( new Integer [ ] { concretePly . getRow ( ) , concretePly . getCol ( ) } ) ;
System . out . println ( " Player " + player + " goes ( " + concretePly . getRow ( ) + " , " + concretePly . getCol ( ) + " ) " ) ;
}
else throw new IllegalStateException ( " Player " + player + " is a bloody cheat. He tried playing : " + concretePly . getRow ( ) + " , " + concretePly . getCol ( ) + " I give up. " ) ;
}
return simCurrentBoard . getResult ( ) ;
}
}