交换跳钉拼图时的逻辑错误

时间:2017-02-03 22:17:41

标签: c logic swap

有人可以帮助我进行交换。我认为这是一个逻辑错误。我知道源片和目的地是正确的,所以我的if语句就是这样。游戏规则:游戏以金字塔结构开始,充满了所有' +'除了一个圆圈',你只能相邻地移动一个挂钩(两个点/对角线),任何被跳过的棋子也会被圆圈替换。例如,你可以对角地移动两个点,并且跳过中间的中间将被圈出来以及原始位置,但是你移动到的那个将用“' +&#39”替换它的圆圈。 ;。视觉图像在下面。此外,变量对应于字母。例如:pa代表现货A,pb代表现货B,依此类推。

第一步是从D到A.第二步是从K到D.我得到的输出不正确。点K,G和B应该是空的,因为B从第一步开始被跳过,而本回合中G被跳过。但是在这里,即使它只有一个' +#,我也会让A空置。现在A已经从游戏的第一步中更新了,但现在又回到了一个圆圈。 A,或' pa'应该从以下声明中更新:*pa = *pd;

以下是代码的链接: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;

                    }
}

输出图片:https://snag.gy/yh2c1M.jpg

1 个答案:

答案 0 :(得分:2)

我相信你的逻辑比较/测试需要修改。逻辑运算符&&||均需要应用于要比较的值。例如,它的编写方式,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;
                     }

收件人:(编辑 - 纠正第一个陈述,用A代替D)

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还是Ddestination还是source,数据都会从A复制到D {1}}。在该形式中,代码的实际意图并不清楚,并且可能不会执行所需的操作。

创建提供意图清晰度的语法。

例如,请注意在您的代码段中,您清楚地确定了3个可能的来源和3个可能的目的地:

enter image description here

虽然以下伪代码建议不像原始语法那样简洁(通常是所需的功能),但它更明确,显示明确的意图并涵盖所有可能的源/目标事务:

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}