c语言五子棋人机对弈算法(c语言五子棋人人对战)
求一个五子棋人机对战c语言算法 主要是电脑不知道怎么下棋,设计的是玩家先手
objectMainextendsApp{
varreverse_pairs = 0//逆序数
defmsort[T](cmp:(T, T) = Boolean)(l:List[T]):List[T] = {
defmerge(l1:List[T], l2:List[T]):List[T]=(l1, l2)match{
case(Nil, _) = l2
case(_, Nil) = l1
case(x::left1, y::left2) =
if(cmp(x, y))
x::merge(left1, l2)
else{
reverse_pairs += l1.length
y::merge(l1, left2)
}
}
valn = l.length / 2
if(n == 0)
return l
else{
val(l1, l2) = l.splitAt(n)
merge(msort(cmp)(l1), msort(cmp)(l2))
}
}
println(msort((x:Int, y:Int) = xy)(List(5, 4, 3, 2, 7,6 )))
println(reverse_pairs)
}
c语言的五子棋代码(博弈算法)
#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=1;i=N;i++)
for(j=1;j=N;j++)
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=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.sumw[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=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])
{
case?5:biaoji=1;return(STOP);
case?-5:biaoji=-1;return(STOP);
case?-4:c[i]=100000;break;
case?4:c[i]=100000;break;
case?-3:c[i]=150;break;
case?3:c[i]=150;break;
case?-2:c[i]=120;break;
case?2:c[i]=100;break;
case?-1:c[i]=1;break;
case?1: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.sumd[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==0j==1k==1l==1m==0))
return?(900);
if((i==0j==-1k==-1l==-1m==0))
return(1000);
if((i==0j==0k==1l==1m==1)||(i==1j==1k==1l==0m==0))
return(20);
if((i==0j==0k==-1l==-1m==-1)||(i==-1j==-1k==-1l==0m==0))
return(20);
if((i==-1j==1k==1l==1m==1)||(i==1j==-1k==1l==1m==1)||(i==1j==1k==-1l==1m==1)||(i==1j==1k==1l==-1m==1)||(i==1j==1k==1l==1m==-1))
return(-60);
if((i==1j==-1k==-1l==-1m==-1)||(i==-1j==1k==-1l==-1m==-1)||(i==-1j==1k==-1l==-1m==-1)||(i==-1j==-1k==-1l==1m==-1)||(i==-1j==-1k==-1l==-1m==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=key0x00ff;
hi=(key0xff00)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=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);
}
else?if(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);
}
}
}
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=1;i=r;i++)
{
circle(x,y,i);
}
}
}
void?map(int?a[N+1][N+1])
{
int?i,j;
cleardevice();
setbkcolor(B);
setcolor(RED);
for(i=0;iN;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);
}
c语言五子棋人机对战的代码
首先设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
代码挺长的,没什么看的意义,自己琢磨一下这个就写了
不懂得继续问
求五子棋C语言AI算法(原创思路)
我有个简单的思路: 先定义一条线上棋子的各种布局,比如初步定义长度为五个子 ◎◎◎◎● ◎◎●◎× ◎●◎×× ◎×◎×◎ 等等。白圈是自己的子,黑圈是对方的子,叉子是未走的格子。 程序里有个布局表,再定义各个布局的分数,比如连五最99分,连三30分等等。 ...
求一个c语言写的五子棋程序,要有人机对战和人人对战两种模式,可以选择棋盘大小,最好带禁手,和图形化
# includestdio.h
# includestring.h
# includestdlib.h
# define SPA 0
# define MAN 1
# define COM 2 /* 空位置设为0 ,玩家下的位置设为1 ,电脑下的位置设为2 */
int qipan[15][15]; /* 15*15的棋盘 */
int a,b,c,d,x; /* a b为玩家下子坐标 ,c d为电脑下子坐标 x为剩余空位置*/
void start(); /* 程序的主要控制函数 */
void draw(); /* 画棋盘 */
int win(int p,int q); /* 判断胜利 p q为判断点坐标 */
void AI(int *p,int *q); /* 电脑下子 p q返回下子坐标 */
int value(int p,int q); /* 计算空点p q的价值 */
int qixing(int n,int p,int q); /* 返回空点p q在n方向上的棋型 n为1-8方向 从右顺时针开始数 */
void yiwei(int n,int *i,int *j); /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */
void main()
{
char k;
do{
x=225;
start();
printf("还要再来一把吗?输入y或n:"); getchar(); scanf("%c",k);
while(k!='y'k!='n'){
printf("输入错误,请重新输入\n"); scanf("%c",k); }
system("cls"); }while(k=='y'); printf("谢谢使用!\n");
}
void start()
{
int i,j,a1,b1,c1,d1,choice; /* a1 b1储存玩家上手坐标 c1 d1储存电脑上手坐标 */
char ch;
printf("\t╔══════════════════════════════╗\n"); printf("\t║ ║\n"); printf("\t║ 欢迎使用五子棋对战程序 祝您玩的愉快挑战无极限 ║\n"); printf("\t║ ║\n"); printf("\t║ ._______________________. ║\n"); printf("\t║ | _____________________ | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I 五 子 棋 I | ║\n"); printf("\t║ | I I | ║\n"); printf("\t║ | I made by 晓之蓬 I | ║\n"); printf("\t║ | I___________________I | ║\n"); printf("\t║ !_______________________! ║\n"); printf("\t║ ._[__________]_. ║\n"); printf("\t║ .___|_______________|___. ║\n"); printf("\t║ |::: ____ | ║\n"); printf("\t║ | ~~~~ [CD-ROM] | ║\n"); printf("\t║ !_____________________! ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 寒 星 溪 月 疏 星 首,花 残 二 月 并 白 莲。 ║\n"); printf("\t║ 雨 月 金 星 追 黑 玉,松 丘 新 宵 瑞 山 腥。 ║\n"); printf("\t║ 星 月 长 峡 恒 水 流,白 莲 垂 俏 云 浦 岚。 ║\n"); printf("\t║ 黑 玉 银 月 倚 明 星,斜 月 明 月 堪 称 朋。 ║\n"); printf("\t║ 二 十 六 局 先 弃 二,直 指 游 星 斜 彗 星。 ║\n"); printf("\t║ ║\n"); printf("\t║ ║\n"); printf("\t║ 1.人机对战 2.人人对战 ║\n"); printf("\t║ ║\n"); printf("\t╚═══════════════════════════ ══╝\n"); printf("\t\t\t请输入1或2:");
scanf("%d",choice); /* 选择模式:人机或人人 */
while(choice!=1choice!=2) {
printf("输入错误,请重新输入:"); scanf("%d",choice); }
if(choice==1){ /* 人机模式 */
system("cls");
printf("欢迎使用五子棋人机对战!下子请输入坐标(如13 6)。悔棋请输入15 1 5。\n\n\n");
for(j=0;j15;j++)
for(i=0;i15;i++)
qipan[j][i]=SPA; /* 置棋盘全为空 */
draw();
printf("先下请按1,后下请按2:"); scanf("%d",i);
while(i!=1i!=2) { printf("输入错误,请重新输入:"); scanf("%d",i); }
if(i==1) { /* 如果玩家先手下子 */
printf("请下子:"); scanf("%d%d",a,b);
while((a0||a14)||(b0||b14)) {
printf("坐标错误!请重新输入:"); scanf("%d%d",a,b); }
a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();
}
while(x!=0){
if(x==225) {
c=7; d=7; qipan[d][c]=COM; x--; system("cls"); draw(); } /* 电脑先下就下在7 7 */
else { AI(c,d); qipan[d][c]=COM; x--; system("cls"); draw(); } /* 电脑下子 */
c1=c; d1=d; /* 储存电脑上手棋型 */
if(win(c,d)){ /* 电脑赢 */
printf("要悔棋吗?请输入y或n:"); getchar(); scanf("%c",ch);
while(ch!='y'ch!='n') { printf("输入错误,请重新输入:");
scanf("%c",ch); }
if(ch=='n') {
printf("下不过电脑很正常,请不要灰心!!!\n"); return; }
else { x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA;
system("cls"); draw(); } /* 悔棋 */
}
printf("电脑下在%d %d\n请输入:",c,d);
scanf("%d%d",a,b); /* 玩家下子 */
if(a==15b==15) {
x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls"); draw();
printf("请输入:"); scanf("%d%d",a,b); } /* 悔棋 */
while((a0||a14)||(b0||b14)||qipan[b][a]!=SPA) {
printf("坐标错误或该位置已有子!请重新输入:");
scanf("%d%d",a,b); }
a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();
if(win(a,b)){ printf("电脑神马的都是浮云!!!\n");
return; } /* 玩家赢 */
}
printf("和局\n");
}
if(choice==2){
system("cls");
printf("欢迎使用五子棋人人对战!下子请输入坐标(如13 6)。悔棋请输入15 15。 \n\n\n");
for(j=0;j15;j++)
for(i=0;i15;i++)
qipan[j][i]=SPA; /* 置棋盘全为空 */
draw();
while(x!=0){
printf("1P请输入:"); scanf("%d%d",a,b);
if(a==15b==15) {
x+=2; qipan[d][c]=SPA; qipan[b1][a1]=SPA; system("cls");
draw(); printf("1P请输入:"); scanf("%d%d",a,b); }
while((a0||a14)||(b0||b14)||qipan[b][a]!=SPA) {
printf("坐标错误或该位置已有子!请重新输入:");
scanf("%d%d",a,b); }
a1=a; b1=b; x--; qipan[b][a]=MAN; system("cls"); draw();
printf("1P下在%d %d。\n",a,b);
if(win(a,b)){ printf("你真棒!!!\n"); return; } /* 玩家1赢 */
printf("2P请输入:"); scanf("%d%d",c,d);
if(c==15d==15) {
x+=2; qipan[b][a]=SPA; qipan[d1][c1]=SPA; system("cls"); draw();
printf("2P请输入:"); scanf("%d%d",c,d); }
while((c0||c14)||(d0||d14)||qipan[d][c]!=SPA) {
printf("坐标错误或该位置已有子!请重新输入:"); scanf("%d%d",c,d);
}
c1=c; d1=d; x--; qipan[d][c]=COM; system("cls"); draw();
printf("2P下在%d %d。\n",c,d);
if(win(c,d)){ printf("你真棒!!!\n"); return; } /* 玩家2赢 */
}
printf("和局\n");
}
}
void draw() /* 画棋盘 */
{
int i,j;
char p[15][15][4];
for(j=0;j15;j++)
for(i=0;i15;i++){
if(qipan[j][i]==SPA) strcpy(p[j][i]," \0");
if(qipan[j][i]==MAN) strcpy(p[j][i],"●\0");
if(qipan[j][i]==COM) strcpy(p[j][i],"◎\0"); }
printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");
printf(" ┌—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┬—┐\n");
for(i=0,j=0;i14;i++,j++){
printf(" %2d│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%d\n",j,p[i][0],p[i][1],p[i][2],p[i][3],p[i][4],p[i][5],p[i][6],p[i][7],p[i][8],p[i][9],p[i][10],p[i][11],p[i][12],p[i][13],p[i][14],j);
printf(" ├—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┼—┤\n"); }
printf(" 14│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│%s│0\n",p[14][0],p[14][1],p[14][2],p[14][3],p[14][4],p[14][5],p[14][6],p[14][7],p[14][8],p[14][9],p[14][10],p[14][11],p[14][12],p[14][13],p[14][14]);
printf(" └—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┴—┘\n");
printf(" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 \n");
}
int win(int p,int q) /* 判断胜利 p q为判断点坐标,胜利返回1,否则返回0 */
{
int k,n=1,m,P,Q; /* k储存判断点p q的状态COM或MAN。P Q储存判断点坐标。n为判断方向。m为个数。 */
P=p; Q=q; k=qipan[q][p];
while(n!=5){
m=0;
while(k==qipan[q][p]){
m++; if(m==5) return 1;
yiwei(n,p,q); if(p0||p14||q0||q14) break;
}
n+=4; m-=1; p=P; q=Q; /* 转向判断 */
while(k==qipan[q][p]){
m++;
if(m==5) return 1;
yiwei(n,p,q); if(p0||p14||q0||q14) break;
}
n-=3; p=P; q=Q; /* 不成功则判断下一组方向 */
}
return 0;
}
void AI(int *p,int *q) /* 电脑下子 *p *q返回下子坐标 */
{
int i,j,k,max=0,I,J; /* I J为下点坐标 */
for(j=0;j15;j++)
for(i=0;i15;i++)
if(qipan[j][i]==SPA){ /* 历遍棋盘,遇到空点则计算价值,取最大价值点下子。 */
k=value(i,j); if(k=max) { I=i; J=j; max=k; }
}
*p=I; *q=J;
}
int value(int p,int q) /* 计算空点p q的价值 以k返回 */
{
int n=1,k=0,k1,k2,K1,K2,X1,Y1,Z1,X2,Y2,Z2,temp;
int a[2][4][4]={40,400,3000,10000,6,10,600,10000,20,120,200,0,6,10,500,0,30,300,2500,5000,2,8,300,8000,26,160,0,0,4,20,300,0}; /* 数组a中储存己方和对方共32种棋型的值 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */
while(n!=5){
k1=qixing(n,p,q); n+=4; /* k1,k2为2个反方向的棋型编号 */
k2=qixing(n,p,q); n-=3;
if(k1k2) { temp=k1; k1=k2; k2=temp; } /* 使编号小的为k1,大的为k2 */
K1=k1; K2=k2; /* K1 K2储存k1 k2的编号 */
Z1=k1%10; Z2=k2%10; k1/=10; k2/=10; Y1=k1%10; Y2=k2%10; k1/=10; k2/=10;
X1=k1%10; X2=k2%10; /* X Y Z分别表示 己方0对方1 活0冲1空活2空冲3 子数0-3(0表示1个子,3表示4个子) */
if(K1==-1) {
if(K20) { k+=0; continue; } else k+=a[X2][Y2][Z2]+5; continue; }; /* 空棋型and其他 */
if(K1==-2) { if(K20) { k+=0; continue; }
else k+=a[X2][Y2][Z2]/2; continue; }; /* 边界冲棋型and其他 */
if(K1==-3) { if(K20) { k+=0; continue; }
else k+=a[X2][Y2][Z2]/3; continue; }; /* 边界空冲棋型and其他 */
if(((K1-1K14)((K2-1K24)||(K29K214)))||((K199K1104)((K299K2104)||(K2109K2114)))){
/* 己活己活 己活己冲 对活对活 对活对冲 的棋型赋值*/
if(Z1+Z2=2) { k+=a[X2][Y2][3]; continue; }
else { k+=a[X2][Y2][Z1+Z2+1]; continue; }
}
if(((K19K114)(K29K214))||((K1109K1114)(K2109K2114))){
/* 己冲己冲 对冲对冲 的棋型赋值*/
if(Z1+Z2=2) { k+=10000; continue; }
else { k+=0; continue; }
}
if(((K1-1K14)((K299K2104)||(K2109K2114)))||((K19K114)((K299K2104)||(K2109K2114)))){
/* 己活对活 己活对冲 己冲对活 己冲对冲 的棋型赋值*/
if(Z1==3||Z2==3) { k+=10000; continue; }
else { k+=a[X2][Y2][Z2]+a[X1][Y1][Z1]/4; continue; }
}
else
{ k+=a[X1][Y1][Z1]+a[X2][Y2][Z2]; continue; } /* 其他棋型的赋值 */
}
return k;
}
int qixing(int n,int p,int q) /* 返回空点p q在n方向上的棋型号 n为1-8方向 从右顺时针开始数 */
{
int k,m=0; /* 棋型号注解: 己活000-003 己冲010-013 对活100-103 对冲110-113 己空活020-023 己空冲030-033 对空活120-123 对空冲130-133 空-1 边界冲-2 边界空冲-3*/
yiwei(n,p,q);
if(p0||p14||q0||q14) k=-2; /* 边界冲棋型 */
switch(qipan[q][p]){
case COM:{
m++; yiwei(n,p,q);
if(p0||p14||q0||q14) { k=m+9; return k; }
while(qipan[q][p]==COM) {
m++; yiwei(n,p,q); if(p0||p14||q0||q14) { k=m+9; return k; }
}
if(qipan[q][p]==SPA) k=m-1; /* 己方活棋型 */
else k=m+9; /* 己方冲棋型 */
}break;
case MAN:{
m++; yiwei(n,p,q);
if(p0||p14||q0||q14) { k=m+109; return k; }
while(qipan[q][p]==MAN) {
m++; yiwei(n,p,q); if(p0||p14||q0||q14) { k=m+109; return k; }
}
if(qipan[q][p]==SPA) k=m+99; /* 对方活棋型 */
else k=m+109; /* 对方冲棋型 */
}break;
case SPA:{
yiwei(n,p,q);
if(p0||p14||q0||q14) { k=-3; return k; } /* 边界空冲棋型 */
switch(qipan[q][p]){
case COM:{
m++; yiwei(n,p,q);
if(p0||p14||q0||q14) { k=m+29; return k; }
while(qipan[q][p]==COM) {
m++; yiwei(n,p,q);
if(p0||p14||q0||q14) { k=m+29; return k; }
}
if(qipan[q][p]==SPA) k=m+19; /* 己方空活棋型 */
else k=m+29; /* 己方空冲棋型 */
}break;
case MAN:{
m++; yiwei(n,p,q);
if(p0||p14||q0||q14) { k=m+129; return k; }
while(qipan[q][p]==MAN) {
m++; yiwei(n,p,q);
if(p0||p14||q0||q14) { k=m+129; return k; }
}
if(qipan[q][p]==SPA) k=m+119; /* 对方空活棋型 */
else k=m+129; /* 对方空冲棋型 */
}break;
case SPA: k=-1; break; /* 空棋型 */
}
}break;
}
return k;
}
void yiwei(int n,int *i,int *j) /* 在n方向上对坐标 i j 移位 n为1-8方向 从右顺时针开始数 */
{
switch(n){
case 1: *i+=1; break;
case 2: *i+=1; *j+=1; break;
case 3: *j+=1; break;
case 4: *i-=1; *j+=1; break;
case 5: *i-=1; break;
case 6: *i-=1; *j-=1; break;
case 7: *j-=1; break;
case 8: *i+=1; *j-=1; break;
}
}
人人对弈的简单五子棋程序 c语言 棋盘是点 语言200行左右
五子棋程序:
#includeiostream
using namespace std;
int Hsheng(char a[][15]);//判断o子是否获胜的函数
int Bsheng(char a[][15]);//判断x子是否获胜的函数
int he(char a[][15]);//判断是否平局(也就是棋盘下满了)的函数
void qipan(char a[15][15])//执行输出棋盘命令
{ for(int i=0;i15;i++) //打印棋盘
{ for(int j=0;j15;j++)
couta[i][j];
coutendl; } }
int main()
{ char a[15][15]; int x,y;
for(int i=0;i15;i++)
for(int j=0;j15;j++)
a[i][j]=' '; qipan(a);
while(1)//用循环语句执行o,x交替下子,这些while语句看起来似乎是个死循环~实际上都会经过break结束
{ int a1=1;
while(1)
{ for(;a1;)
{ cout"请输入o子下的位置:"; //输入o子的位置
cinxy; if(a[x][y]=='o'||a[x][y]=='x')//判断是否已有子
{cout"已有子请重下"",";continue;}
else if(x=15||y=15){cout"输入错误请重输"",";continue;}
else { a[x][y]='o'; a1=0;}
} break;}
qipan(a);//下好o子后将棋盘显示
if(Hsheng(a))//判断o子是否已经获胜
{ cout"o子获胜"endl; break; }
while(1)//下x子
{ cout"请输入x子下的位置:";
cinxy;
if(a[x][y]=='o'||a[x][y]=='x'||x=15||y=15)
{ for( ; a[x][y]=='o'||a[x][y]=='x'; )
{ cout"已有子请重下";
cout"请输入x子下的位置:";
cinxy;continue; }
for ( ; x=15||y=15||x; )
{ cout"输入错误请重输"","; //判断输入棋子位置是否正确
cout"请输入x子下的位置:";
cinxy;continue ;}
a[x][y]='x';break; }
else
{ a[x][y]='x'; break; } }
qipan(a);//再一次输出棋盘
if(Bsheng(a))//判断x子是否已经获胜
{ cout"x子获胜"endl; break; }
if(he(a))//判断是否平局
{ cout"平局"endl; break; } }
return 0; }
int Hsheng(char a[][15])
{ int i,j;//判断横着的5个是否都相等
for(i=0;i15;i++)
for(j=0;j15;j++)
if(a[i][j]=='o'a[i][j+1]=='o'a[i][j+2]=='o'a[i][j+3]=='o'a[i][j+4]=='o')
return 1;
for(j=0;j15;j++)//判断竖着的5个是否都相等
for(i=0;i15;i++)
if(a[i][j]=='o'a[i+1][j]=='o'a[i+2][j]=='o'a[i+3][j]=='o'a[i+4][j]=='o')
return 1;
for(i=0;i15;i++)//判断左斜5个
for(j=0;j15;j++)
if(a[i][j]=='o'a[i+1][j+1]=='o'a[i+2][j+2]=='o'a[i+3][j+3]=='o'a[i+4][j+4]=='o')
return 1;
for(i=0;i15;i++)//右斜5个
for(j=14;j3;j--)
if(a[i][j]=='H'a[i+1][j-1]=='o'a[i+2][j-2]=='o'a[i+3][j-3]=='o'a[i+4][j-4]=='o')
return 1;
return 0; }
int Bsheng(char a[][15])//同o,只是改字符
{ int i,j;
for(i=0;i15;i++)
for(j=0;j15;j++)
if(a[i][j]=='x'a[i][j+1]=='x'a[i][j+2]=='x'a[i][j+3]=='x'a[i][j+4]=='x')
return 1;
for(j=0;j15;j++)
for(i=0;i15;i++)
if(a[i][j]=='x'a[i+1][j]=='x'a[i+2][j]=='x'a[i+3][j]=='x'a[i+4][j]=='x')
return 1;
for(i=0;i15;i++)
for(j=0;j15;j++)
if(a[i][j]=='x'a[i+1][j+1]=='x'a[i+2][j+2]=='x'a[i+3][j+3]=='x'a[i+4][j+4]=='x')
return 1;
for(i=0;i15;i++)
for(j=14;j3;j--)
if(a[i][j]=='x'a[i+1][j-1]=='x'a[i+2][j-2]=='x'a[i+3][j-3]=='x'a[i+4][j-4]=='x')
return 1;
return 0; }
int he(char a[][15])
{ for(int i=0;i15;i++)
for(int j=0;j15;j++)
{ if(a[i][j]==' ')//当棋盘全部子都不是' '时才能return 1,即棋盘已下满
return 0;
}
return 1;
}
希望能帮到你!!