#include<stdio.h>
#include<conio.h>
#include<math.h>
#include<string.h>
#include<graphics.h>
#include<stdlib.h>
#include<ctype.h>
int MAX=256;
int wMax=16;
int h=0;
int plydepth;
int k1=17,k2=19;
int Mmax(int x[])
{
int i;
int tg;
tg=x[0];
for (i=1;i<=255;i++)
if (x[i]>tg) tg=x[i];
return tg;
}
int level(int x[])
{
int i;
int tg;
tg=0;
for (i=1;i<MAX;i++)
if (x[i]>x[tg]) tg=i;
return tg;
}
int F(int i)
{
float t=2.166*i*i*i-13*i*i+24.83*i+1;
}
int test(int x[],int i)
{
int Bool;
if ((((x[i-1]==0)&&(i%wMax>0))||(i%wMax==0))&&
(((x[i+1]==0)&&(i%wMax<wMax-1))||(i%wMax==wMax-1))&&
(((x[i+16]==0)&&(i/wMax<wMax-1))||(i/wMax==wMax-1))&&
(((x[i-16]==0)&&(i/wMax>0))||(i/wMax==0))&&
(((x[i+15]==0)&&(i/wMax<wMax-1) &&(i%wMax>0))||(i/wMax==wMax-1)||(i%wMax==0)) &&
(((x[i+17]==0)&&(i/wMax<wMax-1)&&(i%wMax<wMax-1)) ||(i/wMax==wMax-1)||(i%wMax==wMax-1))&&
(((x[i-15]==0)&&(i/wMax>0)&&(i%wMax<wMax-1)) ||(i/wMax==0)||(i%wMax==wMax-1))&&
(((x[i-17]==0)&&(i/wMax>0)&&(i%wMax>0)) ||(i/wMax==0)||(i%wMax==0)) )
Bool=1;
else Bool=0;
return Bool;
}
int TestComputerwin(int a[],int i)
{
int j,k,tg=0;
int t;
for (j=0;j<=7;j++)
{
if (j<=3) t=F(j);
if (j>3) t=-F(j-4);
for (k=0;k<=4;k++)
if ((a[i-k*t]+a[i-k*t+t]+a[i-k*t+2*t]+a[i-k*t+3*t]+a[i-k*t+4*t])==5*k2)
{
tg=1;
break;
}
if (tg==1) break;
}
return tg;
}
int TestPersonwin(int a[],int i)
{
int j,k;
int t,tg=0;
for (j=0;j<=7;j++)
{
if (j<=3) t=F(j);
if (j>3) t=-F(j-4);
for (k=0;k<=4;k++)
if ((a[i-k*t]+a[i-k*t+t]+a[i-k*t+2*t]+a[i-k*t+3*t]+a[i-k*t+4*t])==5*k1)
{
tg=1;
break;
}
if (tg==1) break;
}
return tg;
}
int valueplay(int a[],int n)
{
int k;
int t,tg;
int d=0;
if (a[n]==0)
for(k=0;k<8;k++)
{
int i,j;
if (k<=3) t=F(k);
if (k>3) t=-F(k-4);
if ((a[n-t]==k1)&&(a[n+t]==k1)&&(a[n+2*t]==k1))
{
if((a[n-2*t]==0)&&(a[n+3*t]==0)) d=d+27;
if ((a[n-2*t]==k2)&&(a[n+3*t]==k2)) d=d-14;
d=d+9;
}
if (a[n+t]==k1)
{
if (a[n+2*t]==k2) d=d+1;
if (a[n+2*t]==0) d=d+6;
if (a[n+2*t]==k1)
{
if (a[n+3*t]==k2) d=d+4;
if (a[n+3*t]==0) d=d+12;
if (a[n+3*t]==k1)
{
if (a[n+4*t]==k2) d=d+15;
if (a[n+4*t]==0) d=d+50;
if (a[n+4*t]==k1) d=d+500;
}
}
}
if (a[n+t]==k2)
{
if (a[n+2*t]==k1) d=d+2;
if (a[n+2*t]==0) d=d+9;
if (a[n+2*t]==k2)
{
if (a[n+3*t]==k1) d=d+6;
if (a[n+3*t]==0) d=d+18;
if (a[n+3*t]==k2)
{
if (a[n+4*t]==k1) d=d+22;
if (a[n+4*t]==0) d=d+75;
if (a[n+4*t]==k2) d=d+750;
}
}
}
}
return d;
}
int valueplayperson(int a[],int n)
{
int k;
int t,tg;
int d=0;
if (a[n]==0)
for(k=0;k<8;k++)
{
int i,j;
if (k<=3) t=F(k);
if (k>3) t=-F(k-4);
if ((a[n-t]==k1)&&(a[n+t]==k1)&&(a[n+2*t]==k1))
{
if((a[n-2*t]==0)&&(a[n+3*t]==0)) d=d+27;
if ((a[n-2*t]==k2)&&(a[n+3*t]==k2)) d=d-14;
d=d+9;
}
if (a[n+t]==k2)
{
if (a[n+2*t]==k1) d=d+1;
if (a[n+2*t]==0) d=d+6;
if (a[n+2*t]==k2)
{
if (a[n+3*t]==k1) d=d+4;
if (a[n+3*t]==0) d=d+12;
if (a[n+3*t]==k2)
{
if (a[n+4*t]==k1) d=d+15;
if (a[n+4*t]==0) d=d+50;
if (a[n+4*t]==k2) d=d+500;
}
}
}
if (a[n+t]==k1)
{
if (a[n+2*t]==k2) d=d+2;
if (a[n+2*t]==0) d=d+9;
if (a[n+2*t]==k1)
{
if (a[n+3*t]==k2) d=d+6;
if (a[n+3*t]==0) d=d+18;
if (a[n+3*t]==k1)
{
if (a[n+4*t]==k2) d=d+22;
if (a[n+4*t]==0) d=d+75;
if (a[n+4*t]==k1) d=d+750;
}
}
}
}
return d;
}
void Personwin()
{
settextstyle(3,0,5);
outtextxy(210,300," YOU ARE ");
outtextxy(210,340,"VICTORIOUS!");
getch();
exit(1);
}
int bestplay(int a[])
{
int m[256];
int dem=0,max=0;
int b[256];
int i;
for (i=0;i<=255;i++) b[i]=a[i];
for (i=0;i<=MAX-1;i++)
{
if (b[i]!=0) m[i]=0;
if (b[i]==0)
{
b[i]=k2;
if(TestComputerwin(b,i)==1)
{
settextstyle(3,0,4);
bar(5+30*(i%16),5+30*(i/16),25+30*(i%16),25+30*(i/16));
outtextxy(483,400,("YOU LOSE!"));
getch();
exit(1);
}
b[i]=0;
if (test(b,i)==1) m[i]=0;
else
{
int c[256];
int j,k,t,d1;
m[i]=valueplay(b,i);
b[i]=k2;
for (j=0;j<MAX;j++)
{
if (b[j]!=0) c[j]=0;
if (b[j]==0)
{
if (test(b,j)==1) c[j]=0;
else
{
int d2,n[256];
b[j]=k1;
if (TestPersonwin(b,j)==1)
{
m[i]=-900;
b[j]=0;
break;
}
b[j]=0;
c[j]=valueplayperson(b,j);
b[j]=k1;
for (k=0;k<=255;k++)
{
if (b[k]!=0) n[k]=0;
if (b[k]==0)
{
if (test(b,k)==1) n[k]=0;
else
{
int d3;
int d[256];
n[k]=valueplay(b,k);
b[k]=k2;
for (d3=0;d3++;d3<MAX)
{
if (b[d3]!=0) d[d3]=0;
if (b[d3]==0)
{
if (test(b,d3)==1) d[d3]=0;
else
{
b[d3]=k1;
if (TestPersonwin(b,d3)==1)
{
n[k]=-900;
b[d3]=0;
break;
}
b[d3]=0;
d[d3]=valueplayperson(b,d3);
}
}
}
n[k]=n[k]-Mmax(d);
b[k]=0;
}
}
}
c[j]=Mmax(n)-c[j];
b[j]=0;
}
}
}
m[i]=m[i]+Mmax(c);
b[i]=0;
}
}
}
max=level(m);
if (m[max]==0) Personwin();
return max;
}
void setup();
void draw(int x,int y,int m);
void paint(int x[]);
void personplay(int x[],int i,int j);
void computerplay(int x[]);
main()
{
int a[256];
int i,j;
int x=6,y=7;
char c;
for (i=0;i<=MAX-1;i++) a[i]=0;
do
{
setup();paint(a);
setcolor(RED);
settextstyle(1,0,1);
outtextxy(485,50,"Welcome!");
outtextxy(485,70,"Design By:");
outtextxy(485,90,"TRUNG_DT11K48");
outtextxy(485,110,"Turnright :F");
outtextxy(485,130,"Turnleft :S");
outtextxy(485,150,"Move up :E");
outtextxy(485,170,"Move down :D");
outtextxy(485,190,"Press G if You ");
outtextxy(485,210," want go late");
c=getch();
if (c=='g')
{
a[136]=k2;
bar(245,245,265,265);
}
c='f';
do
{
if ((c=='f')&(x<wMax-1))
{
x=x+1;
draw(x-1,y,BLUE);
draw(x,y,RED);
}
if ((c=='s')&&(x>0))
{
x=x-1;
draw(x+1,y,BLUE);
draw(x,y,RED);
}
if ((c=='e')&&(y>0))
{
y=y-1;
draw(x,y+1,BLUE);
draw(x,y,RED);
}
if ((c=='d')&&(y<wMax-1))
{
y=y+1;
draw(x,y-1,BLUE);
draw(x,y,RED);
}
if ((c=='t')&&(a[y*16+x]==0))
{
personplay(a,x,y);
computerplay(a);
}
if (c=='q') exit(1);
c=getch();
}
while (1);
}while (1);
getch();
}
void setup()
{
int gdriver=DETECT,gmode,errorcode;
initgraph(&gdriver,&gmode,"D:\\TC\\BGI");
errorcode=graphresult();
if (errorcode!=grOk)
{
printf("Graphics error: %s\n",grapherrormsg
(errorcode
)); printf("Press any key to halt"); getch();
exit(1);
}
}
void draw(int x,int y,int m)
{
setcolor(m);
rectangle(x*30,y*30,30+x*30,30+y*30);
}
void personplay(int x[],int i,int j)
{
x[16*j+i]=k1;
draw(i,j,RED);
setcolor(RED);
fillellipse(15+30*i,15+30*j,10,10);
if (TestPersonwin(x,16*j+i)==1) Personwin();
}
void computerplay(int x[])
{
int m,i,j;
m=bestplay(x);
x[m]=k2;
j=m/16;i=m%16;
setcolor(RED);
bar(5+30*i,5+30*j,25+30*i,25+30*j);
}
void paint(int a[])
{
int i,j;
setbkcolor(GREEN);
setcolor(getbkcolor());
settextstyle(3,0,5);
outtextxy(210,300," YOU ARE ");
outtextxy(210,330,"VICTORIOUS!");
settextstyle(3,0,4);
outtextxy(482,400,"YOU LOSE!");
for (i=0;i<=15;i++)
for (j=0;j<=15;j++)
{
setcolor(BLUE);
rectangle(30*i,30*j,30+30*i,30+30*j);
}
}