/************************************************************/
/* 五子棋之人机对战 */
/* 2008.12.2 版本:1.0 */
/* 作者:博士金刚 */
/* 学校:北京工商管理专修学院 */
/* 专业:计算机科学与技术 */
/* Email: 349004853qq.com */
/* QQ: 349004853 */
/************************************************************/
/************************************************************/
/******** 头文件部分 ********/
#include <graphics.h> /*图形系统头文件*/
#include <conio.h>
#define closegr closegraph
#define LEFT 0x4b00 /*光标左键值*/
#define RIGHT 0x4d00 /*光标右键值*/
#define DOWN 0x5000 /*光标下键值*/
#define UP 0x4800 /*光标上键值*/
#define ESC 0x011b /* ESC键值*/
#define ENTER 0x1c0d /* 回车键值*/
/*************************************************************/
void drawqp(); /*画棋盘*/
void downzi(int x,int y,int p); /*下棋子*/
int panying(); /*判断输赢*/
void play(); /*人机对战*/
void cpuai(); /*五子棋AI*/
int qp[15][15]={0}; /*标志棋局棋子的全局数组*/
int x=399,y=239,flag=0; /*光标坐标以及输赢标志*/
void main()
{
int gd = DETECT, gm = 0;
registerbgidriver(EGAVGA_driver);
initgraph(&gd,&gm,""); /*图形模式初始化*/
settextstyle(0,0,2);
outtextxy(160,200,"Welcome to the game");
outtextxy(160,250,"Press any key to play");
getch();
cleardevice();
setbkcolor(0);
drawqp();
play();
getch();
closegraph();
}
void drawqp()
{
int i;
setcolor(1);
setlinestyle(SOLID_LINE,0,3);
setfillstyle(SOLID_FILL,6);
bar(163,4,635,475);
rectangle(163,3,635,475);
setlinestyle(SOLID_LINE,0,1);
for(i=0;i<15;i++)
{line(189+30*i,3,189+30*i,475);
line(163,29+30*i,635,29+30*i);
}
printf("\n");
printf("Wlcome to the game!\n");
printf("smart wuzi qi!\n\n\n");
printf("ver: 1.0\n");
printf("author:\n");
printf("boshijingang\n\n");
printf("control key:\n");
printf("up--up\n");
printf("down--down\n");
printf("left--left\n");
printf("right--right\n");
printf("Yes--Enter\n");
printf("EXIT--ESC\n\n\n");
printf("contact me:\n");
printf("QQ:\n");
printf("349004853\n");
printf("EMAIL:\n");
printf("349004853qq@.com \n");
}
void play()
{
int key=0,p=0;
int *mapbuf1,*mapbuf2;
int size;
/********** 画光标*********/
setcolor(10);
line(387,237,397,237);
line(397,227,397,237);
line(401,227,401,237);
line(401,237,411,237);
line(387,241,397,241);
line(397,241,397,251);
line(401,241,401,251);
line(401,241,411,241);
size=imagesize(387,227,411,251);
mapbuf1=(int *)malloc(size);
mapbuf2=(int *)malloc(size);
getimage(387,227,411,251,mapbuf1);
getimage(207,47,231,71,mapbuf2);
/*************循环控制双方轮流下子***************/
while(key!=ESC)
{
key=bioskey(0);
if(key == LEFT && x>189)
{
if(qp[(y-29)/30][(x-189)/30]==0)
putimage(x-12,y-12,mapbuf2,COPY_PUT);
x-=30;key=0;
if(qp[(y-29)/30][(x-189)/30]==0)
putimage(x-12,y-12,mapbuf1,COPY_PUT);
}
if(key==RIGHT&&x<609)
{
if(qp[(y-29)/30][(x-189)/30]==0)
putimage(x-12,y-12,mapbuf2,COPY_PUT);
x+=30;key=0;
if(qp[(y-29)/30][(x-189)/30]==0)
putimage(x-12,y-12,mapbuf1,COPY_PUT);
}
if(key==DOWN&&y<449)
{
if(qp[(y-29)/30][(x-189)/30]==0)
putimage(x-12,y-12,mapbuf2,COPY_PUT);
y+=30;key=0;
if(qp[(y-29)/30][(x-189)/30]==0)
putimage(x-12,y-12,mapbuf1,COPY_PUT);
}
if(key==UP&&y>29)
{
if(qp[(y-29)/30][(x-189)/30]==0)
putimage(x-12,y-12,mapbuf2,COPY_PUT);
y-=30; key=0;
if(qp[(y-29)/30][(x-189)/30]==0)
putimage(x-12,y-12,mapbuf1,COPY_PUT);
}
if(key==ENTER&&qp[(y-29)/30][(x-189)/30]==0)
{
if(p%2==0)
{ downzi(x,y,p);
qp[(y-29)/30][(x-189)/30]=1;
p++;
flag=panying();
key=0;
}
if(p%2==1)
{cpuai();
downzi(x,y,p);
qp[(y-29)/30][(x-189)/30]=2;
flag=panying();
p++;
}
}
if(1==flag)
{
settextstyle(0,0,4);
outtextxy(190,240,"The white win");
return;
}
if(2==flag)
{
settextstyle(0,0,4);
outtextxy(190,240,"The black win");
return;
}
}
}
void downzi(x,y,p)
{
if(p%2==0)
setfillstyle(SOLID_FILL,WHITE);
else
setfillstyle(SOLID_FILL,BLACK);
fillellipse(x,y,15,15);
}
int panying()
{
int p1=0,p2=0,i,j,k;
/****************判行**********************/
for(i=0;i<15;i++)
for(j=0;j<10;j++)
{
for(k=0;k<5;k++)
{
if(qp[i][j+k]==1)
p1++;
if(qp[i][j+k]==2)
p2++;
}
if(p1==5) return 1;
if(p2==5) return 2;
p1=p2=0;
}
/**************判列*******************/
for(j=0;j<15;j++)
for(i=0;i<10;i++)
{
for(k=0;k<5;k++)
{
if(qp[i+k][j]==1)
p1++;
if(qp[i+k][j]==2)
p2++;
}
if(p1==5) return 1;
if(p2==5) return 2;
p1=p2=0;
}
/**************右斜******************/
for(i=0;i<10;i++)
for(j=0;j<10;j++)
{
for(k=0;k<5;k++)
{
if(qp[i+k][j+k]==1)
p1++;
if(qp[i+k][j+k]==2)
p2++;
}
if(p1==5) return 1;
if(p2==5) return 2;
p1=p2=0;
}
/***************左斜*****************/
for(i=0;i<10;i++)
for(j=4;j<15;j++)
{
for(k=0;k<5;k++)
{
if(qp[i+k][j-k]==1)
p1++;
if(qp[i+k][j-k]==2)
p2++;
}
if(p1==5) return 1;
if(p2==5) return 2;
p1=p2=0;
}
}
void cpuai()
{
int qiju[2][15][15][8][2]={0}; /* 棋型数组*/
int k,i,j,q,b=0,a=1,d,y1=0,y2=0,x1=0,x2=0;
int a1[15][15]={0},a2[15][15]={0};
/****************为双方填写棋型表************/
for(k=0;k<2;k++)
for(i=0;i<15;i++)
for(j=0;j<15;j++)
{
if(qp[i][j]==0)
{
for(q=0;q<8;q++)
{
if(k==0) d=1;
else d=2;
if(q==0&&j>0)
{
for(;;)
{
if(qp[i][j-a]==d){b++;a++;continue;}
else break;
}
qiju[k][i][j][q][0]=b;b=0;
if(qp[i][j-a]==0){qiju[k][i][j][q][1]=1;a=1;}
else {qiju[k][i][j][q][1]=0;a=1;}
}
if(q==1&&i>0&&j>0)
{
for(;;)
{
if(qp[i-a][j-a]==d){b++;a++;continue