📄 象棋马步计算程序.txt
字号:
象棋游戏中“马步”计算之C语言代码[原创]
在象棋游戏中,马走"日",象飞"田",下面的代码可以计算"马"从一个位置到达另一个位置所需要的"步数"。
算法:
1)当s=1并且t=0时,d=3
2)当s=2并且t=2时,d=4
3)当s和t为其他值时,d=max[up(s/2),up((s+t)/3)]+{(s+t)-max[up(s/2),up((s+t)/3)]}%2
其中s=max[abs(xp-xr),abs(yp-yr)],t=max[abs(xp-xr),abs(yp-yr)],p表示起点位置,r表示目标位置,up为上取整函数
代码比较简单,就不写注释了:
#define M 8
#define N 8
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
int min(int a,int b)
{
if(a<b)
return a;
return b;
}
int up(double a)
{
if((int)((int)a/a)==1)
return (int)a;
return (int)(a+1);
}
int distance(int s,int t)
{
if(s==1&&t==0)
return 3;
else if(s==2&&t==2)
return 4;
else
{
int a=up(s*1.0/2);
int b=up((s+t)*1.0/3);
return max(a,b)+(s+t-max(a,b))%2;
}
}
void init(int a[M][N])
{
int i,j;
for(i=0;i<M;i++)
for(j=0;j<N;j++)
a[i][j]=-1;
}
void output(int a[M][N])
{
int i,j;
for(i=0;i<M;i++)
{
printf("\n");
for(j=0;j<N;j++)
printf("%3d",a[i][j]);
}
}
void main()
{
int array[M][N];
int row,col;
int i,j;
int s,t;
init(array);
printf("\nPlease select a point to start:\n");
scanf("%d %d",&row,&col);
printf("\nOK.Please wait.....");
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
if(i==row&&j==col)
continue;
s=max(abs(i-row),abs(j-col));
t=min(abs(i-row),abs(j-col));
array[i][j]=distance(s,t);
}
}
array[row][col]=0;
printf("\nOK.FINISH.\N");
output(array);
}
运行效果:
Please select a point to start:
3 4
OK.Please wait.....
OK.FINISH.
3 2 3 2 3 2 3 2
2 3 4 1 2 1 4 3
3 2 1 2 3 2 1 2
2 3 2 3 0 3 2 3
3 2 1 2 3 2 1 2
2 3 4 1 2 1 4 3
3 2 3 2 3 2 3 2
4 3 2 3 2 3 2 3
Please select a point to start:
0 0
OK.Please wait.....
OK.FINISH.
0 3 2 3 2 3 4 5
3 2 1 2 3 4 3 4
2 1 4 3 2 3 4 5
3 2 3 2 3 4 3 4
2 3 2 3 4 3 4 5
3 4 3 4 3 4 5 4
4 3 4 3 4 5 4 5
5 4 5 4 5 4 5 6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -