aboutsummaryrefslogtreecommitdiff
path: root/morpion_rec
diff options
context:
space:
mode:
Diffstat (limited to 'morpion_rec')
-rw-r--r--morpion_rec/NiAh/main.c243
-rw-r--r--morpion_rec/NiAh/main.h13
2 files changed, 256 insertions, 0 deletions
diff --git a/morpion_rec/NiAh/main.c b/morpion_rec/NiAh/main.c
new file mode 100644
index 0000000..74248c3
--- /dev/null
+++ b/morpion_rec/NiAh/main.c
@@ -0,0 +1,243 @@
+/* IA pour morpion récursif - Alexis
+ * main.c
+ * Contient les fonctions principales */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "main.h"
+
+#define INPUT_LENGTH 50
+
+int main()
+{
+ int i,j,k,l;
+
+ char input[INPUT_LENGTH];
+ float timeout;
+
+ Dots grid[9][9];
+ Boxes subgrid, move, firstsubgrid;
+ int firstMove=1;
+
+ for(i=0;i<9;i++)
+ for(j=0;j<9;j++)
+ grid[i][j] = FREE;
+
+ subgrid = Z;
+ firstsubgrid=V;
+
+ // Dis bonjour à Alex ...
+ fgets(input, sizeof(input), stdin);
+ for(i=0;i<INPUT_LENGTH;i++){if(input[i]=='\n'){input[i]='\0';}}
+ if(strcmp(input, "Hello morpion_rec") == 0)
+ {
+ printf("Hello morpion_rec\n");
+ }
+ else
+ {
+ printf("Who are you, crazy bastard?\n");
+ return EXIT_FAILURE;
+ }
+
+ printGrid(grid);
+
+ // Est-ce à moi de jouer ?
+ while(1)
+ {
+ while(1)
+ {
+ fgets(input, sizeof(input), stdin);
+
+ // Attendre pour jouer
+ if(strstr(input,"Your turn")==input)
+ {
+ sscanf(input+10,"%f",&timeout);
+ break;
+ }
+
+ //Attendre le coup de l'adversaire
+ if(strstr(input,"Play")==input)
+ {
+ sscanf(input+5,"%d %d %d %d",&i,&j,&k,&l);
+ subgrid=(i-1)+(j-1)*3;
+ move = (k-1)+(l-1)*3;
+ fprintf(stderr,"%d %d\n", subgrid, move);
+ // L'adversaire joue les ronds
+ if(firstMove)
+ {
+ firstsubgrid=subgrid;
+ firstMove=0;
+ }
+ play(grid, subgrid, CIRCLE, move);
+ printGrid(grid);
+ subgrid=move;
+ }
+
+ // Attendre le résultat de la partie
+ if(strstr(input,"You win")==input)
+ {
+ printf("Yeah!");
+ return EXIT_SUCCESS;
+ }
+ if(strstr(input,"You lose")==input)
+ {
+ printf("I am so sad...");
+ return EXIT_SUCCESS;
+ }
+ if(strstr(input,"Tie")==input)
+ {
+ printf("It is a good result anyways.");
+ return EXIT_SUCCESS;
+ }
+ if(strstr(input,"Cheater")==input)
+ {
+ printf("You are so nasty :(");
+ return EXIT_FAILURE;
+ }
+
+ }
+
+ // On joue toujours les croix
+ if(firstMove)
+ {
+ firstsubgrid=V;
+ subgrid=firstsubgrid;
+ firstMove=0;
+ }
+ if(chooseMoveAndPlay(grid, subgrid, CROSS, &move, firstsubgrid) != 0){return EXIT_FAILURE;}
+ printf("Play %d %d %d %d\n", subgrid%3+1, subgrid/3+1, move%3+1, move/3+1);
+
+ subgrid=move;
+ printGrid(grid);
+ }
+
+
+ return EXIT_SUCCESS;
+}
+
+int play(Dots grid[9][9], Boxes subgrid, Dots player, Boxes move)
+{
+ if(subgrid == Z || move == Z || player == FREE || grid[subgrid][move] != FREE)
+ return 1;
+ grid[subgrid][move] = player;
+}
+
+int chooseMoveAndPlay(Dots grid[9][9], Boxes subgrid, Dots player, Boxes *move, Boxes firstSubgrid)
+{
+ int i,j;
+ Boxes sg = (subgrid!=Z) ? subgrid : V; // Inutile maintenant
+ for(i=0;i<9;i++)
+ {
+ if(grid[sg][i] == FREE)
+ {
+ *move = i;
+ grid[sg][i] = player;
+ return 0;
+ }
+ }
+ if(firstSubgrid=subgrid)
+ {
+ for(i=0;i<9;i++)
+ {
+ for(j=0;j<9;j++)
+ {
+ if(grid[j][i] == FREE)
+ {
+ *move = i;
+ grid[j][i] = player;
+ return 0;
+ }
+ }
+ }
+ }
+ return 1;
+}
+
+void checkSolutions(Boxes a, Solutions sols)
+{
+ switch(a)
+ {
+ case I:
+ sols[0][0] = II; sols[0][1] = III;
+ sols[1][0] = IV; sols[1][1] = VII;
+ sols[2][0] = Z; sols[2][1] = Z;
+ sols[3][0] = Z; sols[3][1] = Z;
+ break;
+ case II:
+ sols[0][0] = I; sols[0][1] = III;
+ sols[1][0] = V; sols[1][1] = VIII;
+ sols[2][0] = Z; sols[2][1] = Z;
+ sols[3][0] = Z; sols[3][1] = Z;
+ break;
+ case III:
+ sols[0][0] = I; sols[0][1] = II;
+ sols[1][0] = VI; sols[1][1] = IX;
+ sols[2][0] = Z; sols[2][1] = Z;
+ sols[3][0] = Z; sols[3][1] = Z;
+ break;
+ case IV:
+ sols[0][0] = I; sols[0][1] = VII;
+ sols[1][0] = V; sols[1][1] = VI;
+ sols[2][0] = Z; sols[2][1] = Z;
+ sols[3][0] = Z; sols[3][1] = Z;
+ break;
+ case V:
+ sols[0][0] = II; sols[0][1] = VIII;
+ sols[1][0] = I; sols[1][1] = IX;
+ sols[2][0] = IV; sols[2][1] = VI;
+ sols[3][0] = VII; sols[3][1] = III;
+ break;
+ case VI:
+ sols[0][0] = IV; sols[0][1] = V;
+ sols[1][0] = III; sols[1][1] = IX;
+ sols[2][0] = Z; sols[2][1] = Z;
+ sols[3][0] = Z; sols[3][1] = Z;
+ break;
+ case VII:
+ sols[0][0] = I; sols[0][1] = IV;
+ sols[1][0] = VII; sols[1][1] = IX;
+ sols[2][0] = Z; sols[2][1] = Z;
+ sols[3][0] = Z; sols[3][1] = Z;
+ break;
+ case VIII:
+ sols[0][0] = II; sols[0][1] = V;
+ sols[1][0] = VI; sols[1][1] = IX;
+ sols[2][0] = Z; sols[2][1] = Z;
+ sols[3][0] = Z; sols[3][1] = Z;
+ break;
+ case IX:
+ sols[0][0] = III; sols[0][1] = VI;
+ sols[1][0] = VII; sols[2][1] = IX;
+ sols[2][0] = Z; sols[2][1] = Z;
+ sols[3][0] = Z; sols[3][1] = Z;
+ break;
+ default:
+ sols[0][0] = Z; sols[0][1] = Z;
+ sols[1][0] = Z; sols[1][1] = Z;
+ sols[2][0] = Z; sols[2][1] = Z;
+ sols[3][0] = Z; sols[3][1] = Z;
+ break;
+ }
+}
+
+// Les affichages se font dans stderr
+void printGrid(Dots grid[9][9])
+{
+ int x,y, i,j;
+
+ fprintf(stderr,"\n*********\n");
+ for(x=0;x<9;x++)
+ {
+ for(y=0;y<9;y++)
+ {
+ i=(y/3)*3+(x/3);
+ j=(y-(y/3)*3)*3+(x-(x/3)*3);
+ fprintf(stderr,"%d", grid[i][j]);
+ }
+ fprintf(stderr,"\n");
+ }
+ fprintf(stderr,"\n*********\n");
+}
+
+
diff --git a/morpion_rec/NiAh/main.h b/morpion_rec/NiAh/main.h
new file mode 100644
index 0000000..5cf06d2
--- /dev/null
+++ b/morpion_rec/NiAh/main.h
@@ -0,0 +1,13 @@
+/* IA pour morpion récursif - Alexis
+ * main.h
+ * Définition des énumérations, typedef et autres */
+
+typedef enum {FREE, CROSS, CIRCLE} Dots;
+typedef enum {I=0, II=1, III=2, IV = 3, V=4, VI=5, VII=6, VIII=7, IX=8, Z=-1} Boxes;
+typedef Boxes Solutions[4][2];
+
+int play(Dots grid[9][9], Boxes subgrid, Dots player, Boxes move);
+int chooseMoveAndPlay(Dots grid[9][9], Boxes subgrid, Dots player, Boxes *move, Boxes firstSubgrid);
+void checkSolutions(Boxes a, Solutions sols);
+void printGrid(Dots grid[9][9]);
+