1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188
|
import java.io.*;
//program version simpliste sans traitement d'exception etc ecrit pour verifier comment marche algorithme minimax
//mais marche pas :(
class morpion_v {
static char[][] planche= {{'.', '.', '.'},{'.', '.', '.'},{'.', '.', '.'}}; //'.' est une case inocupee
final static char croix= 'x';
final static char rond= 'o';
static char je_joue=rond; //ordi
static char autre_joue=croix;
static int pions_deja_joue=0;
/*fonction qui verifie si jeu est fini*/
static char jeu_termine(char[][] planche){
if ((planche[0][0] == 'o' && planche[0][1] == 'o' && planche[0][2] == 'o')
|| (planche[1][0] == 'o' && planche[1][1] == 'o' && planche[1][2] == 'o')
|| (planche[2][0] == 'o' && planche[2][1] == 'o' && planche[2][2] == 'o')
|| (planche[0][0] == 'o' && planche[1][0] == 'o' && planche[2][0] == 'o')
|| (planche[0][1] == 'o' && planche[1][1] == 'o' && planche[2][1] == 'o')
|| (planche[0][2] == 'o' && planche[1][2] == 'o' && planche[2][2] == 'o')
|| (planche[0][0] == 'o' && planche[1][1] == 'o' && planche[2][2] == 'o')
|| (planche[0][2] == 'o' && planche[1][1] == 'o' && planche[2][0] == 'o')) {
return 'r';
} else if ((planche[0][0] == 'x' && planche[0][1] == 'x' && planche[0][2] == 'x')
|| (planche[1][0] == 'x' && planche[1][1] == 'x' && planche[1][2] == 'x')
|| (planche[2][0] == 'x' && planche[2][1] == 'x' && planche[2][2] == 'x')
|| (planche[0][0] == 'x' && planche[1][0] == 'x' && planche[2][0] == 'x')
|| (planche[0][1] == 'x' && planche[1][1] == 'x' && planche[2][1] == 'x')
|| (planche[0][2] == 'x' && planche[1][2] == 'x' && planche[2][2] == 'x')
|| (planche[0][0] == 'x' && planche[1][1] == 'x' && planche[2][2] == 'x')
|| (planche[0][2] == 'x' && planche[1][1] == 'x' && planche[2][0] == 'x')) {
return 'c';
} else {
if (pions_deja_joue==9) return 'e'; //jeu fini, personne a gagne - egalite
else return 'n'; //no, le jeu n'est pas fini!
}
}
/*fin fonct qui verifie si jeu est fini*/
/*fonction d'evaluation de gain*/
static int gain(char[][] planche) {
//si jeu est termine
if (jeu_termine(planche)=='c') {
if (je_joue==croix) return 1000-pions_deja_joue;
else return -1000+pions_deja_joue;
} else if (jeu_termine(planche)=='r'){
if (je_joue==croix) return -1000+pions_deja_joue;
else return (1000-pions_deja_joue);
} else {
if (jeu_termine(planche)=='e') return 0;
else return 5; //pas besoin mais ajoute car sinon compilo rale
}
}
/*fin de fonction d'evaluation de gain*/
static void afficher(char[][] t) { //affiche planche
for (int k=0; k<3; k++) {
for (int l=0; l<3; l++) {
System.out.print(t[k][l]+ " ");
}
System.out.println();
}
System.out.println();
}
static void jouer_coup(int x, int y, char quoi){
pions_deja_joue++;
planche[x][y]=quoi;
}
static void dejouer_coup(int x, int y){
pions_deja_joue--;
planche[x][y]='.';
}
static int compteur=0;
static int quoi_jouer_x=0, quoi_jouer_y=0, x=0, y=0;
static void minimax(char[][] planche) {
compteur++;
int max_val=-1000;
int val_temp=0;
for (int k=0; k<3; k++){
for (int l=0; l<3; l++) {
if (planche[k][l]=='.') { //pour chaque case non occupe
jouer_coup(k, l, je_joue);
val_temp=max(planche);
System.out.println("x, y?: "+k+" "+l+" gain: "+val_temp);
//System.out.println("jeu termine?: "+jeu_termine(planche));
//System.out.println("pions?: "+pions_deja_joue);
//System.out.println("Gain actuel: "+val_temp);
if (val_temp>max_val) {
max_val=val_temp;
quoi_jouer_x=k;
quoi_jouer_y=l;
}
dejouer_coup(k,l);
}
}
}
jouer_coup(quoi_jouer_x, quoi_jouer_y, je_joue);
afficher(planche);
System.out.println("pions?: "+pions_deja_joue);
System.out.println(" ");
}
static int max(char[][] planche) {
compteur++;
if (jeu_termine(planche)!='n') {
return gain(planche);
}
int max_val=-1000, gain_temp;
for (int i=0; i<3; i++){
for (int j=0; j<3; j++) {
if (planche[i][j]=='.') { //pour chaque case non occupe
jouer_coup(i, j, autre_joue);
gain_temp=min(planche);
if ((gain_temp>max_val)) {
max_val=gain_temp;
}
dejouer_coup(i, j);
}
}
}
return max_val;
}
static int min(char[][] planche) {
compteur++;
if (jeu_termine(planche)!='n') {
return gain(planche);
}
int mon_gain=1000, gain_temp=0;
for (int i=0; i<3; i++){
for (int j=0; j<3; j++) {
if (planche[i][j]=='.') { //pour chaque case non occupe
jouer_coup(i, j, je_joue);
gain_temp=max(planche);
if ((gain_temp<mon_gain)) {
mon_gain=gain_temp;
}
dejouer_coup(i, j);
}
}
}
return mon_gain;
}
/*fin intel artif minimax*/
public static void main(String[] arg) { //boucle principale
afficher(planche);
char joue=croix;
while (jeu_termine(planche)=='n'){
compteur=0;
int ligne=0,colone=0;
if (joue==autre_joue) {
try{
BufferedReader clavier=new BufferedReader(new InputStreamReader(System.in));
System.out.println("veuillez entrer numero de ligne:");
ligne=Integer.parseInt(clavier.readLine()); // lecture des entier
System.out.println("veuillez entrer numero de colone:");
colone=Integer.parseInt(clavier.readLine()); // lecture des entier
}catch (Exception e) {}
jouer_coup(ligne,colone,autre_joue);
afficher(planche);
System.out.println("pions?: "+pions_deja_joue);
System.out.println(" ");
joue=je_joue;
}else{
minimax(planche);
System.out.println("compteur "+compteur);
joue=autre_joue;
}
}
}
} |
Partager