#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <alloc.h>
#include <bios.h>
#define P1LEFT 0x1e61
#define P1RIGHT 0x2064
#define P1UP 0x1177
#define P1DOWN 0x1f73
#define P1PUTDOWN 0x3920
#define P2LEFT 0x4b00
#define P2RIGHT 0x4d00
#define P2UP 0x4800
#define P2DOWN 0x5000
#define P2PUTDOWN 0x5230
#define ESC 0x011b
#define ENTER 0x1C0d
#define BACK 0xe08
#define blackside 1
#define whiteside 2
#define R 10
#define D 30 /* R棋子半径,D棋盘格间距,限制棋盘大小 */
/* 全局变量=========== */
int curposx,curposy;/*当前位置*/
int x0,y0;/* 零坐标 */
int xbak[2]={0},ybak[2]={0};
char table[15][15];/*布局的情况*/
int turn=1;
void far *imagebuffer[9][3];
/*坐标初始化,x0,y0为零坐标,xtype,ytype中:0 中心 1左上角 2右上角 3左下角 4右下角 5左边 6右边 7上边 8下边*/
int xtype[9]={7,0,14,0,14,0,14,7,7};
int ytype[9]={6,0,0,14,14,7,7,0,14};
/*==============================初始化函数===========================================================*/
void initgraphics()/* 初始化图形模式 */
{
int graphdriver=DETECT,graphmode,errorcode;
initgraph(&graphdriver,&graphmode,"");/*此处为bgi的路径*/
errorcode = graphresult();
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to escape:\n");
getch();
exit(1);
}
}
void initzb()/* 初始化零坐标和各类型前台坐标 */
{
int i;
x0=getmaxx()/2-D*7;
y0=getmaxy()/2-D*7;
for(i=0;i<9;i++)
{
xtype[i]=x0+xtype[i]*D;
ytype[i]=y0+ytype[i]*D;
}
}
void printborder(int x,int y)/* 打印光标 */
{
setcolor(WHITE);
line(x0+x*D-R,y0+y*D-R,x0+x*D-R/2,y0+y*D-R);
line(x0+x*D-R,y0+y*D-R,x0+x*D-R,y0+y*D-R/2);
line(x0+x*D-R,y0+y*D+R,x0+x*D-R/2,y0+y*D+R);
line(x0+x*D-R,y0+y*D+R,x0+x*D-R,y0+y*D+R/2);
line(x0+x*D+R,y0+y*D-R,x0+x*D+R/2,y0+y*D-R);
line(x0+x*D+R,y0+y*D-R,x0+x*D+R,y0+y*D-R/2);
line(x0+x*D+R,y0+y*D+R,x0+x*D+R/2,y0+y*D+R);
line(x0+x*D+R,y0+y*D+R,x0+x*D+R,y0+y*D+R/2);
}
void initqp() /*初始化棋盘和当前位置*/
{
int x,y;
int i,j;
for(i=0;i<15;i++)
{
for(j=0;j<15;j++)
{
table[i][j]=0;/* 后台棋盘元素初始为0 */
}
}
/*打印棋盘,15行,15列,间距为d像素*/
clearviewport();
setbkcolor(BLACK);
setfillstyle(SOLID_FILL,BROWN);
bar3d(x0-2*R,y0-2*R,x0+14*D+2*R,y0+14*D+2*R,2,1);
setcolor(WHITE);
for(x=x0;x<=x0+D*14;x+=D)
{
line(x,y0,x,y0+D*14);
}
for(y=y0;y<=y0+D*14;y+=D)
{
line(x0,y,x0+D*14,y);
}
turn=blackside;
curposx=7;
curposy=7;
printborder(curposx,curposy);
}
void initimage()
{
int size=0;
int i;
for(i=0;i<=8;i++)/* 分别对四角,四边,中间各处取空白,两色棋子图像。 */
{
size=imagesize(xtype[i]-R,ytype[i]-R,xtype[i]+R,ytype[i]+R);
imagebuffer[i][0]=farmalloc(size);
getimage(xtype[i]-R,ytype[i]-R,xtype[i]+R,ytype[i]+R,imagebuffer[i][0]); /* 把当前位置图像保存在image[i][0] */
setfillstyle(SOLID_FILL,BLACK);
fillellipse(xtype[i],ytype[i],R,R);
size=imagesize(xtype[i]-R,ytype[i]-R,xtype[i]+R,ytype[i]+R);
imagebuffer[i][1]=farmalloc(size);
getimage(xtype[i]-R,ytype[i]-R,xtype[i]+R,ytype[i]+R,imagebuffer[i][1]); /* 绘出红色棋子,并保存图像地址在imagebuffer[i][1] */
putimage(xtype[i]-R,ytype[i]-R,imagebuffer[i][0],COPY_PUT); /* 恢复到初始状态 */
setfillstyle(SOLID_FILL,WHITE);
fillellipse(xtype[i],ytype[i],R,R);
size=imagesize(xtype[i]-R,ytype[i]-R,xtype[i]+R,ytype[i]+R);
imagebuffer[i][2]=farmalloc(size);
getimage(xtype[i]-R,ytype[i]-R,xtype[i]+R,ytype[i]+R,imagebuffer[i][2]); /* 绘出白棋子状态,并保存图像地址在imagebuffer[i][2]*/
putimage(xtype[i]-R,ytype[i]-R,imagebuffer[i][0],COPY_PUT);/* 恢复初始状态 */
}
}
/*=============================功能函数======================================================================*/
/*得到坐标类型,xtype,ytype中:0 中心 1左上角 2右上角 3左下角 4右下角 5左边 6右边 7上边 8下边*/
int getpostype(int x,int y)
{
if((x==0)&&(y==0))
{
return 1;
}
else
if((x==14)&&(y==0))
{
return 2;
}
else
if((x==0)&&(y==14))
{
return 3;
}
else
if((x==14)&&(y==14))
{
return 4;
}
else
if((x==0)&&(y<14)&&(y>0))
{
return 5;
}
else
if((x==14)&&(y<14)&&(y>0))
{
return 6;
}
else
if((x>0)&&(x<14)&&(y==0))
{
return 7;
}
else
if((x>0)&&(x<14)&&(y==14))
{
return 8;
}
else
return 0;
}
/*检查当前红方 或是 白方有没有胜利*/
int check()
{
int win=0,i,j;
for(i=0;i<=4;i++)
{
if(((curposx+i)<=14)&&((curposx+i-4)>=0))
{
for(j=curposx+i-4;j<=curposx+i;j++)
{
if(table[j][curposy]!=turn)
{
win=0;
break;
}
else
win=1;
}
if(win==0)
continue;
if(win==1)
goto over;
}
}
for(i=0;i<=4;i++)
{
if(((curposy+i)<=14)&&(((curposy+i-4)>=0))){
for(j=curposy+i-4;j<=curposy+i;j++)
{
if(table[curposx][j]!=turn)
{
win=0;
break;
}
else
win=1;
}
if(win==0)
continue;
if(win==1)
goto over;
}
}
for(i=0;i<=4;i++)
{
if(((curposy+i)<=14)&&((curposx-i)>=0)&&((curposy+i-4)>=0)&&((curposx+4-i)<=14))
{
for(j=(-i);j<=(4-i);j++)
{
if(table[curposx+j][curposy-j]!=turn)
{
win=0;
break;
}
else
win=1;
}
if(win==0)
continue;
if(win==1)
goto over;
}
}
for(i=0;i<=4;i++)
{
if(((curposx+i)<=14)&&((curposy+i)<=14)&&((curposx+i-4)>=1)&&((curposy+i-4)>=1)){
for(j=(-i);j<=(4-i);j++)
{
if(table[curposx-j][curposy-j]!=turn)
{