2017-02-03 4 views
1

누군가는 교환에 저를 도울 수있다. 논리적 인 오류가 있다고 생각합니다. 원본 조각과 대상이 정확하다는 것을 알고 있으므로 if 문으로 처리 할 수 ​​있습니다. 게임 규칙 : 게임은 하나의 원 'o'을 제외한 모든 '+'로 가득 찬 피라미드 구조로 시작하며 인접한 원으로 페그를 움직일 수 있습니다 (2 개 이상/대각선으로). 동그라미로 대체 될 수도 있습니다. 예를 들어 대각선으로 두 지점을 움직일 수 있고, 중간 점프 된 조각은 원위치뿐만 아니라 원을 따라 원을 그리지 만, 움직이는 조각은 원이 '+'로 대체됩니다. 시각적 이미지가 아래에 있습니다. 또한 변수는 문자에 해당합니다. 예 : pa는 스폿 A에 대한 것이고 pb는 스폿 B에 대한 것입니다.말뚝 뛰기 수수께끼를 교환에있는 논리 오류

첫 번째 이동은 D에서 A입니다. 두 번째 이동은 K에서 D입니다. 잘못된 결과가 나타납니다. B가 첫 번째 이동에서 건너 뛰었고 G가 이번 턴을 건너 뛰었 기 때문에 K, G 및 B 지점은 비어 있어야합니다. 하지만 여기에 '+'가 있었음에도 불구하고 A가 공백으로 표시됩니다. 이제 A가 게임의 첫 번째 움직임에서 업데이트되었지만 지금은 다시 원으로 돌아 왔습니다. A, 또는 'PA'는 다음과 같은 문에서 업데이트해야했습니다 : 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; 

        } 
} 

출력 이미지 : 여기

코드에 대한 링크입니다

+0

'(소스 || 대상 == 'D')가''((소스에 변경해야 = = 'D') || (운명 n == 'D'))? (이 논리적 테스트를 적용하는 모든 곳에서) – ryyker

+0

오 ~.그것을 시도하게하십시오. 고맙습니다. –

+0

소스 또는 대상이 d이고 소스 또는 대상이 a 인 경우 실제로 실행하고 싶습니다. –

답변

2

https://snag.gy/yh2c1M.jpg은 내가 믿는 논리 비교/테스트를 수정해야합니다. 논리 연산자 &&|| 각각을 비교할 값에 적용해야합니다. 예를 들어, 쓰여지는 방법이 source이고 결과가 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으로 복사됩니다. 그러한 형태에서, 코드의 실제 의도는 명확하지 않으며, 아마도 필요한 것을하지 않을 것입니다.

의도의 명확성을 제공하는 구문을 만듭니다.

는 예를 들어, 코드, 당신은 명확하게 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 (소스가 D이거나 소스가 A)이고 destination이 D이거나 if (소스가 K이고 (대상이 K이거나 대상이 D)입니다. 뭘 원해? – user3629249