c语言的五子棋代码(博弈算法)

Python019

c语言的五子棋代码(博弈算法),第1张

#include <stdio.h>

#include <bios.h>

#include <ctype.h>

#include <conio.h>

#include <dos.h>

#define CROSSRU     0xbf   /*右上角点*/

#define CROSSLU     0xda   /*左上角点*/

#define CROSSLD     0xc0   /*左下角点*/

#define CROSSRD     0xd9   /*右下角点*/

#define CROSSL       0xc3   /*左边*/

#define CROSSR       0xb4   /*右边*/

#define CROSSU       0xc2   /*上边*/

#define CROSSD       0xc1   /*下边*/

#define CROSS       0xc5   /*十字交叉点*/

/*定义棋盘左上角点在屏幕上的位置*/

#define MAPXOFT     5

#define MAPYOFT     2

/*定义1号玩家的操作键键码*/

#define PLAY1UP     0x1157/*上移--'W'*/

#define PLAY1DOWN   0x1f53/*下移--'S'*/

#define PLAY1LEFT   0x1e41/*左移--'A'*/

#define PLAY1RIGHT   0x2044/*右移--'D'*/

#define PLAY1DO     0x3920/*落子--空格键*/

/*定义2号玩家的操作键键码*/

#define PLAY2UP     0x4800/*上移--方向键up*/

#define PLAY2DOWN   0x5000/*下移--方向键down*/

#define PLAY2LEFT   0x4b00/*左移--方向键left*/

#define PLAY2RIGHT   0x4d00/*右移--方向键right*/

#define PLAY2DO     0x1c0d/*落子--回车键Enter*/

/*若想在游戏中途退出, 可按 Esc 键*/

#define ESCAPE       0x011b

/*定义棋盘上交叉点的状态, 即该点有无棋子 */

/*若有棋子, 还应能指出是哪个玩家的棋子   */

#define CHESSNULL   0   /*没有棋子*/

#define CHESS1       'O'/*一号玩家的棋子*/

#define CHESS2       'X'/*二号玩家的棋子*/

/*定义按键类别*/

#define KEYEX99v         0/*退出键*/

#define KEYFALLCHESS   1/*落子键*/

#define KEYMOVECURSOR   2/*光标移动键*/

#define KEYINVALID     3/*无效键*/

/*定义符号常量: 真, 假 --- 真为1, 假为0 */

#define TRUE         1

#define FALSE       0

/**********************************************************/

/* 定义数据结构                                           */

/*棋盘交叉点坐标的数据结构*/

struct point

{

int x,y

}

或者下面这个:

#include <graphics.h>

#include <stdlib.h>

#include <stdio.h>

#include <conio.h>

#define N 15

#define B 7

#define STOP -10000

#define OK 1

#define NO 0

#define UP 328

#define DOWN 336

#define LEFT 331

#define RIGHT 333

int a[N+1][N+1]

int zx,zy

int write=1,biaoji=0

struct zn{

long sum

int y

int x

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

void cbar(int i,int x,int y,int r)

void map(int a[][])

int getkey()

int key()

void zuobiao(int x,int y,int i)

int tu(int a[][],int write)

int wtu(int a[][],int write)

int zhineng(int a[][])

int zh5(int y,int x,int a[][])

long zzh5(int b[][],int i)

main()

{

int i,j

int gdriver=DETECT

int gmode

initgraph(&gdriver,&gmode,"")

zx=(N+1)/2

zy=(N+1)/2

for(i=1i<=Ni++)

for(j=1j<=Nj++)

a[i][j]=0

map(a)

i=1

while(i)

{

int k,n

k=wtu(a,write)

if(k==STOP) goto end

map(a)

n=zhineng(a)

if(n==STOP) goto end

map(a)

}

end:

}

int zhineng(int a[N+1][N+1])

{

int i,j

int k

max.sum=-1

for(i=0i<=Ni++)

for(j=0j<+Nj++)

{

w[i][j].sum=0

w[i][j].x=i

w[i][j].y=j

}

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

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

{

k=zh5(i,j,a)

if(k==STOP) return (STOP)

}

for(i=1i<=Ni++)

for(j=1j<=Nj++)

{

if(max.sum<w[i][j].sum)

{

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

max.y=i

max.x=j

}

else if(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

}

}

int zh5(int y,int x,int a[N+1][N+1])

{

int i,j

int b[6][6]

long c[13]

long d[6][6]

long temp

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

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

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=1i<=12i++)

{

switch(c[i])

{

case 5:biaoji=1return(STOP)

case -5:biaoji=-1return(STOP)

case -4:c[i]=100000break

case 4:c[i]=100000break

case -3:c[i]=150break

case 3:c[i]=150break

case -2:c[i]=120break

case 2:c[i]=100break

case -1:c[i]=1break

case 1:c[i]=1break

default: c[i]=0

}

}

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

{

if(c[i]==150)

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

}

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

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

d[i][j]=0

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

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

{

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=1i<=5i++)

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

{

if(b[i][j]!=0)

d[i][j]=-2

}

max1.sum=-1

max1.y=0

max1.x=0

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

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

{

if(max1.sum<d[i][j])

{

max1.sum=d[i][j]

max1.y=i

max1.x=j

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

}

else if(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

}

}

}

}

