/* serveur Puissance 6 - Royale */
#include <stdio.h>
#include <stdlib.h>
#include <sys/times.h>
#include <signal.h>
#define COTE 20
#define PUISSANCE 6
#define TIMEOUT 1
typedef int Tgrille[COTE][COTE];
#define GO \
if (grille[i][j]==cur) \
{ if ((cur!=0)&&(++nb==PUISSANCE)) return(cur); } \
else { cur=grille[i][j]; nb=1; }
int gagnant(Tgrille grille)
{
int i,j,k,cur,nb;
for (j=0;j<COTE;j++)
{
cur=-1;
for (i=0;i<COTE;i++) GO
}
for (i=0;i<COTE;i++)
{
cur=-1;
for (j=0;j<COTE;j++) GO
}
for (k=PUISSANCE-COTE;k<COTE-PUISSANCE+1;k++)
{
cur=-1;
for (i=0;i<COTE;i++)
{
j=k+i;
if ((j>=0)&&(j<COTE)) GO
}
}
for (k=PUISSANCE-1;k<COTE*2-PUISSANCE;k++)
{
cur=-1;
for (i=0;i<COTE;i++)
{
j=k-i;
if ((j>=0)&&(j<COTE)) GO
}
}
return(0);
}
int autre(int joueur)
{
if (joueur==1) return(2); else return(1);
}
int main(int argc, char **argv)
{
FILE *input[3];
FILE *output[3];
Tgrille grille;
int tour,joueur=1,i,j,x,y,temps[3]={0,0,0};
struct tms buf;
void sig_handler(int s)
{
/* s est le numéro du signal ayant déclenché l'appel à la fonction */
/* on ré-arme de le handler */
/* signal(s, sig_handler);*/
/* opérations de traitement du signal */
temps[joueur]+=times(&buf);
printf("%d (timeout) - %d %d\n",autre(joueur),temps[1],temps[2]);
exit(0);
}
signal(SIGALRM,sig_handler);
for (i=0;i<COTE;i++) for (j=0;j<COTE;j++) grille[i][j]=0;
input[1]=fopen("1.input","wt");
output[1]=fopen("1.output","rt");
fprintf(input[1],"1\n"); fflush(input[1]);
input[2]=fopen("2.input","wt");
output[2]=fopen("2.output","rt");
fprintf(input[2],"2\n"); fflush(input[2]);
for (tour=0;tour<COTE*COTE;tour++)
{
temps[joueur]-=times(&buf);
alarm(TIMEOUT);
fscanf(output[joueur],"%d %d",&x,&y);
alarm(0);
temps[joueur]+=times(&buf);
fprintf(stderr,"%d %d\n",x,y);
if ((x>=1)&&(x<=COTE)&&(y>=1)&&(y<=COTE)&&(grille[x-1][y-1]==0)) grille[x-1][y-1]=joueur;
/* x-1 et y-1 car on numérote de 1 à 20 */
else
{
printf("%d (erreur de l'adversaire) - %d %d\n",autre(joueur),temps[1],temps[2]);
return(0);
}
if (gagnant(grille))
{
printf("%d (victoire) - %d %d\n",joueur,temps[1],temps[2]);
return(0);
}
fprintf(input[autre(joueur)],"%d\n%d\n",x,y); fflush(input[autre(joueur)]);
joueur=autre(joueur);
}
printf("0 (match nul) - %d %d\n",temps[1],temps[2]);
return(0);
}