用C语言实现的五子棋算法.docx

上传人:b****0 文档编号:17828574 上传时间:2023-08-04 格式:DOCX 页数:16 大小:16.58KB
下载 相关 举报
用C语言实现的五子棋算法.docx_第1页
第1页 / 共16页
用C语言实现的五子棋算法.docx_第2页
第2页 / 共16页
用C语言实现的五子棋算法.docx_第3页
第3页 / 共16页
用C语言实现的五子棋算法.docx_第4页
第4页 / 共16页
用C语言实现的五子棋算法.docx_第5页
第5页 / 共16页
用C语言实现的五子棋算法.docx_第6页
第6页 / 共16页
用C语言实现的五子棋算法.docx_第7页
第7页 / 共16页
用C语言实现的五子棋算法.docx_第8页
第8页 / 共16页
用C语言实现的五子棋算法.docx_第9页
第9页 / 共16页
用C语言实现的五子棋算法.docx_第10页
第10页 / 共16页
用C语言实现的五子棋算法.docx_第11页
第11页 / 共16页
用C语言实现的五子棋算法.docx_第12页
第12页 / 共16页
用C语言实现的五子棋算法.docx_第13页
第13页 / 共16页
用C语言实现的五子棋算法.docx_第14页
第14页 / 共16页
用C语言实现的五子棋算法.docx_第15页
第15页 / 共16页
用C语言实现的五子棋算法.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

用C语言实现的五子棋算法.docx

《用C语言实现的五子棋算法.docx》由会员分享,可在线阅读,更多相关《用C语言实现的五子棋算法.docx(16页珍藏版)》请在冰点文库上搜索。

用C语言实现的五子棋算法.docx

用C语言实现的五子棋算法

五子棋C原码

/*turboc2.0下编译通过*/

#include

#include

#include

#include

#defineN15

#defineB7

#defineSTOP-10000

#defineOK1

#defineNO0

#defineUP328

#defineDOWN336

#defineLEFT331

#defineRIGHT333

/*定义了两个数,n为棋盘的大小。

b为背景颜色的数值*/

inta[N+1][N+1];

intzx,zy;

intwrite=1,biaoji=0;

structzn{

longsum;

inty;

intx;

}w[N+1][N+1],max,max1;

 

voidcbar(inti,intx,inty,intr);

voidmap(inta[][]);

intgetkey();

intkey();

voidzuobiao(intx,inty,inti);

inttu(inta[][],intwrite);

intwtu(inta[][],intwrite);

intzhineng(inta[][]);

intzh5(inty,intx,inta[][]);

longzzh5(intb[][],inti);

main()

{

inti,j;

intgdriver=DETECT;

intgmode;

initgraph(&gdriver,&gmode,"");

zx=(N+1)/2;

zy=(N+1)/2;

for(i=1;i<=N;i++)

for(j=1;j<=N;j++)

a[i][j]=0;

map(a);

i=1;

while(i)

{

intk,n;

k=wtu(a,write);

if(k==STOP)gotoend;

map(a);

n=zhineng(a);

if(n==STOP)gotoend;

map(a);

}

end:

;

}

/*实现对局的程序,计算全部N*N个格中,最应该填的格子*/

intzhineng(inta[N+1][N+1])

