Commit 0861ce2c authored by DELBECQ Théo's avatar DELBECQ Théo

Merge branch 'Theo' into 'master'

Réparation de compatibilité grâce aux arts occultes

See merge request !20
parents 980081ea 264d00f0
# Created by https://www.gitignore.io/api/java,netbeans
# Edit at https://www.gitignore.io/?templates=java,netbeans
### Java ###
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
#*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
### NetBeans ###
**/nbproject/private/
**/nbproject/Makefile-*.mk
**/nbproject/Package-*.bash
# build/
nbbuild/
dist/
nbdist/
.nb-gradle/
# End of https://www.gitignore.io/api/java,netbeans
\ No newline at end of file
Manifest-Version: 1.0 Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build X-COMMENT: Main-Class will be added automatically by build
This source diff could not be displayed because it is too large. You can view the blob instead.
<<<<<<< HEAD <<<<<<< HEAD
build.xml.data.CRC32=662cc432 build.xml.data.CRC32=662cc432
build.xml.script.CRC32=54ced37f build.xml.script.CRC32=54ced37f
build.xml.stylesheet.CRC32=f85dc8f2@1.93.0.48 build.xml.stylesheet.CRC32=f85dc8f2@1.93.0.48
# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. # This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml.
# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. # Do not edit this file. You may delete it but then the IDE will never regenerate such files for you.
nbproject/build-impl.xml.data.CRC32=662cc432 nbproject/build-impl.xml.data.CRC32=662cc432
nbproject/build-impl.xml.script.CRC32=fe7dced2 nbproject/build-impl.xml.script.CRC32=fe7dced2
nbproject/build-impl.xml.stylesheet.CRC32=f89f7d21@1.93.0.48 nbproject/build-impl.xml.stylesheet.CRC32=f89f7d21@1.93.0.48
======= =======
build.xml.data.CRC32=662cc432 build.xml.data.CRC32=662cc432
build.xml.script.CRC32=54ced37f build.xml.script.CRC32=54ced37f
......
<<<<<<< HEAD
<<<<<<< HEAD
<<<<<<< HEAD
compile.on.save=true
do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
user.properties.file=C:\\Users\\timot\\AppData\\Roaming\\NetBeans\\11.2\\build.properties
=======
compile.on.save=true
do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
user.properties.file=/home/louis/.netbeans/11.3/build.properties
>>>>>>> 4dd14568c244c833d17b679f8f3b340f997c8d04
=======
<<<<<<< HEAD
compile.on.save=true
do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
user.properties.file=C:\\Users\\timot\\AppData\\Roaming\\NetBeans\\11.2\\build.properties
=======
compile.on.save=true
do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
user.properties.file=/home/louis/.netbeans/11.3/build.properties
>>>>>>> 4dd14568c244c833d17b679f8f3b340f997c8d04
>>>>>>> 4f5ab9d710d3dfdc1fe71236031395a85db95bec
=======
<<<<<<< HEAD
compile.on.save=true
do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
user.properties.file=C:\\Users\\timot\\AppData\\Roaming\\NetBeans\\11.2\\build.properties
=======
compile.on.save=true
do.depend=false
do.jar=true
javac.debug=true
javadoc.preview=true
user.properties.file=C:\\Users\\theo\\AppData\\Roaming\\NetBeans\\11.3\\build.properties
>>>>>>> 4dd14568c244c833d17b679f8f3b340f997c8d04
>>>>>>> 94177790fa8a419aa9237d306f5420565be1ebd3
<?xml version="1.0" encoding="UTF-8"?>
<project-private xmlns="http://www.netbeans.org/ns/project-private/1">
<editor-bookmarks xmlns="http://www.netbeans.org/ns/editor-bookmarks/2" lastBookmarkId="0"/>
<open-files xmlns="http://www.netbeans.org/ns/projectui-open-files/2">
<group/>
</open-files>
</project-private>
<<<<<<< HEAD <<<<<<< HEAD
annotation.processing.enabled=true annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false annotation.processing.enabled.in.editor=false
annotation.processing.processors.list= annotation.processing.processors.list=
annotation.processing.run.all.processors=true annotation.processing.run.all.processors=true
annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output
application.title=TicTacToeCodingame application.title=TicTacToeCodingame
application.vendor=franck.tempet application.vendor=franck.tempet
build.classes.dir=${build.dir}/classes build.classes.dir=${build.dir}/classes
build.classes.excludes=**/*.java,**/*.form build.classes.excludes=**/*.java,**/*.form
# This directory is removed when the project is cleaned: # This directory is removed when the project is cleaned:
build.dir=build build.dir=build
build.generated.dir=${build.dir}/generated build.generated.dir=${build.dir}/generated
build.generated.sources.dir=${build.dir}/generated-sources build.generated.sources.dir=${build.dir}/generated-sources
# Only compile against the classpath explicitly listed here: # Only compile against the classpath explicitly listed here:
build.sysclasspath=ignore build.sysclasspath=ignore
build.test.classes.dir=${build.dir}/test/classes build.test.classes.dir=${build.dir}/test/classes
build.test.results.dir=${build.dir}/test/results build.test.results.dir=${build.dir}/test/results
# Uncomment to specify the preferred debugger connection transport: # Uncomment to specify the preferred debugger connection transport:
#debug.transport=dt_socket #debug.transport=dt_socket
debug.classpath=\ debug.classpath=\
${run.classpath} ${run.classpath}
debug.modulepath=\ debug.modulepath=\
${run.modulepath} ${run.modulepath}
debug.test.classpath=\ debug.test.classpath=\
${run.test.classpath} ${run.test.classpath}
debug.test.modulepath=\ debug.test.modulepath=\
${run.test.modulepath} ${run.test.modulepath}
# Files in build.classes.dir which should be excluded from distribution jar # Files in build.classes.dir which should be excluded from distribution jar
dist.archive.excludes= dist.archive.excludes=
# This directory is removed when the project is cleaned: # This directory is removed when the project is cleaned:
dist.dir=dist dist.dir=dist
dist.jar=${dist.dir}/TicTacToeCodingame.jar dist.jar=${dist.dir}/TicTacToeCodingame.jar
dist.javadoc.dir=${dist.dir}/javadoc dist.javadoc.dir=${dist.dir}/javadoc
endorsed.classpath= endorsed.classpath=
excludes= excludes=
includes=** includes=**
jar.compress=false jar.compress=false
javac.classpath= javac.classpath=
# Space-separated list of extra javac options # Space-separated list of extra javac options
javac.compilerargs= javac.compilerargs=
javac.deprecation=false javac.deprecation=false
javac.external.vm=true javac.external.vm=true
javac.modulepath= javac.modulepath=
javac.processormodulepath= javac.processormodulepath=
javac.processorpath=\ javac.processorpath=\
${javac.classpath} ${javac.classpath}
javac.source=1.8 javac.source=1.8
javac.target=1.8 javac.target=1.8
javac.test.classpath=\ javac.test.classpath=\
${javac.classpath}:\ ${javac.classpath}:\
${build.classes.dir} ${build.classes.dir}
javac.test.modulepath=\ javac.test.modulepath=\
${javac.modulepath} ${javac.modulepath}
javac.test.processorpath=\ javac.test.processorpath=\
${javac.test.classpath} ${javac.test.classpath}
javadoc.additionalparam= javadoc.additionalparam=
javadoc.author=false javadoc.author=false
javadoc.encoding=${source.encoding} javadoc.encoding=${source.encoding}
javadoc.noindex=false javadoc.noindex=false
javadoc.nonavbar=false javadoc.nonavbar=false
javadoc.notree=false javadoc.notree=false
javadoc.private=false javadoc.private=false
javadoc.splitindex=true javadoc.splitindex=true
javadoc.use=true javadoc.use=true
javadoc.version=false javadoc.version=false
javadoc.windowtitle= javadoc.windowtitle=
main.class=tictactoecodingame.Player main.class=tictactoecodingame.Player
manifest.file=manifest.mf manifest.file=manifest.mf
meta.inf.dir=${src.dir}/META-INF meta.inf.dir=${src.dir}/META-INF
mkdist.disabled=false mkdist.disabled=false
platform.active=default_platform platform.active=default_platform
run.classpath=\ run.classpath=\
${javac.classpath}:\ ${javac.classpath}:\
${build.classes.dir} ${build.classes.dir}
# Space-separated list of JVM arguments used when running the project. # Space-separated list of JVM arguments used when running the project.
# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. # You may also define separate properties like run-sys-prop.name=value instead of -Dname=value.
# To set system properties for unit tests define test-sys-prop.name=value: # To set system properties for unit tests define test-sys-prop.name=value:
run.jvmargs= run.jvmargs=
run.modulepath=\ run.modulepath=\
${javac.modulepath} ${javac.modulepath}
run.test.classpath=\ run.test.classpath=\
${javac.test.classpath}:\ ${javac.test.classpath}:\
${build.test.classes.dir} ${build.test.classes.dir}
run.test.modulepath=\ run.test.modulepath=\
${javac.test.modulepath} ${javac.test.modulepath}
source.encoding=UTF-8 source.encoding=UTF-8
src.dir=src src.dir=src
test.src.dir=test test.src.dir=test
======= =======
annotation.processing.enabled=true annotation.processing.enabled=true
annotation.processing.enabled.in.editor=false annotation.processing.enabled.in.editor=false
......
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://www.netbeans.org/ns/project/1"> <project xmlns="http://www.netbeans.org/ns/project/1">
<type>org.netbeans.modules.java.j2seproject</type> <type>org.netbeans.modules.java.j2seproject</type>
<configuration> <configuration>
<data xmlns="http://www.netbeans.org/ns/j2se-project/3"> <data xmlns="http://www.netbeans.org/ns/j2se-project/3">
<name>TicTacToeCodingame</name> <name>TicTacToeCodingame</name>
<source-roots> <source-roots>
<root id="src.dir"/> <root id="src.dir"/>
</source-roots> </source-roots>
<test-roots> <test-roots>
<root id="test.src.dir"/> <root id="test.src.dir"/>
</test-roots> </test-roots>
</data> </data>
</configuration> </configuration>
</project> </project>
# Algorithme MinMax et Monte Carlo # Algorithme MinMax et Monte Carlo
# Objectif # Objectif
Votre objectif sera d’implémenter l’algorithme MinMax et l’algorithme MonteCarlo Tree Search sur le jeu TicTacToe présent sur la plateforme [Codingame](https://www.codingame.com/start). Vous partirez d’un code Java existant afin de vous focaliser essentiellement sur ces algorithmes. Votre objectif sera d’implémenter l’algorithme MinMax et l’algorithme MonteCarlo Tree Search sur le jeu TicTacToe présent sur la plateforme [Codingame](https://www.codingame.com/start). Vous partirez d’un code Java existant afin de vous focaliser essentiellement sur ces algorithmes.
# Récupérer le code Java # Récupérer le code Java
Les sources sont sur [bitbucket](www.bitbucket.org). L’adresse du repository est la suivante : Les sources sont sur [bitbucket](www.bitbucket.org). L’adresse du repository est la suivante :
```bash ```bash
git clone https://francktempet@bitbucket.org/Num-ILD/tictactoe.git git clone https://francktempet@bitbucket.org/Num-ILD/tictactoe.git
``` ```
## Quelques explications sur le code ## Quelques explications sur le code
### La classe Player ### La classe Player
Cette classe contient la méthode **main** du programme. Elle crée un joueur «*humain*» ainsi qu’un joueur «*Ordinateur*». L’ordinateur joue les coups de manière aléatoire. Cette classe contient la méthode **main** du programme. Elle crée un joueur «*humain*» ainsi qu’un joueur «*Ordinateur*». L’ordinateur joue les coups de manière aléatoire.
### La classe Plateau ### La classe Plateau
Regarder les méthodes contenues dans cette classe ainsi que les commentaires associés. Cette classe est une classe abstraite qui liste les méthodes nécessaires à la manipulation d’un jeu de plateau à deux joueurs. Vous aurez besoin essentiellement des méthodes suivantes : Regarder les méthodes contenues dans cette classe ainsi que les commentaires associés. Cette classe est une classe abstraite qui liste les méthodes nécessaires à la manipulation d’un jeu de plateau à deux joueurs. Vous aurez besoin essentiellement des méthodes suivantes :
\newpage \newpage
>- partieTerminee() >- partieTerminee()
>- getListeCoups() >- getListeCoups()
>- vainqueur() >- vainqueur()
>- joueCoup() >- joueCoup()
>- sauvegardePosition() >- sauvegardePosition()
>- restaurePosition() >- restaurePosition()
>- annuleDernierCoup() >- annuleDernierCoup()
>- …. >- ….
### La classe GrilleTicTacToe3x3 ### La classe GrilleTicTacToe3x3
Cette classe représente la grille du jeu TicTacToe de dimension 3x3. Cette classe hérite de Plateau, elle implémente donc toutes les méthodes abstraites présentes dans la classe Plateau. C’est cette grille que vous utiliserez dans un premier temps. Cette classe représente la grille du jeu TicTacToe de dimension 3x3. Cette classe hérite de Plateau, elle implémente donc toutes les méthodes abstraites présentes dans la classe Plateau. C’est cette grille que vous utiliserez dans un premier temps.
### La classe GrilleTicTacToe9x9 ### La classe GrilleTicTacToe9x9
Cette classe représente la grille du jeu TicTacToe de dimension 9x9. Cette classe hérite de Plateau, elle implémente donc toutes les méthodes abstraites présentes dans la classe Plateau. Cette grille sera utilisée lorsque vous aurez franchi le premier niveau sur Codingame. Cette classe représente la grille du jeu TicTacToe de dimension 9x9. Cette classe hérite de Plateau, elle implémente donc toutes les méthodes abstraites présentes dans la classe Plateau. Cette grille sera utilisée lorsque vous aurez franchi le premier niveau sur Codingame.
# Implémenter l'algorithme # Implémenter l'algorithme
Regardez en détail le contenu de la classe **Player**. La création de l’IA ( *joueurOrdi* ) nécessite d’appeler la méthode **setAlgoRecherche** en lui passant en paramètre une instance d’une classe qui implémente l’interface **AlgoRecherche**. Dans notre cas c'est la classe **AlgoRechercheAleatoire** qui implémente cette interface. Elle implémente donc la méthode suivante : Regardez en détail le contenu de la classe **Player**. La création de l’IA ( *joueurOrdi* ) nécessite d’appeler la méthode **setAlgoRecherche** en lui passant en paramètre une instance d’une classe qui implémente l’interface **AlgoRecherche**. Dans notre cas c'est la classe **AlgoRechercheAleatoire** qui implémente cette interface. Elle implémente donc la méthode suivante :
```java ```java
public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean _ponder) public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean _ponder)
``` ```
On doit passer à cette méthode le plateau du jeu ( *ici GrilleTicTacToe3x3* ) , le joueur à qui c'est le tour de jouer et un dernier paramètre qui indique si l'ordinateur peut analyser la position lorsque c'est à son adversaire de jouer. On doit passer à cette méthode le plateau du jeu ( *ici GrilleTicTacToe3x3* ) , le joueur à qui c'est le tour de jouer et un dernier paramètre qui indique si l'ordinateur peut analyser la position lorsque c'est à son adversaire de jouer.
L'algorithme aléatoire récupère la liste des coups possibles à partir de la position courante et en choisit un au hasard. L'algorithme aléatoire récupère la liste des coups possibles à partir de la position courante et en choisit un au hasard.
```java ```java
Random rnd; Random rnd;
public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean _ponder) { public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean _ponder) {
ArrayList<Coup> coups = _plateau.getListeCoups(_joueur); ArrayList<Coup> coups = _plateau.getListeCoups(_joueur);
return coups.get(rnd.nextInt( coups.size())); return coups.get(rnd.nextInt( coups.size()));
} }
``` ```
Vous devrez donc écrire soit une classe AlgoMinMax soit une classe AlgoMCTS. Ces deux classes devront implémenter également l’interface *AlgoRecherche* ce qui revient à écrire la méthode *meilleurCoup*. Vous devrez donc écrire soit une classe AlgoMinMax soit une classe AlgoMCTS. Ces deux classes devront implémenter également l’interface *AlgoRecherche* ce qui revient à écrire la méthode *meilleurCoup*.
# Tester son IA en local # Tester son IA en local
La classe Player actuelle vous permet de jouer contre votre IA. Vous pouvez modifier facilement cette classe afin de faire jouer deux IA l’une contre l’autre. La classe Player actuelle vous permet de jouer contre votre IA. Vous pouvez modifier facilement cette classe afin de faire jouer deux IA l’une contre l’autre.
# Tester son IA sur Codingame # Tester son IA sur Codingame
Afin de tester votre IA sur *Codingame*, il vous faudra modifier le contenu de la classe **Player** pour être compatible avec le mode de fonctionnement de la plateforme, à savoir récupérer les données en entrée ( code déjà fourni par le site ) et retourner sur la sortie standard votre coup. La classe **Arbitre** ne sera plus nécessaire puisque se sera la plateforme Codingame qui fera office d'arbitre. La classe **Player** contient également la version pour le bon fonctionnement de votre IA sur Codingame. Il suffit de dé-commenter la partie *Codingame* et commenter le jeu en local Afin de tester votre IA sur *Codingame*, il vous faudra modifier le contenu de la classe **Player** pour être compatible avec le mode de fonctionnement de la plateforme, à savoir récupérer les données en entrée ( code déjà fourni par le site ) et retourner sur la sortie standard votre coup. La classe **Arbitre** ne sera plus nécessaire puisque se sera la plateforme Codingame qui fera office d'arbitre. La classe **Player** contient également la version pour le bon fonctionnement de votre IA sur Codingame. Il suffit de dé-commenter la partie *Codingame* et commenter le jeu en local
Pour générer un seul fichier à partir de l’ensemble de vos classes vous utiliserez le **builder.jar** en effectuant les commandes suivantes. Pour générer un seul fichier à partir de l’ensemble de vos classes vous utiliserez le **builder.jar** en effectuant les commandes suivantes.
Lancez l’invite de commande **cmd.exe** et tapez les commandes suivantes : Lancez l’invite de commande **cmd.exe** et tapez les commandes suivantes :
```bash ```bash
# C est la lettre du disque dur où se trouve votre projet # C est la lettre du disque dur où se trouve votre projet
C: C:
# Se positionner dans le répertoire src du projet # Se positionner dans le répertoire src du projet
# exemple cd c:\netbean\TicTacToeCodingame\src # exemple cd c:\netbean\TicTacToeCodingame\src
cd <nom_du_répertoire source> cd <nom_du_répertoire source>
# Lancer le builder.jar # Lancer le builder.jar
# Cette commande va générer un fichier Player.java dans le répertoire courant. # Cette commande va générer un fichier Player.java dans le répertoire courant.
# C’est ce fichier qu’il faudra poster sur codingame. # C’est ce fichier qu’il faudra poster sur codingame.
java –jar builder.jar .\tictactoecodingame\Player.java java –jar builder.jar .\tictactoecodingame\Player.java
``` ```
# Amélioration des algorithmes # Amélioration des algorithmes
Lorsque vos algorithmes MinMax et MCTS seront implémentés et fonctionneront correctement, votre objectif sera de rechercher les possibilités d'améliorations de ces algorithmes. Vous indiquerez le résultat de vos recherches et les implémenterez afin d'améliorer votre IA. Lorsque vos algorithmes MinMax et MCTS seront implémentés et fonctionneront correctement, votre objectif sera de rechercher les possibilités d'améliorations de ces algorithmes. Vous indiquerez le résultat de vos recherches et les implémenterez afin d'améliorer votre IA.
package tictactoecodingame; package tictactoecodingame;
/** /**
* @author Franck * @author Franck
* *
*/ */
public abstract class AlgoRecherche { public abstract class AlgoRecherche {
/** /**
* *
* @param _plateau Grille du jeu * @param _plateau Grille du jeu
* @param _joueur c'est à ce joueur de jouer * @param _joueur c'est à ce joueur de jouer
* @param _ponder vrai si l'ordi analyse la position pendant le temps de reflexion de l'adversaire * @param _ponder vrai si l'ordi analyse la position pendant le temps de reflexion de l'adversaire
* @return * @return
*/ */
abstract public Coup meilleurCoup( Plateau _plateau , Joueur _joueur , boolean _ponder ); abstract public Coup meilleurCoup( Plateau _plateau , Joueur _joueur , boolean _ponder );
} }
/* /*
* To change this license header, choose License Headers in Project Properties. * To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package tictactoecodingame; package tictactoecodingame;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Random; import java.util.Random;
/** /**
* *
* @author franck.tempet * @author franck.tempet
*/ */
public class AlgoRechercheAleatoire extends AlgoRecherche{ public class AlgoRechercheAleatoire extends AlgoRecherche{
Random rnd; Random rnd;
public AlgoRechercheAleatoire() { public AlgoRechercheAleatoire() {
rnd = new Random(); rnd = new Random();
} }
@Override @Override
public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean _ponder) { public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean _ponder) {
ArrayList<Coup> coups = _plateau.getListeCoups(_joueur); ArrayList<Coup> coups = _plateau.getListeCoups(_joueur);
return coups.get(rnd.nextInt( coups.size())); return coups.get(rnd.nextInt( coups.size()));
} }
} }
package tictactoecodingame; package tictactoecodingame;
/** /**
* @author Franck * @author Franck
* *
*/ */
public class Arbitre { public class Arbitre {
Joueur joueur1; // Joueur qui commence la partie Joueur joueur1; // Joueur qui commence la partie
Joueur joueur2; // Adversaire Joueur joueur2; // Adversaire
Joueur currentJoueur; // C'est à son tour de jouer Joueur currentJoueur; // C'est à son tour de jouer
Plateau plateau; // Le plateau du jeu Plateau plateau; // Le plateau du jeu
public Arbitre(Plateau _plateau, Joueur _joueur1, Joueur _joueur2) { public Arbitre(Plateau _plateau, Joueur _joueur1, Joueur _joueur2) {
plateau = _plateau; plateau = _plateau;
joueur1 = _joueur1; joueur1 = _joueur1;
joueur2 = _joueur2; joueur2 = _joueur2;
currentJoueur = joueur1; // Le joueur1 commence la partie. currentJoueur = joueur1; // Le joueur1 commence la partie.
} }
/** /**
* Demarre une nouvelle Partie * Demarre une nouvelle Partie
* Retourne le joueur qui gagne , null si c'est un match nul * Retourne le joueur qui gagne , null si c'est un match nul
* *
* @param _trace si vrai affiche le plateau et le joueur courant * @param _trace si vrai affiche le plateau et le joueur courant
*/ */
public Joueur startNewGame( boolean _trace ) { public Joueur startNewGame( boolean _trace ) {
Coup coup; Coup coup;
plateau.init(); // Prépare le plateau pour le jeu. plateau.init(); // Prépare le plateau pour le jeu.
while (!plateau.partieTerminee()) { while (!plateau.partieTerminee()) {
do { do {
if ( _trace ) { if ( _trace ) {
System.out.println(plateau); System.out.println(plateau);
System.out.println(currentJoueur + " ( " +currentJoueur.getIdJoueur() + " ) joue : " ); System.out.println(currentJoueur + " ( " +currentJoueur.getIdJoueur() + " ) joue : " );
} }
coup = currentJoueur.joue(plateau); coup = currentJoueur.joue(plateau);
if (!plateau.isValide(coup)) { if (!plateau.isValide(coup)) {
if ( _trace ) if ( _trace )
System.err.println("Coup non valide ! : " + currentJoueur); System.err.println("Coup non valide ! : " + currentJoueur);
else { // en mode batch le joueur perd la partie else { // en mode batch le joueur perd la partie
System.err.println("Coup non valide ! : " + currentJoueur); System.err.println("Coup non valide ! : " + currentJoueur);
if (currentJoueur == joueur1) return joueur2; else return joueur1; if (currentJoueur == joueur1) return joueur2; else return joueur1;
} }
} }
} while (!plateau.isValide(coup)); } while (!plateau.isValide(coup));
plateau.joueCoup(coup); plateau.joueCoup(coup);
if (currentJoueur == joueur1) { if (currentJoueur == joueur1) {
currentJoueur = joueur2; currentJoueur = joueur2;
} else { } else {
currentJoueur = joueur1; currentJoueur = joueur1;
} }
} }
Joueur vainqueur = plateau.vainqueur(); Joueur vainqueur = plateau.vainqueur();
if ( vainqueur != null ) if ( vainqueur != null )
System.out.println( vainqueur + " gagne la partie "); System.out.println( vainqueur + " gagne la partie ");
else else
System.out.println( "Partie nulle "); System.out.println( "Partie nulle ");
return vainqueur; return vainqueur;
} }
public void startTournament( int _nbPartie , boolean _trace) { public void startTournament( int _nbPartie , boolean _trace) {
double[] nbVictoire = new double[2]; double[] nbVictoire = new double[2];
Joueur vainqueur; Joueur vainqueur;
currentJoueur = joueur1; currentJoueur = joueur1;
int numJoueur = 0; int numJoueur = 0;
nbVictoire[0] = nbVictoire[1] = 0; nbVictoire[0] = nbVictoire[1] = 0;
for (int i = 0 ; i < _nbPartie ; i++ ) { for (int i = 0 ; i < _nbPartie ; i++ ) {
vainqueur = startNewGame(_trace); vainqueur = startNewGame(_trace);
if ( vainqueur == joueur1 ) nbVictoire[0]++; if ( vainqueur == joueur1 ) nbVictoire[0]++;
if ( vainqueur == joueur2 ) nbVictoire[1]++; if ( vainqueur == joueur2 ) nbVictoire[1]++;
if ( vainqueur == null ) { if ( vainqueur == null ) {
nbVictoire[0]+=0.5; nbVictoire[0]+=0.5;
nbVictoire[1]+=0.5; nbVictoire[1]+=0.5;
} }
if ( numJoueur == 0 ) { if ( numJoueur == 0 ) {
currentJoueur = joueur2; currentJoueur = joueur2;
numJoueur=1; numJoueur=1;
} }
else { else {
currentJoueur = joueur1; currentJoueur = joueur1;
numJoueur=0; numJoueur=0;
} }
System.out.println(joueur1 + " score : " + nbVictoire[0]); System.out.println(joueur1 + " score : " + nbVictoire[0]);
System.out.println(joueur2 + " score : " + nbVictoire[1]); System.out.println(joueur2 + " score : " + nbVictoire[1]);
} }
System.out.println(joueur1 + " score : " + nbVictoire[0]); System.out.println(joueur1 + " score : " + nbVictoire[0]);
System.out.println(joueur2 + " score : " + nbVictoire[1]); System.out.println(joueur2 + " score : " + nbVictoire[1]);
if (nbVictoire[0] > nbVictoire[1]) if (nbVictoire[0] > nbVictoire[1])
System.out.println(joueur1 + " GAGNE "); System.out.println(joueur1 + " GAGNE ");
else else
if (nbVictoire[1] > nbVictoire[0]) if (nbVictoire[1] > nbVictoire[0])
System.out.println(joueur2 + " GAGNE "); System.out.println(joueur2 + " GAGNE ");
else else
System.out.println("Match nul"); System.out.println("Match nul");
} }
public Joueur getCurrentJoueur() { public Joueur getCurrentJoueur() {
return currentJoueur; return currentJoueur;
} }
} }
package tictactoecodingame; package tictactoecodingame;
/** /**
* @author Franck * @author Franck
*/ */
public class Case { public class Case {
int colonne, ligne; int colonne, ligne;
public Case(int _colonne, int _ligne) { public Case(int _colonne, int _ligne) {
this.colonne = _colonne; this.colonne = _colonne;
this.ligne = _ligne; this.ligne = _ligne;
} }
public int getColonne() { public int getColonne() {
return colonne; return colonne;
} }
public int getLigne() { public int getLigne() {
return ligne; return ligne;
} }
public void setLigne( int _ligne ) { public void setLigne( int _ligne ) {
this.ligne = _ligne; this.ligne = _ligne;
} }
public void setColonne( int _colonne ) { public void setColonne( int _colonne ) {
this.colonne = _colonne; this.colonne = _colonne;
} }
} }
package tictactoecodingame; package tictactoecodingame;
/** /**
* @author Franck * @author Franck
*/ */
public abstract class Coup { public abstract class Coup {
private int note; private int note;
public Coup() { public Coup() {
note = Integer.MIN_VALUE; // un coup est tres mauvais tant qu'il n'est pas analysé. note = Integer.MIN_VALUE; // un coup est tres mauvais tant qu'il n'est pas analysé.
} }
public void setNote(int _note) { public void setNote(int _note) {
note = _note; note = _note;
} }
public int getNote() { public int getNote() {
return note; return note;
} }
abstract public String toString(); abstract public String toString();
abstract public boolean equals(Object obj); abstract public boolean equals(Object obj);
abstract public int hashCode(); abstract public int hashCode();
} }
/* /*
* To change this license header, choose License Headers in Project Properties. * To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package tictactoecodingame; package tictactoecodingame;
/** /**
* *
* @author franck.tempet * @author franck.tempet
*/ */
public class CoupTicTacToe extends Coup { public class CoupTicTacToe extends Coup {
private int colonne, ligne; private int colonne, ligne;
private Jeton jeton; private Jeton jeton;
public CoupTicTacToe( int _colonne , int _ligne , Jeton _jeton ) { public CoupTicTacToe( int _colonne , int _ligne , Jeton _jeton ) {
super(); super();
colonne = _colonne; colonne = _colonne;
ligne = _ligne; ligne = _ligne;
jeton = _jeton; jeton = _jeton;
} }
public int getColonne() { public int getColonne() {
return colonne; return colonne;
} }
public int getLigne() { public int getLigne() {
return ligne; return ligne;
} }
public Jeton getJeton() { public Jeton getJeton() {
return jeton; return jeton;
} }
public String toString() { public String toString() {
return "(" + colonne + "," + ligne + ")" ; return "(" + colonne + "," + ligne + ")" ;
} }
@Override @Override
public boolean equals(Object obj) { public boolean equals(Object obj) {
if ( obj == null ) return false; if ( obj == null ) return false;
if (this.getClass() != obj.getClass()) return false; if (this.getClass() != obj.getClass()) return false;
CoupTicTacToe coup = (CoupTicTacToe)obj; CoupTicTacToe coup = (CoupTicTacToe)obj;
return colonne == coup.getColonne() && ligne==coup.ligne && jeton.toString().equals(coup.getJeton().toString()); return colonne == coup.getColonne() && ligne==coup.ligne && jeton.toString().equals(coup.getJeton().toString());
} }
@Override @Override
public int hashCode() { public int hashCode() {
return jeton.toString().hashCode() + colonne * 10 + ligne; return jeton.toString().hashCode() + colonne * 10 + ligne;
} }
} }
/* /*
* To change this license header, choose License Headers in Project Properties. * To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package tictactoecodingame; package tictactoecodingame;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
* *
* @author franck.tempet * @author franck.tempet
*/ */
public class GrilleTicTacToe3x3 extends Plateau { public class GrilleTicTacToe3x3 extends Plateau {
Jeton[][] grille = new Jeton[3][3]; Jeton[][] grille = new Jeton[3][3];
Jeton[][][] grilleSav = new Jeton[100][3][3]; // Pour sauvegardr la position. 100 au maximum Jeton[][][] grilleSav = new Jeton[100][3][3]; // Pour sauvegardr la position. 100 au maximum
CoupTicTacToe dernierCoup; CoupTicTacToe dernierCoup;
Joueur vainqueur; Joueur vainqueur;
@Override @Override
public void init() { public void init() {
for (int c = 0; c < this.getNbColonnes(); c++) for (int c = 0; c < this.getNbColonnes(); c++)
for (int l = 0; l < this.getNbLignes(); l++) for (int l = 0; l < this.getNbLignes(); l++)
grille[c][l] = null; grille[c][l] = null;
dernierCoup = null; dernierCoup = null;
vainqueur = null; vainqueur = null;
} }
@Override @Override
public Piece getPiece(Case _case) { public Piece getPiece(Case _case) {
return grille[_case.getColonne()][_case.getLigne()]; return grille[_case.getColonne()][_case.getLigne()];
} }
@Override @Override
public void joueCoup(Coup _coup) { public void joueCoup(Coup _coup) {
CoupTicTacToe coup = (CoupTicTacToe) _coup; CoupTicTacToe coup = (CoupTicTacToe) _coup;
grille[coup.getColonne()][coup.getLigne()] = coup.getJeton(); grille[coup.getColonne()][coup.getLigne()] = coup.getJeton();
dernierCoup = coup; dernierCoup = coup;
} }
@Override @Override
public void annuleDernierCoup() { public void annuleDernierCoup() {
grille[dernierCoup.getColonne()][dernierCoup.getLigne()] = null; grille[dernierCoup.getColonne()][dernierCoup.getLigne()] = null;
dernierCoup = null; dernierCoup = null;
} }
@Override @Override
public int getNbColonnes() { public int getNbColonnes() {
return 3; return 3;
} }
@Override @Override
public int getNbLignes() { public int getNbLignes() {
return 3; return 3;
} }
@Override @Override
public boolean partieTerminee() { public boolean partieTerminee() {
if (partieGagnee()) { if (partieGagnee()) {
return true; return true;
} }
return isGrillePleine(); return isGrillePleine();
} }
@Override @Override
public boolean partieGagnee() { public boolean partieGagnee() {
int[][] dir = {{1, 0}, {1, 1}, {0, 1}, {1, -1}}; int[][] dir = {{1, 0}, {1, 1}, {0, 1}, {1, -1}};
int[][] dirOps = {{-1, 0}, {-1, -1}, {0, -1}, {-1, 1}}; int[][] dirOps = {{-1, 0}, {-1, -1}, {0, -1}, {-1, 1}};
int x, y; int x, y;
int nbJetonAligne; int nbJetonAligne;
if (dernierCoup == null) { if (dernierCoup == null) {
return false; return false;
} }
Joueur dernierJoueur = dernierCoup.getJeton().getJoueur(); Joueur dernierJoueur = dernierCoup.getJeton().getJoueur();
/* Regarde si le dernier coup est gagnant */ /* Regarde si le dernier coup est gagnant */
for (int d = 0; d < 4; d++) { for (int d = 0; d < 4; d++) {
nbJetonAligne = 0; nbJetonAligne = 0;
x = dernierCoup.getColonne(); x = dernierCoup.getColonne();
y = dernierCoup.getLigne(); y = dernierCoup.getLigne();
while (x < this.getNbColonnes() && x >= 0 && y < this.getNbLignes() && y >= 0 && grille[x][y] != null && grille[x][y].getJoueur() == dernierJoueur) { while (x < this.getNbColonnes() && x >= 0 && y < this.getNbLignes() && y >= 0 && grille[x][y] != null && grille[x][y].getJoueur() == dernierJoueur) {
nbJetonAligne++; nbJetonAligne++;
if (nbJetonAligne >= 3) { if (nbJetonAligne >= 3) {
vainqueur = dernierJoueur; vainqueur = dernierJoueur;
return true; return true;
} }
x += dir[d][0]; x += dir[d][0];
y += dir[d][1]; y += dir[d][1];
} }
//regarde dans la direction oppose //regarde dans la direction oppose
x = dernierCoup.getColonne(); x = dernierCoup.getColonne();
y = dernierCoup.getLigne(); y = dernierCoup.getLigne();
nbJetonAligne--; nbJetonAligne--;
while (x < this.getNbColonnes() && x >= 0 && y < this.getNbLignes() && y >= 0 && grille[x][y] != null && grille[x][y].getJoueur() == dernierJoueur) { while (x < this.getNbColonnes() && x >= 0 && y < this.getNbLignes() && y >= 0 && grille[x][y] != null && grille[x][y].getJoueur() == dernierJoueur) {
nbJetonAligne++; nbJetonAligne++;
if (nbJetonAligne >= 3) { if (nbJetonAligne >= 3) {
vainqueur = dernierJoueur; vainqueur = dernierJoueur;
return true; return true;
} }
x += dirOps[d][0]; x += dirOps[d][0];
y += dirOps[d][1]; y += dirOps[d][1];
} }
} }
return false; return false;
} }
@Override @Override
public boolean partieNulle() { public boolean partieNulle() {
if (partieGagnee()) { if (partieGagnee()) {
return false; return false;
} }
return isGrillePleine(); return isGrillePleine();
} }
@Override @Override
public ArrayList<Coup> getListeCoups(Joueur _joueur) { public ArrayList<Coup> getListeCoups(Joueur _joueur) {
ArrayList<Coup> listeCoups = new ArrayList<Coup>(); ArrayList<Coup> listeCoups = new ArrayList<Coup>();
for (int c = 0; c < this.getNbColonnes(); c++) { for (int c = 0; c < this.getNbColonnes(); c++) {
for (int l = 0; l < this.getNbLignes(); l++) { for (int l = 0; l < this.getNbLignes(); l++) {
if (grille[c][l] == null) if (grille[c][l] == null)
listeCoups.add(new CoupTicTacToe(c, l, new Jeton(_joueur))); listeCoups.add(new CoupTicTacToe(c, l, new Jeton(_joueur)));
} }
} }
return listeCoups; return listeCoups;
} }
@Override @Override
public boolean isValide(Coup _coup) { public boolean isValide(Coup _coup) {
CoupTicTacToe coup = (CoupTicTacToe) _coup; CoupTicTacToe coup = (CoupTicTacToe) _coup;
return grille[coup.getColonne()][coup.getLigne()] == null; return grille[coup.getColonne()][coup.getLigne()] == null;
} }
@Override @Override
public Coup stringToCoup(String _coup, Joueur _joueur) { public Coup stringToCoup(String _coup, Joueur _joueur) {
int colonne = Integer.valueOf(_coup.charAt(0)+""); int colonne = Integer.valueOf(_coup.charAt(0)+"");
int ligne = Integer.valueOf(_coup.charAt(1)+""); int ligne = Integer.valueOf(_coup.charAt(1)+"");
return new CoupTicTacToe(colonne, ligne , new Jeton(_joueur) ); return new CoupTicTacToe(colonne, ligne , new Jeton(_joueur) );
} }
@Override @Override
public void sauvegardePosition(int _index) { public void sauvegardePosition(int _index) {
for (int c = 0; c < this.getNbColonnes(); c++) for (int c = 0; c < this.getNbColonnes(); c++)
for (int l = 0; l < this.getNbLignes(); l++) for (int l = 0; l < this.getNbLignes(); l++)
grilleSav[_index][c][l] = grille[c][l]; grilleSav[_index][c][l] = grille[c][l];
} }
@Override @Override
public void restaurePosition(int _index) { public void restaurePosition(int _index) {
for (int c = 0; c < this.getNbColonnes(); c++) for (int c = 0; c < this.getNbColonnes(); c++)
for (int l = 0; l < this.getNbLignes(); l++) for (int l = 0; l < this.getNbLignes(); l++)
grille[c][l] = grilleSav[_index][c][l]; grille[c][l] = grilleSav[_index][c][l];
vainqueur = null; vainqueur = null;
} }
private boolean isGrillePleine() { private boolean isGrillePleine() {
for (int c = 0; c < this.getNbColonnes(); c++) { for (int c = 0; c < this.getNbColonnes(); c++) {
for (int l = 0; l < this.getNbLignes(); l++) { for (int l = 0; l < this.getNbLignes(); l++) {
if (grille[c][l] == null) { if (grille[c][l] == null) {
return false; return false;
} }
} }
} }
return true; return true;
} }
@Override @Override
public Joueur vainqueur() { public Joueur vainqueur() {
return vainqueur; return vainqueur;
} }
@Override @Override
public Coup getDernierCoup() { public Coup getDernierCoup() {
return dernierCoup; return dernierCoup;
} }
} }
/* /*
* To change this license header, choose License Headers in Project Properties. * To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package tictactoecodingame; package tictactoecodingame;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
* *
* @author franck.tempet * @author franck.tempet
*/ */
public class GrilleTicTacToe9x9 extends Plateau { public class GrilleTicTacToe9x9 extends Plateau {
Jeton[][] grille9x9 = new Jeton[9][9]; Jeton[][] grille9x9 = new Jeton[9][9];
Jeton[][] grille3x3 = new Jeton[3][3]; // indique si un joueur à gagné un case de la grande grille Jeton[][] grille3x3 = new Jeton[3][3]; // indique si un joueur à gagné un case de la grande grille
Jeton[][][] grille9x9Sav = new Jeton[100][9][9]; // Pour sauvegarder la position. 100 positions Max Jeton[][][] grille9x9Sav = new Jeton[100][9][9]; // Pour sauvegarder la position. 100 positions Max
Jeton[][][] grille3x3Sav = new Jeton[100][3][3]; // Pour sauvegarder la position Jeton[][][] grille3x3Sav = new Jeton[100][3][3]; // Pour sauvegarder la position
int nbPostionSauvegarde; int nbPostionSauvegarde;
CoupTicTacToe dernierCoup; CoupTicTacToe dernierCoup;
CoupTicTacToe dernierCoupSav; CoupTicTacToe dernierCoupSav;
Joueur vainqueur; Joueur vainqueur;
boolean grilleGagnee , grilleGagneeSav; // vrai si dernier coup gagne une grille boolean grilleGagnee , grilleGagneeSav; // vrai si dernier coup gagne une grille
@Override @Override
public void init() { public void init() {
for (int c = 0; c < this.getNbColonnes(); c++) { for (int c = 0; c < this.getNbColonnes(); c++) {
for (int l = 0; l < this.getNbLignes(); l++) { for (int l = 0; l < this.getNbLignes(); l++) {
grille9x9[c][l] = null; grille9x9[c][l] = null;
} }
} }
for (int c = 0; c < 3; c++) { for (int c = 0; c < 3; c++) {
for (int l = 0; l < 3; l++) { for (int l = 0; l < 3; l++) {
grille3x3[c][l] = null; grille3x3[c][l] = null;
} }
} }
dernierCoup = null; dernierCoup = null;
vainqueur = null; vainqueur = null;
grilleGagnee = false; grilleGagnee = false;
nbPostionSauvegarde = 0; nbPostionSauvegarde = 0;
} }
@Override @Override
public Piece getPiece(Case _case) { public Piece getPiece(Case _case) {
return grille9x9[_case.getColonne()][_case.getLigne()]; return grille9x9[_case.getColonne()][_case.getLigne()];
} }
@Override @Override
public void joueCoup(Coup _coup) { public void joueCoup(Coup _coup) {
CoupTicTacToe coup = (CoupTicTacToe) _coup; CoupTicTacToe coup = (CoupTicTacToe) _coup;
grille9x9[coup.getColonne()][coup.getLigne()] = coup.getJeton(); grille9x9[coup.getColonne()][coup.getLigne()] = coup.getJeton();
dernierCoup = coup; dernierCoup = coup;
int x0 = (coup.getColonne() / 3) * 3; int x0 = (coup.getColonne() / 3) * 3;
int y0 = (coup.getLigne() / 3) * 3; int y0 = (coup.getLigne() / 3) * 3;
// System.out.println("Test grande grille"); // System.out.println("Test grande grille");
if (caseGagnante(grille9x9, x0, y0, coup.getColonne(), coup.getLigne())) { if (caseGagnante(grille9x9, x0, y0, coup.getColonne(), coup.getLigne())) {
grille3x3[coup.getColonne() / 3][coup.getLigne() / 3] = coup.getJeton(); grille3x3[coup.getColonne() / 3][coup.getLigne() / 3] = coup.getJeton();
grilleGagnee = true; grilleGagnee = true;
} }
} }
@Override @Override
public void annuleDernierCoup() { public void annuleDernierCoup() {
grille9x9[dernierCoup.getColonne()][dernierCoup.getLigne()] = null; grille9x9[dernierCoup.getColonne()][dernierCoup.getLigne()] = null;
dernierCoup = null; dernierCoup = null;
} }
@Override @Override
public int getNbColonnes() { public int getNbColonnes() {
return 9; return 9;
} }
@Override @Override
public int getNbLignes() { public int getNbLignes() {
return 9; return 9;
} }
@Override @Override
public boolean partieTerminee() { public boolean partieTerminee() {
if (vainqueur != null) { if (vainqueur != null) {
return true; return true;
} }
if (partieGagnee()) { if (partieGagnee()) {
return true; return true;
} }
return isGrillePleine(); return isGrillePleine();
} }
/** /**
* Regarde si le joueur vient de gagner sur une case en 3x3 * Regarde si le joueur vient de gagner sur une case en 3x3
* *
* @param _grille soit la grille 9x9 soit la grille 3x3 * @param _grille soit la grille 9x9 soit la grille 3x3
* @param _x0 x min de la grille à analyser * @param _x0 x min de la grille à analyser
* @param _y0 y min de la grille à analyser * @param _y0 y min de la grille à analyser
* @param _coupX où le joueur a joué * @param _coupX où le joueur a joué
* @param _coupY * @param _coupY
* @return * @return
*/ */
public boolean caseGagnante(Jeton[][] _grille, int _x0, int _y0, int _coupX, int _coupY) { public boolean caseGagnante(Jeton[][] _grille, int _x0, int _y0, int _coupX, int _coupY) {
int[][] dir = {{1, 0}, {1, 1}, {0, 1}, {1, -1}}; int[][] dir = {{1, 0}, {1, 1}, {0, 1}, {1, -1}};
int[][] dirOps = {{-1, 0}, {-1, -1}, {0, -1}, {-1, 1}}; int[][] dirOps = {{-1, 0}, {-1, -1}, {0, -1}, {-1, 1}};
int xMax = _x0 + 3, yMax = _y0 + 3; int xMax = _x0 + 3, yMax = _y0 + 3;
int x, y; int x, y;
int nbJetonAligne; int nbJetonAligne;
Joueur dernierJoueur = dernierCoup.getJeton().getJoueur(); Joueur dernierJoueur = dernierCoup.getJeton().getJoueur();
/* Regarde si le dernier coup est gagnant */ /* Regarde si le dernier coup est gagnant */
for (int d = 0; d < 4; d++) { for (int d = 0; d < 4; d++) {
nbJetonAligne = 0; nbJetonAligne = 0;
x = _coupX; x = _coupX;
y = _coupY; y = _coupY;
while (x < xMax && x >= _x0 && y < yMax && y >= _y0 && _grille[x][y] != null && _grille[x][y].getJoueur() == dernierJoueur) { while (x < xMax && x >= _x0 && y < yMax && y >= _y0 && _grille[x][y] != null && _grille[x][y].getJoueur() == dernierJoueur) {
nbJetonAligne++; nbJetonAligne++;
if (nbJetonAligne >= 3) { if (nbJetonAligne >= 3) {
return true; return true;
} }
x += dir[d][0]; x += dir[d][0];
y += dir[d][1]; y += dir[d][1];
} }
//regarde dans la direction opposée //regarde dans la direction opposée
x = _coupX; x = _coupX;
y = _coupY; y = _coupY;
nbJetonAligne--; nbJetonAligne--;
while (x < xMax && x >= _x0 && y < yMax && y >= _y0 && _grille[x][y] != null && _grille[x][y].getJoueur() == dernierJoueur) { while (x < xMax && x >= _x0 && y < yMax && y >= _y0 && _grille[x][y] != null && _grille[x][y].getJoueur() == dernierJoueur) {
nbJetonAligne++; nbJetonAligne++;
if (nbJetonAligne >= 3) { if (nbJetonAligne >= 3) {
return true; return true;
} }
x += dirOps[d][0]; x += dirOps[d][0];
y += dirOps[d][1]; y += dirOps[d][1];
} }
} }
return false; return false;
} }
@Override @Override
public boolean partieGagnee() { public boolean partieGagnee() {
if (dernierCoup == null) { if (dernierCoup == null) {
return false; return false;
} }
if ( grilleGagnee) { // si le dernier coup a gagne une grille on regarde si on gagne sur la grande grille if ( grilleGagnee) { // si le dernier coup a gagne une grille on regarde si on gagne sur la grande grille
if (caseGagnante(grille3x3, 0, 0, dernierCoup.getColonne() / 3, dernierCoup.getLigne() / 3)) { if (caseGagnante(grille3x3, 0, 0, dernierCoup.getColonne() / 3, dernierCoup.getLigne() / 3)) {
vainqueur = dernierCoup.getJeton().getJoueur(); vainqueur = dernierCoup.getJeton().getJoueur();
return true; return true;
} }
} }
// Compte le nombre de cases remportées par chaque joueur // Compte le nombre de cases remportées par chaque joueur
if (isGrillePleine()) { if (isGrillePleine()) {
int[] nbCase = new int[2]; int[] nbCase = new int[2];
Joueur[] joueur = new Joueur[2]; Joueur[] joueur = new Joueur[2];
for (int c = 0; c < 3; c++) { for (int c = 0; c < 3; c++) {
for (int l = 0; l < 3; l++) { for (int l = 0; l < 3; l++) {
if (grille3x3[c][l] != null) { if (grille3x3[c][l] != null) {
nbCase[grille3x3[c][l].getJoueur().getIdJoueur()]++; nbCase[grille3x3[c][l].getJoueur().getIdJoueur()]++;
joueur[grille3x3[c][l].getJoueur().getIdJoueur()] = grille3x3[c][l].getJoueur(); joueur[grille3x3[c][l].getJoueur().getIdJoueur()] = grille3x3[c][l].getJoueur();
} }
} }
} }
if (nbCase[0] > nbCase[1]) { if (nbCase[0] > nbCase[1]) {
vainqueur = joueur[0]; vainqueur = joueur[0];
return true; return true;
} }
if (nbCase[1] > nbCase[0]) { if (nbCase[1] > nbCase[0]) {
vainqueur = joueur[1]; vainqueur = joueur[1];
return true; return true;
} }
vainqueur = null; vainqueur = null;
return true; return true;
} }
return false; return false;
} }
@Override @Override
public boolean partieNulle() { public boolean partieNulle() {
if (vainqueur != null) { if (vainqueur != null) {
return false; return false;
} }
if (partieGagnee()) { if (partieGagnee()) {
return false; return false;
} }
return isGrillePleine(); return isGrillePleine();
} }
@Override @Override
public ArrayList<Coup> getListeCoups(Joueur _joueur) { public ArrayList<Coup> getListeCoups(Joueur _joueur) {
ArrayList<Coup> listeCoups = new ArrayList<Coup>(); ArrayList<Coup> listeCoups = new ArrayList<Coup>();
if (dernierCoup != null) { if (dernierCoup != null) {
int x0 = (dernierCoup.getColonne() % 3) * 3; int x0 = (dernierCoup.getColonne() % 3) * 3;
int y0 = (dernierCoup.getLigne() % 3) * 3; int y0 = (dernierCoup.getLigne() % 3) * 3;
for (int c = x0; c < x0 + 3; c++) { for (int c = x0; c < x0 + 3; c++) {
for (int l = y0; l < y0 + 3; l++) { for (int l = y0; l < y0 + 3; l++) {
if ( grille3x3[(c/3)][(l/3)] != null ) continue; // on ne peut pas jouer dans une grille gagnée if ( grille3x3[(c/3)][(l/3)] != null ) continue; // on ne peut pas jouer dans une grille gagnée
if (grille9x9[c][l] == null) { if (grille9x9[c][l] == null) {
listeCoups.add(new CoupTicTacToe(c, l, new Jeton(_joueur))); listeCoups.add(new CoupTicTacToe(c, l, new Jeton(_joueur)));
} }
} }
} }
} }
if (listeCoups.isEmpty()) { if (listeCoups.isEmpty()) {
for (int c = 0; c < this.getNbColonnes(); c++) { for (int c = 0; c < this.getNbColonnes(); c++) {
for (int l = 0; l < this.getNbLignes(); l++) { for (int l = 0; l < this.getNbLignes(); l++) {
if ( grille3x3[(c/3)][(l/3)] != null ) continue; // on ne peut pas jouer dans une grille gagnée if ( grille3x3[(c/3)][(l/3)] != null ) continue; // on ne peut pas jouer dans une grille gagnée
if (grille9x9[c][l] == null) { if (grille9x9[c][l] == null) {
listeCoups.add(new CoupTicTacToe(c, l, new Jeton(_joueur))); listeCoups.add(new CoupTicTacToe(c, l, new Jeton(_joueur)));
} }
} }
} }
} }
return listeCoups; return listeCoups;
} }
@Override @Override
public boolean isValide(Coup _coup) { public boolean isValide(Coup _coup) {
CoupTicTacToe coup = (CoupTicTacToe) _coup; CoupTicTacToe coup = (CoupTicTacToe) _coup;
if ( grille9x9[coup.getColonne()][coup.getLigne()] != null ) return false; if ( grille9x9[coup.getColonne()][coup.getLigne()] != null ) return false;
if ( dernierCoup == null ) return true; if ( dernierCoup == null ) return true;
int x0 = (dernierCoup.getColonne() % 3 ) * 3; int x0 = (dernierCoup.getColonne() % 3 ) * 3;
int y0 = (dernierCoup.getLigne() % 3 ) * 3; int y0 = (dernierCoup.getLigne() % 3 ) * 3;
boolean grillePleine = true; boolean grillePleine = true;
for (int c = x0; c < x0+3 ; c++) { for (int c = x0; c < x0+3 ; c++) {
for (int l = y0; l < y0+3 ; l++) { for (int l = y0; l < y0+3 ; l++) {
if ( grille3x3[c/3][l/3] != null ) continue; // les grilles gagneés sont pleines if ( grille3x3[c/3][l/3] != null ) continue; // les grilles gagneés sont pleines
if ( grille9x9[c][l] == null ) { if ( grille9x9[c][l] == null ) {
grillePleine = false; grillePleine = false;
break; break;
} }
} }
} }
if ( grillePleine ) { if ( grillePleine ) {
return true; return true;
} }
return ( coup.getColonne() >= x0 && coup.getColonne() < x0+3 && coup.getLigne()>= y0 && coup.getLigne() < y0+3 ); return ( coup.getColonne() >= x0 && coup.getColonne() < x0+3 && coup.getLigne()>= y0 && coup.getLigne() < y0+3 );
} }
@Override @Override
public Coup stringToCoup(String _coup, Joueur _joueur) { public Coup stringToCoup(String _coup, Joueur _joueur) {
int colonne = Integer.valueOf(_coup.charAt(0) + ""); int colonne = Integer.valueOf(_coup.charAt(0) + "");
int ligne = Integer.valueOf(_coup.charAt(1) + ""); int ligne = Integer.valueOf(_coup.charAt(1) + "");
return new CoupTicTacToe(colonne, ligne, new Jeton(_joueur)); return new CoupTicTacToe(colonne, ligne, new Jeton(_joueur));
} }
@Override @Override
public void sauvegardePosition(int _index ) { public void sauvegardePosition(int _index ) {
for (int c = 0; c < this.getNbColonnes(); c++) { for (int c = 0; c < this.getNbColonnes(); c++) {
for (int l = 0; l < this.getNbLignes(); l++) { for (int l = 0; l < this.getNbLignes(); l++) {
grille9x9Sav[_index][c][l] = grille9x9[c][l]; grille9x9Sav[_index][c][l] = grille9x9[c][l];
} }
} }
for (int c = 0; c < 3; c++) { for (int c = 0; c < 3; c++) {
for (int l = 0; l < 3; l++) { for (int l = 0; l < 3; l++) {
grille3x3Sav[_index][c][l] = grille3x3[c][l]; grille3x3Sav[_index][c][l] = grille3x3[c][l];
} }
} }
dernierCoupSav = dernierCoup; dernierCoupSav = dernierCoup;
grilleGagneeSav = grilleGagnee; grilleGagneeSav = grilleGagnee;
} }
@Override @Override
public void restaurePosition( int _index ) { public void restaurePosition( int _index ) {
for (int c = 0; c < this.getNbColonnes(); c++) { for (int c = 0; c < this.getNbColonnes(); c++) {
for (int l = 0; l < this.getNbLignes(); l++) { for (int l = 0; l < this.getNbLignes(); l++) {
grille9x9[c][l] = grille9x9Sav[_index][c][l]; grille9x9[c][l] = grille9x9Sav[_index][c][l];
} }
} }
for (int c = 0; c < 3; c++) { for (int c = 0; c < 3; c++) {
for (int l = 0; l < 3; l++) { for (int l = 0; l < 3; l++) {
grille3x3[c][l] = grille3x3Sav[_index][c][l]; grille3x3[c][l] = grille3x3Sav[_index][c][l];
} }
} }
vainqueur = null; vainqueur = null;
dernierCoup = dernierCoupSav; dernierCoup = dernierCoupSav;
grilleGagnee = grilleGagneeSav; grilleGagnee = grilleGagneeSav;
} }
private boolean isGrillePleine() { private boolean isGrillePleine() {
for (int c = 0; c < this.getNbColonnes(); c++) { for (int c = 0; c < this.getNbColonnes(); c++) {
for (int l = 0; l < this.getNbLignes(); l++) { for (int l = 0; l < this.getNbLignes(); l++) {
if ( grille3x3[c/3][l/3] != null ) continue; // les grilles gagnées sont pleines if ( grille3x3[c/3][l/3] != null ) continue; // les grilles gagnées sont pleines
if (grille9x9[c][l] == null) { if (grille9x9[c][l] == null) {
return false; return false;
} }
} }
} }
return true; return true;
} }
@Override @Override
public Joueur vainqueur() { public Joueur vainqueur() {
return vainqueur; return vainqueur;
} }
void trace() { void trace() {
for (int l = 2; l >= 0; l--) { for (int l = 2; l >= 0; l--) {
for (int c = 0; c < 3; c++) { for (int c = 0; c < 3; c++) {
System.out.print(grille3x3[c][l] + " "); System.out.print(grille3x3[c][l] + " ");
} }
System.out.println(""); System.out.println("");
} }
} }
@Override @Override
public Coup getDernierCoup() { public Coup getDernierCoup() {
return dernierCoup; return dernierCoup;
} }
} }
/* /*
* To change this license header, choose License Headers in Project Properties. * To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates * To change this template file, choose Tools | Templates
* and open the template in the editor. * and open the template in the editor.
*/ */
package tictactoecodingame; package tictactoecodingame;
/** /**
* *
* @author franck.tempet * @author franck.tempet
*/ */
public class Jeton extends Piece { public class Jeton extends Piece {
public Jeton( Joueur _joueur ) { public Jeton( Joueur _joueur ) {
super( _joueur ); super( _joueur );
} }
public String toString() { public String toString() {
if ((getJoueur().getIdJoueur()) == 1) { if ((getJoueur().getIdJoueur()) == 1) {
return "X"; return "X";
} }
else { else {
return "O"; return "O";
} }
} }
} }
\ No newline at end of file
package tictactoecodingame; package tictactoecodingame;
/** /**
* @author Franck * @author Franck
* *
*/ */
public abstract class Joueur { public abstract class Joueur {
private String nom; private String nom;
private static int nbJoueur = 0; private static int nbJoueur = 0;
private int idJoueur; private int idJoueur;
public Joueur( String _nom ) { public Joueur( String _nom ) {
idJoueur = nbJoueur; idJoueur = nbJoueur;
nbJoueur++; nbJoueur++;
this.nom = _nom; this.nom = _nom;
} }
public void setNom ( String _nom ) { public void setNom ( String _nom ) {
this.nom = _nom; this.nom = _nom;
} }
public String getNom() { public String getNom() {
return nom; return nom;
} }
public int getIdJoueur() { public int getIdJoueur() {
return idJoueur; return idJoueur;
} }
abstract public Coup joue( Plateau p_plateau ); abstract public Coup joue( Plateau p_plateau );
public String toString() { public String toString() {
return nom; return nom;
} }
public void forceId(int id){ public void forceId(int id){
idJoueur = id; idJoueur = id;
} }
} }
package tictactoecodingame; package tictactoecodingame;
/** /**
* @author Franck * @author Franck
* *
*/ */
import java.io.InputStreamReader; import java.io.InputStreamReader;
import java.io.IOException; import java.io.IOException;
/** /**
* @author Franck * @author Franck
*/ */
public class JoueurHumain extends Joueur { public class JoueurHumain extends Joueur {
public JoueurHumain( String _joueur ) { public JoueurHumain( String _joueur ) {
super( _joueur ); super( _joueur );
} }
public Coup joue(Plateau _plateau) { public Coup joue(Plateau _plateau) {
InputStreamReader clavier = new InputStreamReader(System.in); InputStreamReader clavier = new InputStreamReader(System.in);
char buffer[] = new char[10]; char buffer[] = new char[10];
String monCoup = null; String monCoup = null;
// Demande au joueur de saisir son Coup // Demande au joueur de saisir son Coup
System.out.println("Votre coup : "); System.out.println("Votre coup : ");
try { try {
int nbCar = clavier.read(buffer, 0, 5); int nbCar = clavier.read(buffer, 0, 5);
monCoup = new String(buffer, 0, nbCar-1); monCoup = new String(buffer, 0, nbCar-1);
return _plateau.stringToCoup(monCoup, this); return _plateau.stringToCoup(monCoup, this);
} catch (IOException e) { } catch (IOException e) {
return null; return null;
} }
} }
} }
package tictactoecodingame; package tictactoecodingame;
/** /**
* @author Franck * @author Franck
*/ */
public class JoueurOrdi extends Joueur { public class JoueurOrdi extends Joueur {
boolean ponder; // Si vrai l'ordinateur réfléchi pendant la reflexion de son adversaire boolean ponder; // Si vrai l'ordinateur réfléchi pendant la reflexion de son adversaire
AlgoRecherche algoRecherche; AlgoRecherche algoRecherche;
public JoueurOrdi(String _nom) { public JoueurOrdi(String _nom) {
super(_nom); super(_nom);
ponder = false; ponder = false;
} }
public JoueurOrdi( String _nom , AlgoRecherche _algo , boolean _ponder ) { public JoueurOrdi( String _nom , AlgoRecherche _algo , boolean _ponder ) {
super( _nom ); super( _nom );
algoRecherche = _algo; algoRecherche = _algo;
ponder = _ponder; ponder = _ponder;
} }
public JoueurOrdi( String _nom , AlgoRecherche _algo ) { public JoueurOrdi( String _nom , AlgoRecherche _algo ) {
this( _nom , _algo , false ); this( _nom , _algo , false );
} }
public AlgoRecherche getAlgoRecherche() { public AlgoRecherche getAlgoRecherche() {
return algoRecherche; return algoRecherche;
} }
public void setAlgoRecherche(AlgoRecherche _algoRecherche) { public void setAlgoRecherche(AlgoRecherche _algoRecherche) {
algoRecherche = _algoRecherche; algoRecherche = _algoRecherche;
} }
public Coup joue(Plateau _plateau ) { public Coup joue(Plateau _plateau ) {
Coup coupOrdi; Coup coupOrdi;
coupOrdi = algoRecherche.meilleurCoup(_plateau , this , ponder); coupOrdi = algoRecherche.meilleurCoup(_plateau , this , ponder);
return coupOrdi; return coupOrdi;
} }
} }
package tictactoecodingame; package tictactoecodingame;
/** /**
* @author Franck * @author Franck
*/ */
public abstract class Piece { public abstract class Piece {
private Joueur joueur; private Joueur joueur;
public Piece( Joueur _joueur ) { public Piece( Joueur _joueur ) {
this.joueur = _joueur; this.joueur = _joueur;
} }
public void setJoueur(Joueur _joueur) { public void setJoueur(Joueur _joueur) {
joueur = _joueur; joueur = _joueur;
} }
public Joueur getJoueur() { public Joueur getJoueur() {
return joueur; return joueur;
} }
abstract public String toString(); abstract public String toString();
} }
package tictactoecodingame; package tictactoecodingame;
import java.util.ArrayList; import java.util.ArrayList;
/** /**
* @author Franck * @author Franck
* *
* Classe générique pour les jeux de plateau à 2 joueurs ( une grille de puissance 4 , un échiquier , .. ) * Classe générique pour les jeux de plateau à 2 joueurs ( une grille de puissance 4 , un échiquier , .. )
*/ */
public abstract class Plateau { public abstract class Plateau {
abstract public void init(); // Initialise le plateau pour le démarrage d'une nouvelle partie. abstract public void init(); // Initialise le plateau pour le démarrage d'une nouvelle partie.
abstract public Piece getPiece(Case _case); // Retourne la pièce presente sur la case _case abstract public Piece getPiece(Case _case); // Retourne la pièce presente sur la case _case
abstract public void joueCoup(Coup _coup); // Joue le coup _coup sur le plateau abstract public void joueCoup(Coup _coup); // Joue le coup _coup sur le plateau
abstract public void annuleDernierCoup(); // Annule le dernier coup joué abstract public void annuleDernierCoup(); // Annule le dernier coup joué
abstract public int getNbColonnes(); // Retourne le nombre de colonnes du plateau abstract public int getNbColonnes(); // Retourne le nombre de colonnes du plateau
abstract public int getNbLignes(); // Retourne le nombre de lignes du plateau abstract public int getNbLignes(); // Retourne le nombre de lignes du plateau
abstract public boolean partieTerminee(); // Vrai si la partie est terminee ( soit un gagnant soit un match nulle ) abstract public boolean partieTerminee(); // Vrai si la partie est terminee ( soit un gagnant soit un match nulle )
abstract public boolean partieGagnee(); // Vrai si le dernier joueur a gagné la partie abstract public boolean partieGagnee(); // Vrai si le dernier joueur a gagné la partie
abstract public boolean partieNulle(); // Vrai si la partie est nulle abstract public boolean partieNulle(); // Vrai si la partie est nulle
abstract public Joueur vainqueur(); // Retourne le joueur qui a gagné la partie abstract public Joueur vainqueur(); // Retourne le joueur qui a gagné la partie
abstract public ArrayList<Coup> getListeCoups(Joueur _joueur); // Retourne la liste des coups possibles. abstract public ArrayList<Coup> getListeCoups(Joueur _joueur); // Retourne la liste des coups possibles.
abstract public boolean isValide(Coup _coup); // Retourne Vrai si le coup est valide. abstract public boolean isValide(Coup _coup); // Retourne Vrai si le coup est valide.
abstract public Coup stringToCoup(String _coup, Joueur _joueur); // Convertion d'une chaine de caractères en un Coup abstract public Coup stringToCoup(String _coup, Joueur _joueur); // Convertion d'une chaine de caractères en un Coup
abstract public void sauvegardePosition(int _index); // Sauvegarde la position courante dans l'indice _index abstract public void sauvegardePosition(int _index); // Sauvegarde la position courante dans l'indice _index
abstract public void restaurePosition(int _index); // restaure la position sauvegarde en indice _index abstract public void restaurePosition(int _index); // restaure la position sauvegarde en indice _index
abstract public Coup getDernierCoup(); // Retourne le dernierCoup joue abstract public Coup getDernierCoup(); // Retourne le dernierCoup joue
public String toString() { // Donne une représentation du plateau sous forme d'une chaine de caractères public String toString() { // Donne une représentation du plateau sous forme d'une chaine de caractères
Piece piece; Piece piece;
String chainePlateau = new String(); String chainePlateau = new String();
for (int ligne = getNbLignes() - 1; ligne >= 0; ligne--) { for (int ligne = getNbLignes() - 1; ligne >= 0; ligne--) {
chainePlateau += ligne; chainePlateau += ligne;
for (int colonne = 0; colonne < getNbColonnes(); colonne++) { for (int colonne = 0; colonne < getNbColonnes(); colonne++) {
piece = getPiece(new Case(colonne, ligne)); piece = getPiece(new Case(colonne, ligne));
if (piece == null) { if (piece == null) {
chainePlateau += "| "; chainePlateau += "| ";
} else { } else {
chainePlateau += "|" + piece + " "; chainePlateau += "|" + piece + " ";
} }
} }
chainePlateau += "|\n "; chainePlateau += "|\n ";
for (int colonne = 0; colonne < getNbColonnes(); colonne++) { for (int colonne = 0; colonne < getNbColonnes(); colonne++) {
chainePlateau += "____"; chainePlateau += "____";
} }
chainePlateau += "\n"; chainePlateau += "\n";
} }
for (int colonne = 0; colonne < getNbColonnes(); colonne++) for (int colonne = 0; colonne < getNbColonnes(); colonne++)
chainePlateau += " "+ colonne + " "; chainePlateau += " "+ colonne + " ";
return chainePlateau; return chainePlateau;
} }
} }
package tictactoecodingame; package tictactoecodingame;
/** /**
* *
* @author franck * @author franck
*/ */
/*--------------------------------------------------------*/ /*--------------------------------------------------------*/
/* Version jeu en local */ /* Version jeu en local */
/*--------------------------------------------------------*/ /*--------------------------------------------------------*/
public class Player { public class Player {
public static void main(String args[]) { public static void main(String args[]) {
//JoueurHumain humain = new JoueurHumain("Humain"); //JoueurHumain humain = new JoueurHumain("Humain");
JoueurOrdi joueurOrdi1 = new JoueurOrdi("Ordi1"); JoueurOrdi joueurOrdi1 = new JoueurOrdi("Ordi1");
JoueurOrdi joueurOrdi2 = new JoueurOrdi("Ordi2"); JoueurOrdi joueurOrdi2 = new JoueurOrdi("Ordi2");
//Il faut deux joueurs car l'id fixe le jeton //Il faut deux joueurs car l'id fixe le jeton
AlgoRechercheMinMax minmax = new AlgoRechercheMinMax(9, 100, joueurOrdi1, joueurOrdi2); AlgoRechercheMinMax minmax = new AlgoRechercheMinMax(3, 10, joueurOrdi1, joueurOrdi2);
joueurOrdi1.setAlgoRecherche(minmax); joueurOrdi1.setAlgoRecherche(minmax);
joueurOrdi2.setAlgoRecherche(minmax); joueurOrdi2.setAlgoRecherche(minmax);
GrilleTicTacToe3x3 grille = new GrilleTicTacToe3x3(); GrilleTicTacToe9x9 grille = new GrilleTicTacToe9x9();
Arbitre a = new Arbitre(grille, joueurOrdi1 , joueurOrdi2); Arbitre a = new Arbitre(grille, joueurOrdi1 , joueurOrdi2);
//Arbitre a = new Arbitre(grille, joueurOrdi , humain ); //Arbitre a = new Arbitre(grille, joueurOrdi , humain );
a.startNewGame(true); // Demarre une partie en affichant la grille du jeu a.startNewGame(true); // Demarre une partie en affichant la grille du jeu
// Pour lancer un tournooi de 100 parties en affichant la grille du jeu // Pour lancer un tournooi de 100 parties en affichant la grille du jeu
//a.startTournament(1000 , false); //a.startTournament(1000 , false);
} }
} }
/*--------------------------------------------------------*/ /*--------------------------------------------------------*/
/* Version Codin game */ /* Version Codin game */
/*--------------------------------------------------------*/ /*--------------------------------------------------------*/
/* /*
import java.util.Scanner; import java.util.Scanner;
class Player { class Player {
public static void main(String args[]) { public static void main(String args[]) {
Scanner in = new Scanner(System.in); Scanner in = new Scanner(System.in);
CoupTicTacToe3x3 coup; CoupTicTacToe3x3 coup;
JoueurHumain adversaire = new JoueurHumain("Adversaire"); JoueurHumain adversaire = new JoueurHumain("Adversaire");
JoueurOrdi joueurOrdi = new JoueurOrdi("Ordi"); JoueurOrdi joueurOrdi = new JoueurOrdi("Ordi");
AlgoRechercheAleatoire alea = new AlgoRechercheAleatoire( ); // L'ordinateur joue au hasard AlgoRechercheAleatoire alea = new AlgoRechercheAleatoire( ); // L'ordinateur joue au hasard
joueurOrdi.setAlgoRecherche(alea); joueurOrdi.setAlgoRecherche(alea);
GrilleTicTacToe3x3 grille = new GrilleTicTacToe3x3(); GrilleTicTacToe3x3 grille = new GrilleTicTacToe3x3();
grille.init(); grille.init();
while (true) { while (true) {
int opponentRow = in.nextInt(); int opponentRow = in.nextInt();
int opponentCol = in.nextInt(); int opponentCol = in.nextInt();
int validActionCount = in.nextInt(); int validActionCount = in.nextInt();
for (int i = 0; i < validActionCount; i++) { for (int i = 0; i < validActionCount; i++) {
int row = in.nextInt(); int row = in.nextInt();
int col = in.nextInt(); int col = in.nextInt();
} }
if ( opponentCol != -1 ) { if ( opponentCol != -1 ) {
coup = new CoupTicTacToe3x3(opponentCol, opponentRow, new Jeton(adversaire)); coup = new CoupTicTacToe3x3(opponentCol, opponentRow, new Jeton(adversaire));
grille.joueCoup(coup); grille.joueCoup(coup);
} }
coup = (CoupTicTacToe3x3) joueurOrdi.joue(grille); coup = (CoupTicTacToe3x3) joueurOrdi.joue(grille);
grille.joueCoup(coup); grille.joueCoup(coup);
System.out.println(coup.getLigne() + " " + coup.getColonne() ); System.out.println(coup.getLigne() + " " + coup.getColonne() );
System.out.flush(); System.out.flush();
} }
} }
} }
*/ */
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment