2017-02-03 55 views
1

有人可以幫我交換。我認爲這是一個邏輯錯誤。我知道源文件和目的地是正確的,所以我的if語句有些問題。遊戲規則:遊戲始於一個金字塔結構,除了一個圓圈'o'外,所有'+'都是完整的,你只能將一個釘子相鄰地移動到一個圓圈上(對角線上有兩個點),任何一個棋子都會跳過也可以用圓圈代替。因此,舉例來說,您可以沿對角線移動兩個點,並且中間跳過的棋子會像原始位置一樣被圈出來,但您要移動的棋子會將其圓圈替換爲「+」。視覺圖像在下面。此外,這些變量對應於字母。例如:pa是A點,pb是B點等等。交換掛鉤跳轉拼圖的邏輯錯誤

第一步是從D到A.第二步是從K到D.我得到的是不正確的輸出。點K,G和B應該是空的,因爲B從第一步跳過並且G在本回閤中被跳過。但是在這裏,儘管它只有一個'+',但我仍然把A看作空置的。現在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,並且源或目標是a,那麼實際上我想運行它。 –

回答

2

我相信你的邏輯比較/測試需要修改。邏輯運算符&&||每個都需要應用於與之比較的值。例如,它的寫法,source正在OR或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(...)聲明中,無論ADdestination還是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是D或source是A)並且destination是D.或if(source是K並且(destination是K或destination是D)你想要什麼? – user3629249