2014-01-09 80 views
0

所以我正在做一個俄羅斯方塊遊戲作爲一個學校項目在C.我遇到了一個小問題,以下情況。 在俄羅斯方塊當一個完成一個水平行時,該行應該被刪除,並且該行上的所有東西都應該向下移動一個地方。關於我的代碼的奇怪之處在於,當我將一個塊放在板的左側或中央時,塊呆在那裏就像它應該。但是,當我在板子的右側放置一個塊時,它會立即被刪除。 我把我的源代碼放在下面,所以你可以看到我在說什麼。C俄羅斯方塊,地方塊

功能checkfory(INT ycheckup,詮釋YP)

 if(ycheckup==1) 
     { 
      yp++; 
      return yp; 
     } 
     else if(ycheckup==0) 
     { 
      yp=0; 
      return yp; 
     } 

主營:

int Block_O[2][2] = {{1,1},{1,1}}; 

int printb[8][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; 
int saveb[8][4] = {{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0},{0,0,0,0}}; 


int x; 
int y; 

int i; 

int xp = 0; 
int yp = 0; 
int ycheckup = 0; 
int ch1; 
int ch2; 
int ytemp; 

int ycheck = 0; 
int xcheck = 2; 
while(1) 
{ 

    for(y=0;y<8;y++) 
    { 
     for(x=0;x<4;x++) 
     { 
      if(y==ycheck && x==xcheck || y==ycheck+1 && x==xcheck || y==ycheck && x==xcheck+1 || y==ycheck+1 && x==xcheck+1)//Looks for place to put block in 
       { 
        //printf(" %d ",xp); 
        printb[y][x] = Block_O[yp][xp]; 
        printf("%d", printb[y][x]); 
        ycheckup=1; 
        xp++; 
       } 
      else 
       { 
        printb[y][x] = saveb[y][x]; 
        printf("%d", printb[y][x]); 
        ycheckup=0; 
       } 

     } 
     //checkycor(ycheck,printb); 
     yp = checkfory(ycheckup, yp); 
     xp=0; 

     printf("\n"); 

    } 

    for(i=0; i<30000000; i++) //Delay 
    { 
     ; 
    } 
    ycheck++; 
    system("cls"); 

    if(ycheck==7 || printb[ycheck+1][xcheck] == 1 || printb[ycheck+1][xcheck+1] == 1) //Checks for correlation 
    { 
     for(y=0;y<8;y++) 
     { 
      for(x=0;x<4;x++) 
      { 
       saveb[y][x] = printb[y][x]; 
         if((printb[y][x] == 1) && (printb[y][x+1] == 1) && (printb[y][x+2] == 1) && (printb[y][x+3] == 1)) //Checks for full row 
         { 
          ytemp = y; 
          for(y=ytemp;y>0;y--) 
          { 
           for(x=0;x<4;x++) 
           { 
            if(y>0) 
            { 
             saveb[y][x] = printb[y-1][x]; //moves everything above deleted row, one row down 

            } 
            else 
            { 
             saveb[y][x] = 0; 
            } 
            printb[y][x] = saveb[y][x]; 
           } 

          } 

         } 


      } 
     } 

     ycheck=0; 
    } 

    if (kbhit()!=0) 
     { 
      ch1 = getch(); 
      ch2 = 0; 
      ch2 = getch(); 

      switch(ch2) 
      { 
      case 75: 
        xcheck--; 
       break; //left 
      case 77: 
        xcheck++; 
       break; 
      default: 
       ; 
       break; 
      }; 
     } 

} 

回答

0

我不知道爲什麼你共享checkfory(),這似乎並沒有涉及到清除行的邏輯。一些評論不會受到傷害,所以我們很容易知道哪些部分用於移動塊體,以及一旦片材處於其最終位置時清理一行。

我確實看到了什麼似乎是一個錯誤的if語句查找一個完整的行 - 它取決於x,但它是在一個循環遞增x。在我看來,檢查只能在第一個循環中正確工作,並在此之後讀入下一行塊。因此,放在右側的塊將對該塊進行比較,其餘3個檢查將對下一行的塊進行比較。

我認爲你有一個錯位的結束大括號,並且中間部分的第一個for-x循環應該只是一行,使當前行的影子副本(如果需要,可以向下移動)。

+0

我解決了這個問題,謝謝你的幫助! 我想我可能會展示一切,以防有些人想要測試它。 – user3177617