long zzh5(int b[6][6],int n)

{

int i,j,k,l,m

switch(n)

{

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

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

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

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

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

case 6:i=b[1][1]j=b[2][1]k=b[3][1]l=b[4][1]m=b[5][1]break

case 7:i=b[1][2]j=b[2][2]k=b[3][2]l=b[4][2]m=b[5][2]break

case 8:i=b[1][3]j=b[2][3]k=b[3][3]l=b[4][3]m=b[5][3]break

case 9:i=b[1][4]j=b[2][4]k=b[3][4]l=b[4][4]m=b[5][4]break

case 10:i=b[1][5]j=b[2][5]k=b[3][5]l=b[4][5]m=b[5][5]break

case 11:i=b[1][1]j=b[2][2]k=b[3][3]l=b[4][4]m=b[5][5]break

case 12: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)

}

int wtu(int a[N+1][N+1],int write)

{

int i=1

map(a)

zuobiao(zx,zy,1)

while(i)

{

int k

k=tu(a,write)

if(k==OK) i=0

if(k==STOP) return (STOP)

}

}

int getkey()

{

int key,lo,hi

key=bioskey(0)

lo=key&0x00ff

hi=(key&0xff00)>>8

return((lo==0) ? hi+256:lo)

}

int key()

{

int k

k=getkey()

switch(k)

{

case 27: return (STOP)

case 13:

case ' ': return (OK)

case 328: return (UP)

case 336: return (DOWN)

case 331: return (LEFT)

case 333: return (RIGHT)

default: return (NO)

}

}

void zuobiao(int x,int y,int i)

{

int r

if(i!=0)

{

setcolor(GREEN)

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

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

}

else

{

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

{

setcolor(8)

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

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

}

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

{

setcolor(WHITE)

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

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

}

else

{

setcolor(B)

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

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)

}

}

}

int tu(int a[N+1][N+1],int write)

{

int k

re:

k=key()

if(k==OK)

{

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

{

a[zy][zx]=write

}

else

goto re

}

if(k==STOP) return(STOP)

if(k==NO) goto re

if(k==UP)

{

int i,j

if(zy==1) j=zy

else j=zy-1

zuobiao(zx,zy,0)

zuobiao(zx,j,1)

zy=j

goto re

}

if(k==DOWN)

{

int i,j

if(zy==N) j=zy

else j=zy+1

zuobiao(zx,zy,0)

zuobiao(zx,j,1)

zy=j

goto re

}

if(k==LEFT)

{

int i,j

if(zx==1) i=zx

else i=zx-1

zuobiao(zx,zy,0)

zuobiao(i,zy,1)

zx=i

goto re

}

if(k==RIGHT)

{

int i,j

if(zx==N) i=zx

else i=zx+1

zuobiao(zx,zy,0)

zuobiao(i,zy,1)

zx=i

goto re

}

}

void cbar(int i,int x,int y,int r)

{

if(i!=0)

{

if(i==1)

setcolor(8)

else if(i==-1)

setcolor(WHITE)

for(i=1i<=ri++)

{

circle(x,y,i)

}

}

}

void map(int a[N+1][N+1])

{

int i,j

cleardevice()

setbkcolor(B)

setcolor(RED)

for(i=0i<Ni++)

{

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

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

}

for(i=1i<=Ni++)

for(j=1j<=Nj++)

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

}

首先设2维数组模拟棋盘,棋盘每个位置设权值,代表当前适合下的一个价值

然后根据下面的表,给值,每下一步判断一次

棋型名称 棋型模式 估值

活四 ?AAAA? 300000

死四A AAAA? 2500

死四B AAA?A 3000

死四C AA?AA 2600

活三 ??AAA?? 3000

死三A AAA?? 500

死三B ?A?AA? 800

死三C A??AA 600

死三D A?A?A 550

活二 ???AA??? 650

死二A AA??? 150

死二B ??A?A?? 250

死二C ?A??A? 200

代码挺长的,没什么看的意义,自己琢磨一下这个就写了

不懂得继续问