Commit 1a090909 authored by Alain's avatar Alain

Merge origin/master

parents fb38c815 c752c68b
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package tictactoecodingame;
import java.util.ArrayList;
import java.util.Random;
/**
*
* @author franck.tempet
*/
public class AlgoRechercheAleatoire extends AlgoRecherche{
Random rnd;
public AlgoRechercheAleatoire() {
rnd = new Random();
}
@Override
public Coup meilleurCoup(Plateau _plateau, Joueur _joueur, boolean _ponder) {
ArrayList<Coup> coups = _plateau.getListeCoups(_joueur);
return coups.get(rnd.nextInt( coups.size()));
}
}
package tictactoecodingame;
/**
* @author Franck
*
*/
public class Arbitre {
Joueur joueur1; // Joueur qui commence la partie
Joueur joueur2; // Adversaire
Joueur currentJoueur; // C'est à son tour de jouer
Plateau plateau; // Le plateau du jeu
public Arbitre(Plateau _plateau, Joueur _joueur1, Joueur _joueur2) {
plateau = _plateau;
joueur1 = _joueur1;
joueur2 = _joueur2;
currentJoueur = joueur1; // Le joueur1 commence la partie.
}
/**
* Demarre une nouvelle Partie
* Retourne le joueur qui gagne , null si c'est un match nul
*
* @param _trace si vrai affiche le plateau et le joueur courant
*/
public Joueur startNewGame( boolean _trace ) {
Coup coup;
plateau.init(); // Prépare le plateau pour le jeu.
while (!plateau.partieTerminee()) {
do {
if ( _trace ) {
System.out.println(plateau);
System.out.println(currentJoueur + " ( " +currentJoueur.getIdJoueur() + " ) joue : " );
}
coup = currentJoueur.joue(plateau);
if (!plateau.isValide(coup)) {
if ( _trace )
System.err.println("Coup non valide ! : " + currentJoueur);
else { // en mode batch le joueur perd la partie
System.err.println("Coup non valide ! : " + currentJoueur);
if (currentJoueur == joueur1) return joueur2; else return joueur1;
}
}
} while (!plateau.isValide(coup));
plateau.joueCoup(coup);
if (currentJoueur == joueur1) {
currentJoueur = joueur2;
} else {
currentJoueur = joueur1;
}
}
Joueur vainqueur = plateau.vainqueur();
if ( vainqueur != null )
System.out.println( vainqueur + " gagne la partie ");
else
System.out.println( "Partie nulle ");
return vainqueur;
}
public void startTournament( int _nbPartie , boolean _trace) {
double[] nbVictoire = new double[2];
Joueur vainqueur;
currentJoueur = joueur1;
int numJoueur = 0;
nbVictoire[0] = nbVictoire[1] = 0;
for (int i = 0 ; i < _nbPartie ; i++ ) {
vainqueur = startNewGame(_trace);
if ( vainqueur == joueur1 ) nbVictoire[0]++;
if ( vainqueur == joueur2 ) nbVictoire[1]++;
if ( vainqueur == null ) {
nbVictoire[0]+=0.5;
nbVictoire[1]+=0.5;
}
if ( numJoueur == 0 ) {
currentJoueur = joueur2;
numJoueur=1;
}
else {
currentJoueur = joueur1;
numJoueur=0;
}
System.out.println(joueur1 + " score : " + nbVictoire[0]);
System.out.println(joueur2 + " score : " + nbVictoire[1]);
}
System.out.println(joueur1 + " score : " + nbVictoire[0]);
System.out.println(joueur2 + " score : " + nbVictoire[1]);
if (nbVictoire[0] > nbVictoire[1])
System.out.println(joueur1 + " GAGNE ");
else
if (nbVictoire[1] > nbVictoire[0])
System.out.println(joueur2 + " GAGNE ");
else
System.out.println("Match nul");
}
public Joueur getCurrentJoueur() {
return currentJoueur;
}
}
\ No newline at end of file
package tictactoecodingame;
/**
* @author Franck
*/
public class Case {
int colonne, ligne;
public Case(int _colonne, int _ligne) {
this.colonne = _colonne;
this.ligne = _ligne;
}
public int getColonne() {
return colonne;
}
public int getLigne() {
return ligne;
}
public void setLigne( int _ligne ) {
this.ligne = _ligne;
}
public void setColonne( int _colonne ) {
this.colonne = _colonne;
}
}
package tictactoecodingame;
/**
* @author Franck
*/
public abstract class Coup {
private int note;
public Coup() {
note = Integer.MIN_VALUE; // un coup est tres mauvais tant qu'il n'est pas analysé.
}
public void setNote(int _note) {
note = _note;
}
public int getNote() {
return note;
}
abstract public String toString();
abstract public boolean equals(Object obj);
abstract public int hashCode();
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package tictactoecodingame;
/**
*
* @author franck.tempet
*/
public class CoupTicTacToe extends Coup {
private int colonne, ligne;
private Jeton jeton;
public CoupTicTacToe( int _colonne , int _ligne , Jeton _jeton ) {
super();
colonne = _colonne;
ligne = _ligne;
jeton = _jeton;
}
public int getColonne() {
return colonne;
}
public int getLigne() {
return ligne;
}
public Jeton getJeton() {
return jeton;
}
public String toString() {
return "(" + colonne + "," + ligne + ")" ;
}
@Override
public boolean equals(Object obj) {
if ( obj == null ) return false;
if (this.getClass() != obj.getClass()) return false;
CoupTicTacToe coup = (CoupTicTacToe)obj;
return colonne == coup.getColonne() && ligne==coup.ligne && jeton.toString().equals(coup.getJeton().toString());
}
@Override
public int hashCode() {
return jeton.toString().hashCode() + colonne * 10 + ligne;
}
}
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package tictactoecodingame;
import java.util.ArrayList;
/**
*
* @author franck.tempet
*/
public class GrilleTicTacToe3x3 extends Plateau {
Jeton[][] grille = new Jeton[3][3];
Jeton[][][] grilleSav = new Jeton[100][3][3]; // Pour sauvegardr la position. 100 au maximum
CoupTicTacToe dernierCoup;
Joueur vainqueur;
@Override
public void init() {
for (int c = 0; c < this.getNbColonnes(); c++)
for (int l = 0; l < this.getNbLignes(); l++)
grille[c][l] = null;
dernierCoup = null;
vainqueur = null;
}
@Override
public Piece getPiece(Case _case) {
return grille[_case.getColonne()][_case.getLigne()];
}
@Override
public void joueCoup(Coup _coup) {
CoupTicTacToe coup = (CoupTicTacToe) _coup;
grille[coup.getColonne()][coup.getLigne()] = coup.getJeton();
dernierCoup = coup;
}
@Override
public void annuleDernierCoup() {
grille[dernierCoup.getColonne()][dernierCoup.getLigne()] = null;
dernierCoup = null;
}
@Override
public int getNbColonnes() {
return 3;
}
@Override
public int getNbLignes() {
return 3;
}
@Override
public boolean partieTerminee() {
if (partieGagnee()) {
return true;
}
return isGrillePleine();
}
@Override
public boolean partieGagnee() {
int[][] dir = {{1, 0}, {1, 1}, {0, 1}, {1, -1}};
int[][] dirOps = {{-1, 0}, {-1, -1}, {0, -1}, {-1, 1}};
int x, y;
int nbJetonAligne;
if (dernierCoup == null) {
return false;
}
Joueur dernierJoueur = dernierCoup.getJeton()
.getJoueur();
/* Regarde si le dernier coup est gagnant */
for (int d = 0; d < 4; d++) {
nbJetonAligne = 0;
x = dernierCoup.getColonne();
y = dernierCoup.getLigne();
while (x < this.getNbColonnes() && x >= 0 && y < this.getNbLignes() && y >= 0 && grille[x][y] != null && grille[x][y].getJoueur() == dernierJoueur) {
nbJetonAligne++;
if (nbJetonAligne >= 3) {
vainqueur = dernierJoueur;
return true;
}
x += dir[d][0];
y += dir[d][1];
}
//regarde dans la direction oppose
x = dernierCoup.getColonne();
y = dernierCoup.getLigne();
nbJetonAligne--;
while (x < this.getNbColonnes() && x >= 0 && y < this.getNbLignes() && y >= 0 && grille[x][y] != null && grille[x][y].getJoueur() == dernierJoueur) {
nbJetonAligne++;
if (nbJetonAligne >= 3) {
vainqueur = dernierJoueur;
return true;
}
x += dirOps[d][0];
y += dirOps[d][1];
}
}
return false;
}
@Override
public boolean partieNulle() {
if (partieGagnee()) {
return false;
}
return isGrillePleine();
}
@Override
public ArrayList<Coup> getListeCoups(Joueur _joueur) {
ArrayList<Coup> listeCoups = new ArrayList<Coup>();
for (int c = 0; c < this.getNbColonnes(); c++) {
for (int l = 0; l < this.getNbLignes(); l++) {
if (grille[c][l] == null)
listeCoups.add(new CoupTicTacToe(c, l, new Jeton(_joueur)));
}
}
return listeCoups;
}
@Override
public boolean isValide(Coup _coup) {
CoupTicTacToe coup = (CoupTicTacToe) _coup;
return grille[coup.getColonne()][coup.getLigne()] == null;
}
@Override
public Coup stringToCoup(String _coup, Joueur _joueur) {
int colonne = Integer.valueOf(_coup.charAt(0)+"");
int ligne = Integer.valueOf(_coup.charAt(1)+"");
return new CoupTicTacToe(colonne, ligne , new Jeton(_joueur) );
}
@Override
public void sauvegardePosition(int _index) {
for (int c = 0; c < this.getNbColonnes(); c++)
for (int l = 0; l < this.getNbLignes(); l++)
grilleSav[_index][c][l] = grille[c][l];
}
@Override
public void restaurePosition(int _index) {
for (int c = 0; c < this.getNbColonnes(); c++)
for (int l = 0; l < this.getNbLignes(); l++)
grille[c][l] = grilleSav[_index][c][l];
vainqueur = null;
}
private boolean isGrillePleine() {
for (int c = 0; c < this.getNbColonnes(); c++) {
for (int l = 0; l < this.getNbLignes(); l++) {
if (grille[c][l] == null) {
return false;
}
}
}
return true;
}
@Override
public Joueur vainqueur() {
return vainqueur;
}
@Override
public Coup getDernierCoup() {
return dernierCoup;
}
}
This diff is collapsed.
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package tictactoecodingame;
/**
*
* @author franck.tempet
*/
public class Jeton extends Piece {
public Jeton( Joueur _joueur ) {
super( _joueur );
}
public String toString() {
if ((getJoueur().getIdJoueur()) == 1) {
return "X";
}
else {
return "O";
}
}
}
\ No newline at end of file
package tictactoecodingame;
/**
* @author Franck
*
*/
public abstract class Joueur {
private String nom;
private static int nbJoueur = 0;
private int idJoueur;
public Joueur( String _nom ) {
idJoueur = nbJoueur;
nbJoueur++;
this.nom = _nom;
}
public void setNom ( String _nom ) {
this.nom = _nom;
}
public String getNom() {
return nom;
}
public int getIdJoueur() {
return idJoueur;
}
abstract public Coup joue( Plateau p_plateau );
public String toString() {
return nom;
}
}
package tictactoecodingame;
/**
* @author Franck
*
*/
import java.io.InputStreamReader;
import java.io.IOException;
/**
* @author Franck
*/
public class JoueurHumain extends Joueur {
public JoueurHumain( String _joueur ) {
super( _joueur );
}
public Coup joue(Plateau _plateau) {
InputStreamReader clavier = new InputStreamReader(System.in);
char buffer[] = new char[10];
String monCoup = null;
// Demande au joueur de saisir son Coup
System.out.println("Votre coup : ");
try {
int nbCar = clavier.read(buffer, 0, 5);
monCoup = new String(buffer, 0, nbCar-1);
return _plateau.stringToCoup(monCoup, this);
} catch (IOException e) {
return null;
}
}
}
package tictactoecodingame;
/**
* @author Franck
*/
public class JoueurOrdi extends Joueur {
boolean ponder; // Si vrai l'ordinateur réfléchi pendant la reflexion de son adversaire
AlgoRecherche algoRecherche;
public JoueurOrdi(String _nom) {
super(_nom);
ponder = false;
}
public JoueurOrdi( String _nom , AlgoRecherche _algo , boolean _ponder ) {
super( _nom );
algoRecherche = _algo;
ponder = _ponder;
}
public JoueurOrdi( String _nom , AlgoRecherche _algo ) {
this( _nom , _algo , false );
}
public AlgoRecherche getAlgoRecherche() {
return algoRecherche;
}
public void setAlgoRecherche(AlgoRecherche _algoRecherche) {
algoRecherche = _algoRecherche;
}
public Coup joue(Plateau _plateau ) {
Coup coupOrdi;
coupOrdi = algoRecherche.meilleurCoup(_plateau , this , ponder);
return coupOrdi;
}
}
public class Ordi {
public static void main(String args[]) {
JoueurOrdi joueurOrdi1 = new JoueurOrdi("Ordi1");
JoueurOrdi joueurOrdi2 = new JoueurOrdi("Ordi2");
// Remplacer ici l'algorithme aléatoire par votre algorithme.
// Créer une nouvelle classe qui hérite de la class AlgoRecherche
AlgoRechercheAleatoire alea = new AlgoRechercheAleatoire( ); // L'ordinateur joue au hasard
joueurOrdi1.setAlgoRecherche(alea);
AlgoRechercheAleatoire alea2 = new AlgoRechercheAleatoire( ); // L'ordinateur joue au hasard
joueurOrdi2.setAlgoRecherche(alea2);
GrilleTicTacToe3x3 grille = new GrilleTicTacToe3x3();
Arbitre a = new Arbitre(grille, joueurOrdi1 , joueurOrdi2 );
a.startNewGame(true);
\ No newline at end of file
package tictactoecodingame;
import java.util.ArrayList;
/**
* @author Franck
*
* Classe générique pour les jeux de plateau à 2 joueurs ( une grille de puissance 4 , un échiquier , .. )
*/
public abstract class Plateau {
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 void joueCoup(Coup _coup); // Joue le coup _coup sur le plateau
abstract public void annuleDernierCoup(); // Annule le dernier coup joué
abstract public int getNbColonnes(); // Retourne le nombre de colonnes 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 partieGagnee(); // Vrai si le dernier joueur a gagné la partie
abstract public boolean partieNulle(); // Vrai si la partie est nulle
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 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 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 Coup getDernierCoup(); // Retourne le dernierCoup joue
public String toString() { // Donne une représentation du plateau sous forme d'une chaine de caractères
Piece piece;
String chainePlateau = new String();
for (int ligne = getNbLignes() - 1; ligne >= 0; ligne--) {
chainePlateau += ligne;
for (int colonne = 0; colonne < getNbColonnes(); colonne++) {
piece = getPiece(new Case(colonne, ligne));
if (piece == null) {
chainePlateau += "| ";
} else {
chainePlateau += "|" + piece + " ";
}
}
chainePlateau += "|\n ";
for (int colonne = 0; colonne < getNbColonnes(); colonne++) {
chainePlateau += "____";
}
chainePlateau += "\n";
}
for (int colonne = 0; colonne < getNbColonnes(); colonne++)
chainePlateau += " "+ colonne + " ";
return chainePlateau;
}
}
package tictactoecodingame;
/**
*
* @author franck
*/
/*--------------------------------------------------------*/
/* Version jeu en local */
/*--------------------------------------------------------*/
public class Player {
public static void main(String args[]) {
JoueurHumain humain = new JoueurHumain("Humain");
JoueurOrdi joueurOrdi = new JoueurOrdi("Ordi");
// Remplacer ici l'algorithme aléatoire par votre algorithme.
// Créer une nouvelle classe qui hérite de la class AlgoRecherche
AlgoRechercheAleatoire alea = new AlgoRechercheAleatoire( ); // L'ordinateur joue au hasard
joueurOrdi.setAlgoRecherche(alea);
GrilleTicTacToe3x3 grille = new GrilleTicTacToe3x3();
Arbitre a = new Arbitre(grille, joueurOrdi , humain );
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
//a.startTournament(1000 , false);
}
}
/*--------------------------------------------------------*/
/* Version Codin game */
/*--------------------------------------------------------*/
/*
import java.util.Scanner;
class Player {
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
CoupTicTacToe3x3 coup;
JoueurHumain adversaire = new JoueurHumain("Adversaire");
JoueurOrdi joueurOrdi = new JoueurOrdi("Ordi");
AlgoRechercheAleatoire alea = new AlgoRechercheAleatoire( ); // L'ordinateur joue au hasard
joueurOrdi.setAlgoRecherche(alea);
GrilleTicTacToe3x3 grille = new GrilleTicTacToe3x3();
grille.init();
while (true) {
int opponentRow = in.nextInt();
int opponentCol = in.nextInt();
int validActionCount = in.nextInt();
for (int i = 0; i < validActionCount; i++) {
int row = in.nextInt();
int col = in.nextInt();
}
if ( opponentCol != -1 ) {
coup = new CoupTicTacToe3x3(opponentCol, opponentRow, new Jeton(adversaire));
grille.joueCoup(coup);
}
coup = (CoupTicTacToe3x3) joueurOrdi.joue(grille);
grille.joueCoup(coup);
System.out.println(coup.getLigne() + " " + coup.getColonne() );
System.out.flush();
}
}
}
*/
\ No newline at end of file
package tictactoecodingame;
/**
* @author Franck
*/
public abstract class Piece {
private Joueur joueur;
public Piece( Joueur _joueur ) {
this.joueur = _joueur;
}
public void setJoueur(Joueur _joueur) {
joueur = _joueur;
}
public Joueur getJoueur() {
return joueur;
}
abstract public String toString();
}
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