【问题标题】:Logic error in swapping a peg jump puzzle交换钉跳谜的逻辑错误
【发布时间】:2017-02-03 22:17:40
【问题描述】:

有人可以帮我换吗?我认为有一个逻辑错误。我知道源代码和目标代码是正确的,所以我的 if 语句有些问题。游戏规则:游戏一开始是一个金字塔结构,除了一个圆圈“o”外,所有的都是“+”,你只能将一个钉子移动到相邻的一个圆圈(两个点上/对角线),任何跳过的棋子都会也可以用圆圈代替。例如,您可以沿对角线移动两个点,中间跳过的部分将与原始位置一样被圈出,但您要移动到的部分将其圆圈替换为“+”。视觉图像在下面。此外,变量对应于字母。例如: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

【问题讨论】:

  • 是否应该将(source || destination == 'D') 更改为`((source == 'D') || (destination == 'D'))? (在您应用此逻辑测试的所有地方)
  • 哦,废话。让我试试。谢谢
  • 这行得通,谢谢。
  • 具有如此大参数列表的函数大多数时候显示出糟糕的界面设计。使用不言自明的名称并考虑使用structs 或以其他方式减少界面。

标签: c logic swap


【解决方案1】:

我认为您的逻辑比较/测试需要修改。逻辑运算符&&|| 都需要应用于要比较的值。例如,它的编写方式是,sourcedestination 进行“或”运算,然后测试其结果是否与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;
                     }

To: (EDIT - 更正了第一条语句,将 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(...) 语句中,无论ADdestination 还是source,数据都从A 复制到D。在这种形式下,代码的实际意图并不明确,并且可能不会执行所需的操作。

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

例如,考虑在您的代码 sn-p 中,您清楚地确定了 3 个可能的来源和 3 个可能的目的地:

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

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}

【讨论】:

  • 这个答案说:如果(源是 D 或源是 A)并且目标是 D。或者如果(源是 K 并且(目标是 K 或目标是 D)你确定那是你想要吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 2018-05-01
  • 2019-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-01
相关资源
最近更新 更多