{

inti,j;

intk;

max.sum=-1;

 

for(i=0;i<=N;i++)

for(j=0;j<+N;j++)

{

w[i][j].sum=0;

w[i][j].x=i;

w[i][j].y=j;

}

for(i=1;i<=N-4;i++)

for(j=1;j<=N-4;j++)

{

k=zh5(i,j,a);

if(k==STOP)return(STOP);

}

for(i=1;i<=N;i++)

for(j=1;j<=N;j++)

{

if(max.sum

{

max.sum=w[i][j].sum;

max.y=i;

max.x=j;

}

elseif(max.sum==w[i][j].sum)

{

if(((max.y-zy)*(max.y-zy)+(max.x-zx)*(max.x-zx))>((i-zy)*(i-zy)+(j-zx)*(j-zx)))

max.sum=w[i][j].sum;

max.y=i;

max.x=j;

}

}

if(a[max.y][max.x]==0)

{

a[max.y][max.x]=-1;

zy=max.y;

zx=max.x;

}

}

 

/*转换成5*5的数组,计算出在二十五个格子中,最应该填的格*/

intzh5(inty,intx,inta[N+1][N+1])

{

inti,j;

intb[6][6];

longc[13];

longd[6][6];

longtemp;

for(i=y;i<=y+4;i++)

for(j=x;j<=x+4;j++)

b[i+1-y][j+1-x]=a[i][j];

c[1]=b[1][1]+b[1][2]+b[1][3]+b[1][4]+b[1][5];

c[2]=b[2][1]+b[2][2]+b[2][3]+b[2][4]+b[2][5];

c[3]=b[3][1]+b[3][2]+b[3][3]+b[3][4]+b[3][5];

c[4]=b[4][1]+b[4][2]+b[4][3]+b[4][4]+b[4][5];

c[5]=b[5][1]+b[5][2]+b[5][3]+b[5][4]+b[5][5];

c[6]=b[1][1]+b[2][1]+b[3][1]+b[4][1]+b[5][1];

c[7]=b[1][2]+b[2][2]+b[3][2]+b[4][2]+b[5][2];

c[8]=b[1][3]+b[2][3]+b[3][3]+b[4][3]+b[5][3];

c[9]=b[1][4]+b[2][4]+b[3][4]+b[4][4]+b[5][4];

c[10]=b[1][5]+b[2][5]+b[3][5]+b[4][5]+b[5][5];

c[11]=b[1][1]+b[2][2]+b[3][3]+b[4][4]+b[5][5];

c[12]=b[1][5]+b[2][4]+b[3][3]+b[4][2]+b[5][1];

 

for(i=1;i<=12;i++)

{

switch(c[i])

{

case5:

biaoji=1;return(STOP);

case-5:

biaoji=-1;return(STOP);

case-4:

c[i]=100000;break;

case4:

c[i]=100000;break;

case-3:

c[i]=150;break;

case3:

c[i]=150;break;

case-2:

c[i]=120;break;

case2:

c[i]=100;break;

case-1:

c[i]=1;break;

case1:

c[i]=1;break;

default:

c[i]=0;

}

}

for(i=1;i<=12;i++)

{

if(c[i]==150)

c[i]+=zzh5(b,i);

}

for(i=1;i<=5;i++)

for(j=1;j<=5;j++)

d[i][j]=0;

for(i=1;i<=5;i++)

for(j=1;j<=5;j++)

{

if(i==j)d[i][j]+=c[11];

if((i+j)==6)d[i][j]+=c[12];

d[i][j]+=c[i]+c[j+5];

}

for(i=1;i<=5;i++)

for(j=1;j<=5;j++)

{

if(b[i][j]!

=0)

d[i][j]=-2;

}

max1.sum=-1;

max1.y=0;

max1.x=0;

for(i=1;i<=5;i++)

for(j=1;j<=5;j++)

{

if(max1.sum

{

max1.sum=d[i][j];

max1.y=i;

max1.x=j;

w[i+y-1][j+x-1].sum+=max1.sum;

}

elseif(max1.sum==d[i][j])

{

if(((i+y-1-zy)*(i+y-1-zy)+(j+x-1-zx)*(j+x-1-zx))>((max1.y+y-1-zy)*(max1.y+y-1-zy)+(max1.x+x-1-zx)*(max1.x+x-1-zx)))

{

max1.sum=d[i][j];

max1.y=i;

max1.x=j;

}

}

}

}

longzzh5(intb[6][6],intn)

{

inti,j,k,l,m;

switch(n)

{

case1:

i=b[1][1];j=b[1][2];k=b[1][3];l=b[1][4];m=b[1][5];break;

case2:

i=b[2][1];j=b[2][2];k=b[2][3];l=b[2][4];m=b[2][5];break;

case3:

i=b[3][1];j=b[3][2];k=b[3][3];l=b[3][4];m=b[3][5];break;

case4:

i=b[4][1];j=b[4][2];k=b[4][3];l=b[4][4];m=b[4][5];break;

case5:

i=b[5][1];j=b[5][2];k=b[5][3];l=b[5][4];m=b[5][5];break;

case6:

i=b[1][1];j=b[2][1];k=b[3][1];l=b[4][1];m=b[5][1];break;

case7:

i=b[1][2];j=b[2][2];k=b[3][2];l=b[4][2];m=b[5][2];break;

case8:

i=b[1][3];j=b[2][3];k=b[3][3];l=b[4][3];m=b[5][3];break;

case9:

i=b[1][4];j=b[2][4];k=b[3][4];l=b[4][4];m=b[5][4];break;

case10:

i=b[1][5];j=b[2][5];k=b[3][5];l=b[4][5];m=b[5][5];break;

case11:

i=b[1][1];j=b[2][2];k=b[3][3];l=b[4][4];m=b[5][5];break;

case12:

i=b[1][5];j=b[2][4];k=b[3][3];l=b[4][2];m=b[5][1];break;

}

if((i==0&&j==1&&k==1&&l==1&&m==0))

return(900);

if((i==0&&j==-1&&k==-1&&l==-1&&m==0))

return(1000);

if((i==0&&j==0&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==0&&m==0))

return(20);

if((i==0&&j==0&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==0&&m==0))

return(20);

if((i==-1&&j==1&&k==1&&l==1&&m==1)||(i==1&&j==-1&&k==1&&l==1&&m==1)||(i==1&&j==1&&k==-1&&l==1&&m==1)||(i==1&&j==1&&k==1&&l==-1&&m==1)||(i==1&&j==1&&k==1&&l==1&&m==-1))

return(-60);

if((i==1&&j==-1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==1&&k==-1&&l==-1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==1&&m==-1)||(i==-1&&j==-1&&k==-1&&l==-1&&m==1))

return(-60);

}

/*循环执行坐标的选择,直到按回车,空格或ESC键*/

intwtu(inta[N+1][N+1],intwrite)

{

inti=1;

map(a);

zuobiao(zx,zy,1);

while(i)

{

intk;

k=tu(a,write);

if(k==OK)i=0;

if(k==STOP)return(STOP);

}

}

 

/*从键盘获得输入的值*/

intgetkey()

{

intkey,lo,hi;

key=bioskey(0);

lo=key&0x00ff;

hi=(key&0xff00)>>8;

return((lo==0)?

hi+256:

lo);

}

/*对获得的值进行判断*/

/*对应的码值分别如下*/

/*上:

328下:

336左:

331右:

333*/

/*回车:

13ESC键:

27*/

intkey()

{

intk;

k=getkey();

switch(k)

{

case27:

return(STOP);

case13:

case'':

return(OK);

case328:

return(UP);

case336:

return(DOWN);

case331:

return(LEFT);

case333:

return(RIGHT);

default:

return(NO);

}

}

/*用来显示坐标的位置*/

voidzuobiao(intx,inty,inti)

{

intr;

if(i!

=0)

{

setcolor(GREEN);

for(r=1;r<=5;r++)

circle(75+25*x,25+25*y,r);

 

}

else

{

if(a[zy][zx]==1)

{

setcolor(8);

for(r=1;r<=5;r++)

circle(75+25*x,25+25*y,r);

}

elseif(a[zy][zx]==-1)

{

setcolor(WHITE);

for(r=1;r<=5;r++)

circle(75+25*x,25+25*y,r);

}

else

{

setcolor(B);

for(r=1;r<=5;r++)

circle(75+25*x,25+25*y,r);

setcolor(RED);line(75+25*zx-5,25+25*zy,75+25*x+5,25+25*zy);

line(75+25*zx,25+25*zy-5,75+25*zx,25+25*zy+5);

}

}

}

/*从键盘获得的值进行判断,反映在显示的图上*/

inttu(inta[N+1][N+1],intwrite)

{

intk;

re:

k=key();

if(k==OK)

{

if(a[zy][zx]==0)

{

a[zy][zx]=write;

}

else

gotore;

}

if(k==STOP)return(STOP);

if(k==NO)gotore;

if(k==UP)

{

inti,j;

if(zy==1)j=zy;

elsej=zy-1;

zuobiao(zx,zy,0);

zuobiao(zx,j,1);

zy=j;

gotore;

}

if(k==DOWN)

{

inti,j;

if(zy==N)j=zy;

elsej=zy+1;

zuobiao(zx,zy,0);

zuobiao(zx,j,1);

zy=j;

gotore;

}

if(k==LEFT)

{

inti,j;

if(zx==1)i=zx;

elsei=zx-1;

zuobiao(zx,zy,0);

zuobiao(i,zy,1);

zx=i;

gotore;

}

if(k==RIGHT)

{

inti,j;

if(zx==N)i=zx;

elsei=zx+1;

zuobiao(zx,zy,0);

zuobiao(i,zy,1);

zx=i;

gotore;

}

}

 

/*根据数组中(存储棋子位置)各位置的数,画实心圆(画出棋子)*/

voidcbar(inti,intx,inty,intr)

{

if(i!

=0)

{

if(i==1)

setcolor(8);

elseif(i==-1)

setcolor(WHITE);

for(i=1;i<=r;i++)

{

circle(x,y,i);

}

}

}

/*画出棋盘,和各个棋子*/

voidmap(inta[N+1][N+1])

{

inti,j;

cleardevice();

setbkcolor(B);

setcolor(RED);

for(i=0;i

{

line(100,50+25*i,75+N*25,50+25*i);

line(100+25*i,50,100+25*i,25+N*25);

}

for(i=1;i<=N;i++)

for(j=1;j<=N;j++)

cbar(a[i][j],75+25*j,25+25*i,10);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2