aboutsummaryrefslogblamecommitdiff
path: root/morpion_rec/NiAh/main.c
blob: 74248c31cad40782e795ef4e357a0d287e087265 (plain) (tree)


















































































































































































































































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