最后一问是:(6)对弈过程中,若人将装置下过的1颗棋子变动位置,装置能自动发现并将该棋子放置回原来位置。(10分)
首先在每个回合的时候判断是否变动棋子位置,那首先可以判断棋子数量,如果数量相同说明变动了位置,如何在遍历每个棋子进行对比。具体实现如下:
void fun(int *a,Board board,int *coor){
int n1,n2;
n1=n2=0;
//首先计算棋子数
for(int i=0;i<9;i++)
if(a[i]==0||a[i]==1)
n1++;
for(int i=0;i<SIZE;i++)
for(int j=0;j<SIZE;j++)
if(board[i][j]==0||board[i][j]==1)
n2++;
//如果棋子数一样,说明移动了。
if(n1!=n2)
return;
else
for(int i=0;i<SIZE;i++) //循环遍历每一个棋子,判断于原来状态是否相同。
for(int j=0;j<SIZE;j++)
{
if(board[i][j]!=a[3*i+j])//不相同说明该棋子位置变化
{
if(board[i][j]==3&&a[3*i+j]!=3)//判断现在棋子在什么位置
{
coor[0]=i;
coor[1]=j;
}
else//找到他之前的位置
{
coor[2]=i;
coor[3]=j;
}
}
}
return;
}
这个函数就能实现是否变动位置并找出变动后的坐标和原来的坐标。我们可以测试一下:
#include<stdio.h>
typedef int Board [3][3];
#define SIZE 3
Board board={
{3,3,3},
{3,3,3},
{3,3,3}
};
int a[9]={3,3,3,3,3,3,3,3,3};
void fun(int *a,Board board,int *coor){
int n1,n2;
n1=n2=0;
//首先计算棋子数
for(int i=0;i<9;i++)
if(a[i]==0||a[i]==1)
n1++;
for(int i=0;i<SIZE;i++)
for(int j=0;j<SIZE;j++)
if(board[i][j]==0||board[i][j]==1)
n2++;
//如果棋子数一样,说明移动了。
if(n1!=n2)
return;
else
for(int i=0;i<SIZE;i++) //循环遍历每一个棋子,判断于原来状态是否相同。
for(int j=0;j<SIZE;j++)
{
if(board[i][j]!=a[3*i+j])//不相同说明该棋子位置变化
{
if(board[i][j]==3&&a[3*i+j]!=3)//判断现在棋子在什么位置
{
coor[0]=i;
coor[1]=j;
}
else//找到他之前的位置
{
coor[2]=i;
coor[3]=j;
}
}
}
return;
}
int main()
{
int coor[4];
printf("输入原棋盘状态:\n");
for(int i=0;i<SIZE;i++)
for(int j=0;j<SIZE;j++)
scanf("%d",&board[i][j]);
printf("输入移动后的棋盘状态:\n");
for(int i=0;i<9;i++)
scanf("%d",&a[i]);
fun(a,board,coor);
printf("请将(%d,%d)棋子移动到(%d,%d)处\n",coor[0]+1,coor[1]+1,coor[2]+1,coor[3]+1);
return 0;
}
测试结果如下: