交换钉跳拼图时的逻辑错误
Logic error in swapping a peg jump puzzle
谁能帮我交换一下。我认为这是一个逻辑错误。我知道源代码和目标代码是正确的,所以我的 if 语句有问题。游戏规则:游戏开始时是一个金字塔结构,除了一个圆 'o' 外,所有的都是 '+',你只能将一个钉子移动到相邻的圆(两个点 over/diagonally),任何跳过的部分也将替换为圆圈。因此,例如,您可以沿对角线移动两个点,中间跳过的棋子和原始位置将被圈出,但是您要移动到的棋子的圆圈将替换为“+”。视觉图像在下方。此外,变量对应于字母。例如:pa 代表 A 点,pb 代表 B 点等等。
第一步是从 D 到 A。第二步是从 K 到 D。我得到的输出不正确。点 K、G 和 B 应该是空的,因为 B 在第一步中被跳过,而 G 在本轮中被跳过。但在这里我得到 A 空缺,即使它只有一个“+”。现在 A 已经从游戏的第一步开始更新,但现在又回到了一个圆圈。 A,或 'pa' 应该从以下语句更新:*pa = *pd;
这是代码的 link:https://www.dropbox.com/s/puab7va8vosftdd/Source.c?dl=0
void moveHandler( char source, char destination, char *pa, char *pb, char *pc, char *pd, char *pe, char *pf,
char *pg, char *ph, char *pi, char *pj, char *pk, char *pl, char *pm, char *pn, char *po ) {
char temp;
char middle;
if ( (source || destination == 'D') && (destination || source == 'A') ) {
temp = *pa;
*pa = *pd;
*pd = temp;
}
else if ( (source || destination == 'K') && (destination || source == 'D') ) {
temp = *pk;
*pk = *pd;
*pd = temp;
}
middle = (char) ((source + destination) / 2);
switch( middle ) {
case 66:
*pb = 'o';
break;
case 71:
*pg = 'o';
break;
default:
break;
}
}
我认为您的逻辑 comparisons/tests 需要修改。逻辑运算符 &&
和 ||
都需要应用于要比较的值。例如,它的编写方式是 source
与 destination
进行“或”运算,然后测试其结果是否与 char
'D' 相等。我相信您的意图可能如下所示。
变化:
if ( (source || destination == 'D') && (destination || source == 'A') ) {
temp = *pa;
*pa = *pd;
*pd = temp;
}
else if ( (source || destination == 'K') && (destination || source == 'D') ) {
temp = *pk;
*pk = *pd;
*pd = temp;
}
收件人:(编辑 - 更正第一条陈述,将 D 替换为 A)
if ( ((source =='D') || (destination == 'D')) && ((source =='A') || (destination == 'A')) ) {
^^^
temp = *pa;
*pa = *pd;
*pd = temp;
}
else if (( (source == 'K') || (destination == 'K')) && ((destination == 'D') || (source == 'D')) ) {
temp = *pk;
*pk = *pd;
*pd = temp;
}
而且,虽然这可能是您想要的,但它可能不是解决问题所必需的。在第一个 if(...)
语句中,无论 A
或 D
是 destination
还是 source
,数据都从 A
复制到 D
。在那种形式下,代码的实际意图并不明确,并且可能不会执行所需的操作。
创建提供清晰意图的语法。
例如,假设在您的代码片段中,您清楚地确定了 3 个可能的来源和 3 个可能的目的地:
尽管以下伪代码建议不如您的原始语法(通常是所需的功能)那么简洁,但它更明确,显示了明确的意图并涵盖了所有可能的 source/destination 事务:
if( (source == ‘A’)&&(destination == ‘D’)){//copy A to D}
else if((source == ‘A’)&&(destination == ‘K’)){//copy A to K}
else if((source == ‘D’)&&(destination == ‘A’)){//copy D to A}
else if((source == ‘D’)&&(destination == ‘K’)){//copy D to K}
else if((source == ‘K’)&&(destination == ‘A’)){//copy K to A}
else if((source == ‘K’)&&(destination == ‘D’)){//copy K to D}
谁能帮我交换一下。我认为这是一个逻辑错误。我知道源代码和目标代码是正确的,所以我的 if 语句有问题。游戏规则:游戏开始时是一个金字塔结构,除了一个圆 'o' 外,所有的都是 '+',你只能将一个钉子移动到相邻的圆(两个点 over/diagonally),任何跳过的部分也将替换为圆圈。因此,例如,您可以沿对角线移动两个点,中间跳过的棋子和原始位置将被圈出,但是您要移动到的棋子的圆圈将替换为“+”。视觉图像在下方。此外,变量对应于字母。例如:pa 代表 A 点,pb 代表 B 点等等。
第一步是从 D 到 A。第二步是从 K 到 D。我得到的输出不正确。点 K、G 和 B 应该是空的,因为 B 在第一步中被跳过,而 G 在本轮中被跳过。但在这里我得到 A 空缺,即使它只有一个“+”。现在 A 已经从游戏的第一步开始更新,但现在又回到了一个圆圈。 A,或 'pa' 应该从以下语句更新:*pa = *pd;
这是代码的 link:https://www.dropbox.com/s/puab7va8vosftdd/Source.c?dl=0
void moveHandler( char source, char destination, char *pa, char *pb, char *pc, char *pd, char *pe, char *pf,
char *pg, char *ph, char *pi, char *pj, char *pk, char *pl, char *pm, char *pn, char *po ) {
char temp;
char middle;
if ( (source || destination == 'D') && (destination || source == 'A') ) {
temp = *pa;
*pa = *pd;
*pd = temp;
}
else if ( (source || destination == 'K') && (destination || source == 'D') ) {
temp = *pk;
*pk = *pd;
*pd = temp;
}
middle = (char) ((source + destination) / 2);
switch( middle ) {
case 66:
*pb = 'o';
break;
case 71:
*pg = 'o';
break;
default:
break;
}
}
我认为您的逻辑 comparisons/tests 需要修改。逻辑运算符 &&
和 ||
都需要应用于要比较的值。例如,它的编写方式是 source
与 destination
进行“或”运算,然后测试其结果是否与 char
'D' 相等。我相信您的意图可能如下所示。
变化:
if ( (source || destination == 'D') && (destination || source == 'A') ) {
temp = *pa;
*pa = *pd;
*pd = temp;
}
else if ( (source || destination == 'K') && (destination || source == 'D') ) {
temp = *pk;
*pk = *pd;
*pd = temp;
}
收件人:(编辑 - 更正第一条陈述,将 D 替换为 A)
if ( ((source =='D') || (destination == 'D')) && ((source =='A') || (destination == 'A')) ) {
^^^
temp = *pa;
*pa = *pd;
*pd = temp;
}
else if (( (source == 'K') || (destination == 'K')) && ((destination == 'D') || (source == 'D')) ) {
temp = *pk;
*pk = *pd;
*pd = temp;
}
而且,虽然这可能是您想要的,但它可能不是解决问题所必需的。在第一个 if(...)
语句中,无论 A
或 D
是 destination
还是 source
,数据都从 A
复制到 D
。在那种形式下,代码的实际意图并不明确,并且可能不会执行所需的操作。
创建提供清晰意图的语法。
例如,假设在您的代码片段中,您清楚地确定了 3 个可能的来源和 3 个可能的目的地:
尽管以下伪代码建议不如您的原始语法(通常是所需的功能)那么简洁,但它更明确,显示了明确的意图并涵盖了所有可能的 source/destination 事务:
if( (source == ‘A’)&&(destination == ‘D’)){//copy A to D}
else if((source == ‘A’)&&(destination == ‘K’)){//copy A to K}
else if((source == ‘D’)&&(destination == ‘A’)){//copy D to A}
else if((source == ‘D’)&&(destination == ‘K’)){//copy D to K}
else if((source == ‘K’)&&(destination == ‘A’)){//copy K to A}
else if((source == ‘K’)&&(destination == ‘D’)){//copy K to D}