我想知道“中国象棋程序”的编程思想是什么

我想知道“中国象棋程序”的编程思想是什么,第1张

对,就是有无数中可能

因为第一步起,会有很多个可能,所以一般的象棋程序都会设定一些开局的套用路数

强大象棋程序,要算出每一种可能。一般的程序,考虑到运行速度等,会有一些规避之类的。

这个跟最终的服务器性能,和程序优化都有关系。

#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等不同格式的中国象棋棋谱文件,可以方便的进行打谱研究。支持棋谱和局面的剪切板 *** 作。

人机对战:具有很强的人工智能,方便灵活的时间设置和强大的棋步分析功能。摆设残局:方便快捷的残局摆设功能,丰富的快捷键,轻松实现让子和让先对弈的功能。

网络对战:内置弈天网站自动对弈功能,可以连接到弈天网站进行自动对弈。同时利用“弈星”象棋连线程序,能够让本软件连接到任何象棋网站进行自动对弈。

以上就是关于我想知道“中国象棋程序”的编程思想是什么全部的内容,包括:我想知道“中国象棋程序”的编程思想是什么、编写一段程序,写出中国象棋的马的行棋规则。、如何利用象棋软件提高棋力等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10125529.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存