对,就是有无数中可能
因为第一步起,会有很多个可能,所以一般的象棋程序都会设定一些开局的套用路数
强大象棋程序,要算出每一种可能。一般的程序,考虑到运行速度等,会有一些规避之类的。
这个跟最终的服务器性能,和程序优化都有关系。
#include "stdioh"
#define N 8
int w=0;
int way1[8]={-2,-1,1,2, 2, 1,-1,-2};
int way2[8]={ 1,2, 2,1,-1,-2,-2,-1};
int ch[NN]={0};
int a[NN+1][3]={0};
int dir[N][N][8];
int st=1;
char c=y;
int weight[N][N];
void caculate();
void dirctions();
void print();
int check(int i,int j);
void caculate() /计算各点的权值/
{
int i,j,k;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
for(k=0;k<N;k++)
{
int x,y;
x=i+way1[k];
y=j+way2[k];
if(x>=1&&x<=N&&y>=1&&y<=N)
weight[i-1][j-1]++;
}
}
int check(int i,int j) /检查(i,j)是否在棋盘内/
{
if(i<1||i>8||j<1||j>8)
return 0;
return 1;
}
void directions() /求出各点的最佳方向序列,即优先向权值小的方向/
{
int i,j,k,m,n1,n2,x1,y1,x2,y2,way_1,way_2;
for(i=0;i<N;i++)
for(j=0;j<N;j++)
{
for(k=0;k<8;k++)
dir[i][j][k]=k;
for(k=0;k<8;k++)
{
for(m=k+1;m<8;m++) /对每个方向考察看有没有更好的/
{
way_1=dir[i][j][k];
x1=i+way1[way_1];
y1=j+way2[way_1];
way_2=dir[i][j][m];
x2=i+way1[way_2];
y2=j+way2[way_2];
n1=check(x1+1,y1+1);
n2=check(x2+1,y2+1);
if(
( n1==0 && n2 ) || /k方向不可达到,而m方向可达到/
( n1 && n2&&weight[x1][y1]>weight[x2][y2] )/都可达到但m方向权值小/
)
{
dir[i][j][k]=way_2;
dir[i][j][m]=way_1; /交换两个方向值/
}
}
}
}
}
void print()
{
int x,y;
printf("\n------%d answer----\n",++w);
for(x=1;x<N+1;x++)
{
printf("\n");
for(y=1;y<N+1;y++)
printf("%2d ",ch[(x-1)N+y-1]);
printf("\n");
}
printf("\nPress n to quit ,press any other key to continue\n");
c=getchar(); /询问是否继续输出结果/
}
main()
{
int x,y,way,way0;
caculate();
directions();
printf("Please enter the row and column of the starting point\n");
scanf("%d,%d",&a[1][0],&a[1][1]);/输入行数和列数/
getchar(); /接收回车符/
x=a[1][0],y=a[1][1];
ch[(x-1)N+y-1]=1; /在ch数组中对相应点赋值/
while(1)
{
if(a[1][2]>=8) /出发点的八个方向都已走过,表示所有的方法均已找出/
break;
if(a[st][2]>=8) /此点的八个方向都已走过,应该退回到上一次走的点/
{
x=a[st][0];
y=a[st][1];
ch[(x-1)N+y-1]=0; /将这一点被走过的痕迹抹去/
a[st][0]=a[st][1]=a[st][2]=0;
a[st-1][2]++; /使上一次走的点走的方向发生变化/
st--; /步数减一/
}
else /此点的八个方向未全走过,应走此方向/
{
way0=a[st][2];
a[st][2]++; /确定下次应走的方向/
x=a[st][0];
y=a[st][1];
way=dir[x-1][y-1][way0];
x=a[st][0]+way1[way];
y=a[st][1]+way2[way]; /确定按这次的方向走应走到的x,y坐标/
if(x<1||y<1||x>N||y>N||ch[(x-1)N+y-1]!=0)/此点不满足要求/
continue;
ch[(x-1)N+y-1]=++st; /走到这一点 /
a[st][0]=x;
a[st][1]=y;
a[st][2]=0; /标记这一步/
if(st==NN) /步数已满/
{
print(); /输出结果/
if(c==n)
break;
ch[(x-1)N+y-1]=0;
a[st][0]=a[st][1]=a[st][2]=0;
a[st-1][2]++;
st--; /退回前一步/
}
}
}
}
适当的和软件练习,软件难度要适当,高了没意义,低了没作用,最好是比自己的棋力稍微高一点,下的时候要认真,尽全力,此方法对于初级爱好者来说,是最快速有效的方法,此方法的作用在于快速帮助初级爱好者降低犯低级错误的概率,但对于有一定水平的爱好者,此方法就显得有些乏力。
扩展资料:
棋谱研究:能够读取pgn、xqn等不同格式的中国象棋棋谱文件,可以方便的进行打谱研究。支持棋谱和局面的剪切板 *** 作。
人机对战:具有很强的人工智能,方便灵活的时间设置和强大的棋步分析功能。摆设残局:方便快捷的残局摆设功能,丰富的快捷键,轻松实现让子和让先对弈的功能。
网络对战:内置弈天网站自动对弈功能,可以连接到弈天网站进行自动对弈。同时利用“弈星”象棋连线程序,能够让本软件连接到任何象棋网站进行自动对弈。
以上就是关于我想知道“中国象棋程序”的编程思想是什么全部的内容,包括:我想知道“中国象棋程序”的编程思想是什么、编写一段程序,写出中国象棋的马的行棋规则。、如何利用象棋软件提高棋力等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)