/* 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");
}