c五子棋算法
㈠ 怎样用c语言编五子棋
任何一种棋类游戏其关键是对当前棋局是否有正确的评分,评分越准确则电脑的AI越高。五子棋游戏也是如此,但在打分之前,我们先扫描
整个棋盘,把每个空位从八个方向上的棋型填入数组gStyle(2, 15, 15, 8, 2),其中第一个下标为1时表示黑棋,为2时表示白棋,第二和第三
个下标表示(x,y),第四个下标表示8个方向,最后一个下标为1时表示棋子数,为2时表示空格数,如:
gStyle(1,2,2,1,1)=3表示与坐标(2,2)在第1个方向上相邻的黑棋棋子数为3
gstyle(1,2,2,1,2)=4表示与坐标(2,2)在第1个方向上的最近的空格数为4
在定义方向时,也应该注意一定的技巧,表示两个相反的方向的数应该差4,在程序中我是这样定义的:
Const DIR_UP = 1
Const DIR_UPRIGHT = 2
Const DIR_RIGHT = 3
Const DIR_RIGHTDOWN = 4
Const DIR_DOWN = 5
Const DIR_DOWNLEFT = 6
Const DIR_LEFT = 7
Const DIR_LEFTUP = 8
这样我们前四个方向可以通过加四得到另一个方向的值。如果你还是不太明白,请看下面的图:
---------
---------
---oo----
-ox*xx---
---------
---------
图中的*点从标为(4,4),(打*的位置是空位),则:
gStyle(2,4,4,1,1)=1在(4,4)点相邻的上方白棋数为1
gStyle(2,4,4,1,2)=2在(4,4)点的上方距上方白棋最近的空格数为2
gStyle(1,4,4,3,1)=2在(4,4)点相邻的右方黑棋数为2
gStyle(1,4,4,3,2)=1在(4,4)点的右方距右方黑棋最近的空格数为3
...
一旦把所有空点的棋型值填完,我们很容易地得出黑棋水平方向上点(4,4)的价值,由一个冲1(我把有界的棋称为冲)和活2(两边无界的
棋称为活)组成的。对于而白棋在垂直方向上点(4,4)的价值是一个活1,而在/方向也是活1所以,只要我们把该点的对于黑棋和白棋的价值算出
来,然后我们就取棋盘上各个空点的这两个值的和的最大一点作为下棋的点。然而,对各种棋型应该取什么值呢?我们可以先作如下假设:
Fn 表示先手n个棋子的活棋型,如:F4表示先手活四
Fn'表示先手n个棋子的冲棋型,如:F4'表示先手冲四
Ln 表示后手n个棋子的活棋型,如:L3表示后手活三
Ln'表示后手n个棋子的冲棋型,如:L3'表示后手冲三
.
.
.
根据在一行中的棋型分析,得到如下关系:
L1'<=F1'<L2'<=F2'<=L1<F1<L2<F2<L3'<=F3'<L4'<F4'=F4
从这个关系包含了进攻和防守的关系(当然,这个关系是由我定的,你可以自己定义这些关系)。对这些关系再进一步细化,如在一个可下
棋的点,其四个方向上都有活三,也比不上一个冲四,所以我们可以又得到4*F3<L4'这个关系,同样,我们还可以得到其它的关系,如:4*F2<L3、4*L3<F3...,这些的关系由于你的定法和我的定法制可能不一样,这样计算机的AI也就不一样,最后我们把分值最小的L1'值定为1,则我们就得
到了下面各种棋型的分值,由C语言表示为:
F[2][5]={{0,2,5,50,16000},{0,10,30,750,16000}};
L[2][5]={{0,1,5,50,3750},{0,10,30,150,4000}};
F数组表示先手,第一个下标为0时表示冲型,第二个下标表示棋子数,则F2'对应F[0][2]L数组表示后手,第一个下标为0时表示冲型,第二
个下标表示棋子数,则L2对应F[1][2]Ok,棋型的分值关系确定好了以后,我们把每一个可下点的四个方向的棋型值相加(包括先手和后手的分
值),最后选择一个最大值,并把这一点作为计算机要下的点就OK了:)。
后话:
1、得到最大值也许不止一个点,但在我的程序中只选择第一个最大点,当然你可以用于个随机数来决定
选择那一个最大值点,也可以对这些最大值点再作进一步的分析。
2、在这个算法中我只考虑了周围有棋子的点,而其它点我没有考虑。
3、可以再更进一步,用这个算法来预测以后的几步棋,再选择预测值最好的一步,这样电脑的AI就更高了
4、这个算法没有考虑黑棋的禁手(双3、双四和多于五子的连棋)。因为在平时我下的五子棋是没有这些
禁手的。
㈡ 五子棋怎么计算胜负
五子棋 、六子棋、连珠已经成为欧洲现代五子棋的组成部分,举行了很多次大大小小的比赛,并且将三种棋的世界锦标赛联合举行。下面我给你介绍五子棋怎么计算胜负,欢迎阅读。
五子棋比赛中断的情况
1. 比赛在正常情况下绝对不能中断。
2. 特殊情况下被迫暂时中断比赛。
如果比赛场地由于各种原因不能继续正常进行比赛,暂时中断比赛是必要的。一旦问题得到解决,比赛必须马上恢复进行。
3. 暂时中断比赛的程序
裁判必须严格遵守下面的封棋程序:
(1) 裁判必须记录下此刻双方棋盘上的局面并经过双方棋手确认。裁判记录当前局面所用的时间不计入双方棋手的比赛时间。
(2) 在离开赛场前,非轮走方棋手必须将自己所用的时间记录在他的比赛记录纸上,并交给裁判。
(3) 轮走方棋手封棋前,必须把他的下一步着法暗记在他的比赛记录纸上(无需让他人看到)。此着法可以不在棋盘上走出。
(4) 裁判须停止双方的棋钟,轮走方棋手必须把自己所用的时间记录在他的比赛记录纸上,并交给裁判。
(5) 裁判必须将记录下来的封棋局面和双方的比赛记录装入信封密封并妥善保管,至续赛时启封。
(6) 轮走方棋手暗记下来的封棋着法必须是合乎规则的着法,否则判负。
4.封棋续赛的程序
在封棋续赛开始时,裁判须严格遵守下面的程序:
(1) 打开密封的信封。
(2) 把比赛记录纸发还给双方棋手。
(3) 由双方棋手确认封棋时的局面和剩余用时。
(4) 轮走方棋手必须走他在封棋时暗记在记录纸上的着法,然后按停自己的棋钟,对方开始计时。
五子棋怎么计算胜负
双方确认的终局或被裁判员判定的终局均为终局。终局分胜局与和局。
l. 胜局
(1) 最先宣布自己在棋盘上形成五连,并得到对手或裁判认可的一方为胜。白棋长连视同五连。
(2) 黑方出现禁手,无论是自愿或被迫走出,只要白方立即指出,则判白方胜。
如白方在黑方出现禁手后,未立即指出而又落下一白子,则黑方禁手不再成立。
黑方走出长连禁手则不同,只要是在终局前,无论白方何时发现此长连禁手,指出此禁手而宣布胜利,判白方胜。
黑方五连与禁手同时形成,禁手失效,黑方胜。
(3) 无论在任何情况下,双方均认可的胜局。
对局中,一方出现下列情况之一,裁判员判对方胜。
A 比赛对局中故意移子,故意散乱棋局者。
B 超过规定时限者,包括比赛对局时限和迟到时限。棋手或裁判员发现后指出均可。
C 一方宣布认输者。
D 当局弃权者或未通知裁判员而中途退出比赛者。
E 在要求记录的比赛中无故拒绝记录者。
F 对局结束时,拒绝在成绩单上签字者。
G 拒绝遵守本规则者。
H 在同一局中,单方面先出现第二次违例者。
I 对局过程中棋手查阅有关资料游帆庆或离席与他人商讨棋局者,或用记谱纸、笔分析棋局,可构成辅助计算行为者。
J 正常对局过程中主动停钟者。
K 对局过轿消程中接打、观看通讯工具者。
2. 和局
对局中出现下列情况之一,判和棋。
(1) 对局双方一致同意和棋。
(2) 对局双方同一回合均放弃行棋权。
(3) 全盘均下满,已无空白交叉点,且无胜局出现。
(4) 双方比赛时限在发现时均已超时,但又不能确定哪方先超时神握。
(5) 无意移子或棋局散乱情况符合和棋规定的(参看行棋章节)。
3. 提和
(1) 欲提和者应在自己刚下完一着后提出,在提和后方可按钟。
(2) 一方提和,对方可对提和建议表示同意,也可用口头拒绝或完成一着棋的形式表示拒绝。
(3) 在对方棋钟走动时提和者,裁判员可判提和者违例。
(4) 在一局中,一方提和次数不能超过对方两次,否则,裁判员可判提和者违例。
(5) 在一局中,只要提和次数不超过对方两次,对局双方均可反复提和也可反复拒绝提和。
㈢ c语言五子棋判断谁赢算法的疑问
下一个新的子在wei处,然后以这个子为基准来判断,case
0为例,横着判断-》赢得可能性有:这个子是5个子最右边的子…盯做…这旁键个子是五个子最左边的子。所以赢得可能性中,那最左边的子的坐标就是wei.x-4,wei.y
即count=4,然后一次判断左边第三个子,第二个子,……右边运则巧第四个子,如果有连续的5个子(通过count2或3的值来判断)就算赢了。
㈣ 五子棋的算法用哪种比较简单
可以采用这样的笨算法,运行起来慢点,但是很简单易懂,而且效果很好。如果能够加以优化,则其实是很好的算法:
1、首先遍历整个棋盘,找到一个可以落子的点,然后假设自己在该点落子,再然后判断如果棋子落到这个点上后会对自己有什么利益,比如会不会形成冲4活三、双活三等等,(事先将冲四活三、双活三等效果定义上利益值,当然,如果是五个子连起来了的话,利益值要被定义成最高,最好是无穷大的),将各种效果的利益值相加,得到己方的利益值。
2、将角色互换一下,重复第一步,得到对方的利益值(其实是递桂算法)。
3、将己方的利益值减去对方的利益值,得到该点的总利益值。
4、整个棋盘所有能落子的点都计算出利益值之后,找出利益值最大的那个点,将棋子落到该点。
当然,这个算法可以有很大程度的优化,比如,如果没有相邻的棋子,可以放弃该点。还有一旦找出可以胜利的点,就不再继续往下计算。。。。
模拟算法:
int liyi(角色, 层次)
{
if(层次=0)
return 0;
for(第一个可以落子的点 到 最后一个可以落子的点)
{
int 利益,最大利益;
//递桂...
利益 = 获取本角色利益值() - liyi(角色=相反角色,层次-1);
if(利益>最大利益)
{
最大利益 = 利益;
保存该点。
}
落子到所保存的点。
}
㈤ c语言的五子棋代码(博弈算法)
#include<stdio.h>
#include<bios.h>
#include<ctype.h>
#include<conio.h>
#include<dos.h>
#defineCROSSRU0xbf/*右上角点*/
#defineCROSSLU0xda/*左上角点*/
#defineCROSSLD0xc0/*左下角点*/
#defineCROSSRD0xd9/*右下角点*/
#defineCROSSL0xc3/*左边*/
#defineCROSSR0xb4/*右边*/
#defineCROSSU0xc2/*上边*/
#defineCROSSD0xc1/*下边*/
#defineCROSS0xc5/*十字交叉点*/
/*定义棋盘左上角点在屏幕上的位置*/
#defineMAPXOFT5
#defineMAPYOFT2
/*定义1号玩家的操作键键码*/
#definePLAY1UP0x1157/*上移--'W'*/
#definePLAY1DOWN0x1f53/*下移--'S'*/
#definePLAY1LEFT0x1e41/*左移--'A'*/
#definePLAY1RIGHT0x2044/*右移--'D'*/
#definePLAY1DO0x3920/*落子--空格键*/
/*定义2号玩家的操作键键码*/
#definePLAY2UP0x4800/*上移--方向键up*/
#definePLAY2DOWN0x5000/*下移--方向键down*/
#definePLAY2LEFT0x4b00/*左移--方向键left*/
#definePLAY2RIGHT0x4d00/*右移--方向键right*/
#definePLAY2DO0x1c0d/*落子--回车键Enter*/
/*若想在游戏中途退出,可按Esc键*/
#defineESCAPE0x011b
/*定义棋盘上交叉点的状态,即该点有无棋子*/
/*若有棋子,还应能指出是哪个玩家的棋子*/
#defineCHESSNULL0/*没有棋子*/
#defineCHESS1'O'/*一号玩家的棋子*/
#defineCHESS2'X'/*二号玩家的棋子*/
/*定义按键类别*/
#defineKEYEX99v0/*退出键*/
#defineKEYFALLCHESS1/*落子键*/
#defineKEYMOVECURSOR2/*光标移动键*/
#defineKEYINVALID3/*无效键*/
/*定义符号常量:真,假---真为1,假为0*/
#defineTRUE1
#defineFALSE0
/**********************************************************/
/*定义数据结构*/
/*棋盘交叉点坐标的数据结构*/
structpoint
{
intx,y;
};
或者下面这个:
#include<graphics.h>
#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#defineN15
#defineB7
#defineSTOP-10000
#defineOK1
#defineNO0
#defineUP328
#defineDOWN336
#defineLEFT331
#defineRIGHT333
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);
intneng(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=neng(a);
if(n==STOP)gotoend;
map(a);
}
end:
;
}
intneng(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<w[i][j].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;
}
}
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<d[i][j])
{
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);
}
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);
}
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<N;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语言五子棋代码,
package day17.gobang;
import java.util.Arrays;
public class GoBangGame {
public static final char BLANK='*';
public static final char BLACK='@';
public static final char WHITE='O';
public static final int MAX = 16;
private static final int COUNT = 5;
//棋盘
private char[][] board;
public GoBangGame() {
}
//开始游戏
public void start() {
board = new char[MAX][MAX];
//把二维数组都填充‘*’
for(char[] ary: board){
Arrays.fill(ary, BLANK);
}
}
public char[][] getChessBoard(){
return board;
}
public void addBlack(int x, int y) throws ChessExistException{
//@
//char blank = '*';
//System.out.println( x +"," + y + ":" + board[y][x] + "," + BLANK);
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子
board[y][x] = BLACK;
return;
}
throw new ChessExistException("已经有棋子了!");
}
public void addWhite(int x, int y)
throws ChessExistException{
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子
board[y][x] = WHITE;
return;
}
throw new ChessExistException("已经有棋子了!");
}
//chess 棋子:'@'/'O'
public boolean winOnY(char chess, int x, int y){
//先找到y方向第一个不是 blank的棋子
int top = y;
while(true){
if(y==0 || board[y-1][x]!=chess){
//如果y已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
y--;
top = y;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
y = top;
while(true){
if(y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
y++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子
int top = x;
while(true){
if(x==0 || board[y][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
top = x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = top;
while(true){
if(x==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnXY(char chess, int x, int y){
//先找MAX向第一个不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==0 || y==0 || board[y-1][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
y--;
top = y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = left;
y = top;
while(true){
if(x==MAX || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x++;
y++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnYX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x++;
y--;
top = y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = left;
y = top;
while(true){
if(x==0 || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x--;
y++;
}
return count==COUNT;
}
public boolean whiteIsWin(int x, int y) {
//在任何一个方向上赢了,都算赢
return winOnY(WHITE, x, y) ||
winOnX(WHITE, x, y) ||
winOnXY(WHITE, x, y) ||
winOnYX(WHITE, x, y);
}
public boolean blackIsWin(int x, int y) {
return winOnY(BLACK, x, y) ||
winOnX(BLACK, x, y) ||
winOnXY(BLACK, x, y) ||
winOnYX(BLACK, x, y);
}
}
㈦ C语言五子棋
我浏览了一下你的代码,你对胜利的判断采用的是检查整个棋盘的方式,这样做的最大弊端自然是低效,而且在编写斜方向判断的时候比较复杂。我建议你采用下子后判断的方式,即玩家1下了一个字后,像该子周围8个方向检查是否存在5子的情况,只需要一个判断方法,而且较为简单。
void chooseONE()
{
printf("第一玩家请选择下棋位置\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
while(arr[ro][co]==1||arr[ro][co]==2)
{
printf("重复了!!!\n");
printf("第几个直的\n");
scanf("%d",&co);
printf("第几个横的\n");
scanf("%d",&ro);
}
arr[ro][co]=1;
//这里加判断代码,建议用一个判断函数,我给你写个吧
}
//我这里这个方法写了个大概,你看一下和你的代码结合一下就可以了,我用i和j作为for循环的变量,你用来做最大的长宽值,这些你都要改一下。
flag作为判断是否胜利的标志,playerNum是玩家的标志,分1和2,这个函数只写了左和左上的判断,其他方向楼主仿照着写
int win(int row, int col, int playerNum){
int i = 0,j = 0;
int flag = 1;
if(row - 4 >= 0){
flag = 1;
for(i = row; i >= 0; i--){
if(arr[i][j] != playerNum){
flag = 0;
break;
}
}
if(flag == 1){
return 1;
}
}
if(row - 4 >= 0 && col - 4 >= 0){
flag = 1;
for(i = row ,j = col ; i >= 0&&j>=0; i--,j--){
if(arr[i][j] != playerNum){
flag = 0;
break;
}
}
if(flag == 1){
return 1;
}
}
}
㈧ 围棋(5子棋)是怎么下的 有几中算法
分类: 体育/运动 >> 棋牌麻将
解析:
五子棋:陪返带就是连成五个子胜利,但是对于先下的黑棋有禁手限制,黑棋不可以三三/四四/以及长连(6个子以上连),这样算禁手白棋赢,国际比赛上白棋逼迫黑棋禁手也算白赢。
围棋:主要有三种规则,中国数子规则,芦芦日本比目规则,以及台湾的应式规则。数子规则要求填单官,以双方占有子和空的总数比输赢,作为先手有利的黑贴3又3/4子世段。比目规则不填单官,以空的数目和吃对方子的数目和双方比较论输赢,这种规则适合实战棋手数目,黑贴7目半。应式规则沿用较少,黑白各180子,填满计点较输赢,黑贴8点。
㈨ C#五子棋的算法
我终于编程编出来了,代码如下,这是其中的一部分
棋盘大小设置:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.dwExStyle=cs.dwExStyle|WS_EX_TOPMOST; //
cs.style=WS_SYSMENU|WS_OVERLAPPED|WS_MINIMIZEBOX;//;
//设置窗口大小:400*340
cs.cx=450;
cs.cy=500;
return TRUE;
}
初始化变量:
CMy3_1View::CMy3_1View()
{
// TODO: add construction code here
//樱数Load鼠标图像和棋子位图
hcursorblack=AfxGetApp()->LoadCursor(IDC_CURSOR1);
hcursorwhite=AfxGetApp()->LoadCursor(IDC_CURSOR2);
m_bmwhite.LoadBitmap(IDB_WHITE);
m_bmblack.LoadBitmap(IDB_BLACK);
//清理棋盘
//数组值为0表示没有棋子
for(int i=0;i<19;i++)
for(int j=0;j<19;j++)
wzq[i][j]=0;
//白棋先下
colorwhite=true;
}
现在我们就可以开始画棋盘
void CMy3_1View::OnDraw(CDC* pDC)
{
CMy3_1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//画背景
CBrush mybrush1;
mybrush1.CreateSolidBrush(RGB(192,192,192));
CRect myrect1(0,0,1200,800);
pDC->FillRect(myrect1,&mybrush1);
//画棋盘框线
CPen mypen;
CPen*myoldPen;
mypen.CreatePen(PS_SOLID,1,RGB(0,0,0));
myoldPen=pDC->SelectObject(&mypen);
for(int i=0;i<19;i++)
{
pDC->MoveTo(40,40+i*20);
pDC->LineTo(400,40+i*20);
pDC->MoveTo(40+i*20,40);
pDC->LineTo(40+i*20,400);
}
//重画时纤态显示存在的棋子
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
for(int n=0;n<19;n++)
for(int m=0;m<19;m++)
if(wzq[n][m]==1)
{
//显示白棋毁颂源
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
}
else if(wzq[n][m]==-1)
{
//显示黑棋
Dc.SelectObject(m_bmblack);
pDC->BitBlt(n*20+32,m*20+32,160,160,&Dc,0,0,SRCCOPY);
}
}
下棋操作:
void CMy3_1View::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CDC *pDC=GetDC();
CDC Dc;
if(Dc.CreateCompatibleDC(pDC)==FALSE)
AfxMessageBox("Can't create DC");
//是否在棋盘内
if(point.x>30&&point.x<410&&point.y>30&&point.y<410)
{
int px=(point.x-30)/20;
int py=(point.y-30)/20;
//是否已经有棋子
if(colorwhite&&wzq[px][py]==0)
{
Dc.SelectObject(m_bmwhite);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
//表示存在白棋
wzq[px][py]=1;
//检查是否结束
over(point);
//换黑棋下
colorwhite=false;
}
else if(wzq[px][py]==0)
{
Dc.SelectObject(m_bmblack);
pDC->BitBlt(px*20+32,py*20+32,160,160,&Dc,0,0,SRCCOPY);
wzq[px][py]=-1;
over(point);
colorwhite=true;
}
}
CView::OnLButtonUp(nFlags, point);
}
㈩ 求五子棋C语言AI算法(原创思路)
你网络,极大极小数alpha-beta剪枝树算法这是最基础的算法,如果你想做得好,这个东西绝对够你研究个三年五年的。我写过五子棋人工智能,如果你需要,我有源码发给你。