2017-02-03 3 views
1

Может кто-нибудь помочь мне с заменой. Я думаю, что есть логическая ошибка. Я знаю, что источник и пункт назначения верны, поэтому что-то происходит с моими заявлениями if. Правила игры: игра начинается с структуры пирамиды, полной всех «+», за исключением одного круга «o», и вы можете перемещать привязку только по окружности (два места над/по диагонали), любая пропущенная часть будет заменить на круг. Таким образом, вы могли бы переместиться по диагонали на два прыжка, а средний прыгнул над куском, и он был бы обведен, как и исходное положение, но часть, на которую вы двигаетесь, будет заменена на «+». Визуальное изображение ниже. Кроме того, переменные соответствуют буквам. Пример: pa для точки A, pb для точки B и т. Д.Ошибка логики при замене головоломки прыжка

Первый шаг от D до A. Второй ход от K до D. Я получаю неправильный вывод. Пункты K, G и B должны быть пустыми, потому что B был пропущен с первого хода, и G пропущен в этом направлении. Но здесь я получаю A как свободный, хотя у него просто «+». Теперь A обновился с первого хода в игре, но теперь он вернулся в круг. А, или «па» должен был обновлен из следующего утверждения:

Вот ссылка на код: 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

+0

Если '(источник || назначения ==«D»)' быть изменен на '((источник = = 'D') || (destinatio n == 'D'))? (во всех местах, где вы применяете этот логический тест) – ryyker

+0

О, дерьмо.Позвольте мне попробовать. Спасибо –

+0

Ну, на самом деле я хочу запустить его, если источником или пунктом назначения является d И если источник или пункт назначения является, если это имеет смысл. –

ответ

2

Я считаю, что ваши логические сравнения/тесты необходимо изменить. Логические операторы && и || каждый должен применяться к сравниваемому значению. Например, способ, которым он написан, source находится в OR'ed до 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; 
        } 

To: (EDIT - исправлено первое утверждение, заменить 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 или D, являются destination или source, данные копируются из A в D. В этой форме фактическая цель кода не ясна и, возможно, не будет делать то, что необходимо.

Создать синтаксис, который обеспечивает ясность намерения.

Например, считают, что во фрагменте кода, вы четко определили 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} 
+0

этот ответ говорит: if (source is D or source is A), destination is D. или if (source is K и (destination is K или destination D) Вы уверены, что это что ты хочешь? – user3629249

Смежные вопросы