/* By ZhouDahua. 1999,3,30 */
/*TC2.0*/
#include <stdio.h>
#include <graphics.h>
#include <process.h>
#include <stdlib.h>
#include <dos.h>
#include <ctype.h>
#define DOWN 80
#define UP 72
#define F1 59
#define LEFT 75
#define RIGHT 77
#define Q 16
#define E 18
#define X 45
#define R 19
#define ESC 1
#define ENTER 28
int judge(int);
int getkey();
void decide();
void count(int,int,int);
void sd();
int tx,ty;
int a[16][16]={0}, b[16][16]={0}; /* 全局变量 */
void main()
{
int x,y,m,n,h=0,s=0,done; int hx=150,sy=80;
int ch;
void *buf_curse;
unsigned size;
int graphdriver=DETECT;
int graphmode;
registerbgidriver(EGAVGA_driver);
initgraph(&graphdriver,&graphmode," ");
begin:sd();
for(x=0;x<16;x++)
for(y=0;y<16;y++) a[x][y]=0;
setfillstyle(1,13);
bar(0,0,12,12);
size=imagesize(0,0,12,12);
buf_curse=malloc(size);
getimage(0,0,12,12,buf_curse); /* save imag 保存图象 */
putimage(0,0,buf_curse,XOR_PUT);
tx=1000,ty=1000;
cleardevice();
setcolor(WHITE);
h=0;s=0;hx=154;sy=84;
setfillstyle(1,CYAN);
bar(0,0,639,510);
setfillstyle(1,BLACK);
bar(157,87,483,413);
/* setfillstyle(1,DARKGRAY);
bar(157,87,483,413);
*/ setfillstyle(1,4);/*BROWN); */
bar(147,77,473,403);
setfillstyle(1,LIGHTGRAY);
bar(151,81,469,399);
for(x=160;x<=460;x+=20)
line(x,90,x,390);
for(y=90;y<=390;y+=20)
line(160,y,460,y); /* SETUP FACE */
putimage(154,84,buf_curse,XOR_PUT); /* xor option*/
setfillstyle(1,13);
bar(150,420,470,460); /* */
setfillstyle(1,BLACK);
bar(153,460,475,467);
bar(470,424,475,467);
setfillstyle(1,13);
setcolor(YELLOW);
outtextxy(160,430,"WZQ program By ZhouDahua 1999-5-1.");
outtextxy(160,448,"V1.3A");
setcolor(10);
outtextxy(500,100,"R to restar ");
outtextxy(500,120,"Esc to quit");
outtextxy(500,140,"Q or Enter to put");
outtextxy(500,160,"Enter to put down");
/* outtextxy(50,110,"Please:"); */
wait: do{ done=1;
ch=getkey();
switch(ch)
{ case 76 :
case DOWN:
{putimage(hx,sy,buf_curse,XOR_PUT);
if(s==15) s=0;
else s+=1;
sy=84+s*20;
putimage(hx,sy,buf_curse,XOR_PUT);
break;
}
case UP:
{putimage(hx,sy,buf_curse,XOR_PUT);
if(s==0) s=15;
else s-=1;
sy=84+s*20;
putimage(hx,sy,buf_curse,XOR_PUT);
break;
}
case LEFT:
{putimage(hx,sy,buf_curse,XOR_PUT);
if(h==0) h=15;
else h-=1;
hx=154+h*20;
putimage(hx,sy,buf_curse,XOR_PUT);
break;
}
case RIGHT:
{putimage(hx,sy,buf_curse,XOR_PUT);
if(h==15) h=0;
else h+=1;
hx=154+h*20;
putimage(hx,sy,buf_curse,XOR_PUT);
break;}
case R:
{putimage(hx,sy,buf_curse,XOR_PUT);
setcolor(WHITE); goto begin; }
case X:
case E:
case ESC: goto end;
case Q:
case ENTER: done=0;break;
}
} while(done);
if(a[h][s]!=0) { bar(150,420,470,460);setcolor(10);
outtextxy(160,430,"You do not put it here!");sd(); goto wait;}
a[h][s]=1;
for(x=6;x>0;x--)
{ setcolor(13);
circle(160+h*20,90+s*20,x);}
if(judge(1)) { bar(150,420,470,460);setcolor(YELLOW);
outtextxy(160,430,"Wokao You Win ! ");
outtextxy(160,445,"Press R to again"); sd();
aa: if(getch()!='r') {sd();goto aa;}
putimage(hx,sy,buf_curse,XOR_PUT); setcolor(WHITE);
goto begin; }
decide(a);
if(judge(2)) { bar(150,420,470,460);setcolor(YELLOW);
outtextxy(160,430,"Sorry, You Fail ");
outtextxy(160,445,"Press R to again "); sd();
bb: if(getch()!='r') {sd();goto bb;}
putimage(hx,sy,buf_curse,XOR_PUT); setcolor(WHITE);
goto begin; }
goto wait;
end:
closegraph(); free(buf_curse);
for(h=0;h<1;h++) {sd();delay(800);}
}
/***********************************/
void decide(arr)
int arr[16][16];
{
int i,j,x,y,l,l1,l2,l3,l4;
int max_1,max_2,n=1,m=2;
int x_1=0,y_1=0; int x_2=0,y_2=0;
for(i=6;i>0;i--)
{setcolor(15);
circle(tx,ty,i);}
see: for(i=0;i<16;i++)
for(j=0;j<16;j++) b[i][j]=0;
for(i=0;i<16;i++)
for(j=0;j<16;j++)
if(arr[i][j]==0)
{ for(x=i,y=j,l1=0;arr[x][y+1]==n&&y<15;y++)l1+=2;
if(arr[x][y+1]==m) l1--;
for(x=i,y=j; arr[x][y-1]==n&&y>0;y--) l1+=2;
if(arr[x][y-1]==m) l1--;
count(l1,i,j);
for(x=i,y=j,l2=0;arr[x+1][y-1]==n&&x<15&&y>0;x++,y--) l2+=2;
if(arr[x+1][y-1]==m)l2--;
for(x=i,y=j; arr[x-1][y+1]==n&&x>0&&y<15;x--,y++) l2+=2;
if(arr[x-1][y+1]==m)l2--;
count(l2,i,j);
for(x=i,y=j,l3=0;arr[x+1][y+1]==n&&x<15&&y<15;x++,y++) l3+=2;
if(arr[x+1][y+1]==m)l3--;
for(x=i,y=j; arr[x-1][y-1]==n&&x>0&&y>0;x--,y--) l3+=2;
if(arr[x-1][y-1]==m)l3--;
count(l3,i,j);
for(x=i,y=j,l4=0;arr[x+1][y]==n&&x<15;x++) l4+=2;
if(arr[x+1][y]==m)l4--;
for(x=i,y=j; arr[x-1][y]==n&&x>0;x--) l4+=2;
if(arr[x-1][y]==m)l4--;
count(l4,i,j);
}
if(n==1)
{ max_1=b[0][0];
for(i=0;i<16;i++)
for(j=0;j<16;j++)
if(b[i][j]>=max_1)
{max_1=b[i][j];
x_1=i;
y_1=j;
}
n++; m--;
goto see;
}
if(n==2)
{ max_2=b[0][0];
for(i=0;i<16;i++)
for(j=0;j<16;j++)
if(b[i][j]>=max_2) {max_2=b[i][j]; x_2=i;y_2=j;} n++;m--; }
if(max_2>=90||(max_1<90&&max_2>=50)||max_2>=max_1)
{x_1=x_2; y_1=y_2;}
tx=160+x_1*20;ty=90+y_1*20;
for(i=6;i>0;i--)
{setcolor(15);if(i<3)setcolor(BLACK);
circle(tx,ty,i);}
arr[x_1][y_1]=2;
}
void count(int l,int i,int j)
{
switch(l)
{
case -1:
case 0: break;
case 1: b[i][j]+=2; break; /*2*/
case 2: b[i][j]+=4; break; /*4*/
case 3: b[i][j]+=7; break;
case 4: b[i][j]+=10; break;
case 5: b[i][j]+=13; break;
case 6: b[i][j]+=50; break;
case 7:
case 8: b[i][j]+=95; break;
case 9:
case 10:
case 11:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18: b[i][j]+=150;
default: b[i][j]+=0; break;
}
}
int judge(int n)
{
int i,j,x,y,ju=0,l1,l2,l3,l4;
for(i=0;i<16;i++)
for(j=0;j<16;j++)
if(a[i][j]==n)
{for(x=i,y=j,l1=1;a[x][y+1]==n&&y<15;y++) l1++;
if(l1>=5) {ju=1;goto re;}
for(x=i,y=j,l2=1;a[x+1][y-1]==n&&x<15&&y>0;x++,y--) l2++;
if(l2>=5) {ju=1;goto re;}
for(x=i,y=j,l3=1;a[x+1][y+1]==n&&x<15&&y<15;x++,y++) l3++;
if(l3>=5) {ju=1;goto re;}
for(x=i,y=j,l4=1;a[x+1][y]==n&&x<15;x++) l4++;
if(l4>=5) {ju=1;goto re;}
}
re: if(i!=16&&j!=16) {setcolor(WHITE);circle(160+i*20,90+j*20,10);}
return(ju);
}
int getkey()
{union REGS rg;
rg.h.ah=0;
int86(0x16,&rg,&rg);
return rg.h.ah;
}
void sd()
{sound(720);delay(3500);nosound();}