全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2520
推到 Plurk!
推到 Facebook!

俄羅斯方塊

尚未結案
fantasy
一般會員


發表:10
回覆:9
積分:3
註冊:2003-11-27

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-03-12 12:53:43 IP:61.61.xxx.xxx 未訂閱
各位大哥,我想從別人給的程式碼學程式,看了俄羅斯方塊的程式碼遇到了藍色部分的問題    
 
  static const MapXsize = 9;
  static const MapYsize = 16;      typedef unsigned char TTetrisUnit[4][4];
  
  typedef struct
     {
       TTetrisUnit un[4];
       int x,y,r;
     } TTetrisUnits;
  
  typedef struct
     {
       unsigned char TetrisBuffer[MapYsize][MapXsize];
     } TTetrisBuffer;      enum TMoveDir
     {
       btmLeft  = 1,
       btmRight = 2,
       btmDown  = 3,
       btmCW    = 4,
       btmCCW   = 5,
     };        检查當前下落的方塊單元的狀態    int TBaseTetris::CheckUnit(int x, int y, int r)    {
  int bx,by,v=0;      for(int i=0; i<4; i  )
   {
     by = i y;
     for(int k=0; k<4; k  )
      {
        bx = k x;
        if(CurrUnit.un[r][i][k])
         {
           if((bx<0)||(bx>=MapXsize)||(by>=MapYsize))
            {
              v|=2;
              return v; //illegal move
            }
           if(by>=0)
            {
              if(BlockBuffer.TetrisBuffer[by][bx])
               {
                 v|=2; //illegal move
                 return v;
               }                  if(by>=MapYsize-1)
                v|=1; //dropped
              else if(BlockBuffer.TetrisBuffer[by 1][bx])
                v|=1; //dropped
            }
         }
      }
   }
  return v;
}    
不知道藍色部分的意思,希望知道的各位大哥能夠指教
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-03-12 14:00:31 IP:61.62.xxx.xxx 未訂閱
藍色那一段,就是檢查方塊能不能移動啊    if((bx<0)||(bx>=MapXsize)||(by>=MapYsize)) => 就是動不了 if(BlockBuffer.TetrisBuffer[by][bx]) => 這一行是檢查能不能往下掉的
fantasy
一般會員


發表:10
回覆:9
積分:3
註冊:2003-11-27

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-03-13 00:50:56 IP:61.61.xxx.xxx 未訂閱
謝謝您,但是 裡面有一些問題    
    bx = k x;          為什麼要用loop k 1, k 2 ,k 3  代表什麼?        if((bx<0)||(bx>=MapXsize)||(by>=MapYsize))
 
      bx==k x怎會<0 ?、bx>=MapXsize是左右移動嗎?              if(BlockBuffer.TetrisBuffer[by][bx])
               {
                 v|=2; //illegal move
                 return v;
               }
一直看不懂怎麼判斷
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-03-14 09:23:54 IP:60.248.xxx.xxx 未訂閱
首先,我沒看過完整的程式 僅就這片段程式碼來理解的話
引言:
    bx = k x;          為什麼要用loop k 1, k 2 ,k 3  代表什麼?
每個俄羅斯方塊,都是 4x4 的方塊 你看可以看到 i loop & k loop 都是跑 0~3(∴有四次) 顯然,k 就是橫向的,而 i 就是縱向的 CurrUnit.un[r][i][k] 就是紀錄這個 4x4 的座標空間中 每個小方格是否有方塊的 掃完這 4x4 共 16 格的小方塊,發現皆可移動才是可移動的
引言:
    if((bx<0)||(bx>=MapXsize)||(by>=MapYsize))
bx==k x怎會<0 ?、bx>=MapXsize是左右移動嗎?
這一段是判斷左右移動沒錯 它的流程可能是這樣: 使用者按下向左鍵 or 向右鍵 此時,程式會先假設性地向左移 or 向右移 再呼叫 CheckUnit,檢查是不是真的能夠移動 不行的話,就傳完 v = 2(illegal move) 可以的話,就傳回 v = 0 才會真的去移動方塊 因為當方塊在最左邊的時候,x 會是 0 向左移,x 至少要 - 1 所以會 < -1 當然就要檢查 < 0 的情形了 同理,當方塊在最右邊的時候,x 會是 MapXsize - 1 往右移,至少要 1 所以會 >= MapXsize 在這二種情形,都是顯然不可移的,故傳回 v = 2
jammar
一般會員


發表:2
回覆:18
積分:4
註冊:2003-10-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-03-14 14:19:59 IP:210.59.xxx.xxx 未訂閱
說到俄羅斯方塊 小弟之前也是參考別人的俄羅斯方塊 回歸正題 這邊應該是不清楚為什麼 只移動一次卻要跑4X4的迴圈吧 程式中x為實際的位置 x000 0000 0011 0011 若以螢幕座標,左上角為(0,0) 右下角為(3,3) bx為運算方格是否重複時的臨時座標, 這邊需要判斷bx是否小於0 應該是方向控制函式只單純控制X內的數值而無判斷能否成立 所以x有可能被更改成-1囉 至於MapXsize 則是看一行有多少格子 此函數主要是用來判斷是否 貼圖會超過範圍或與其它的格子重複到
fantasy
一般會員


發表:10
回覆:9
積分:3
註冊:2003-11-27

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-03-14 16:04:44 IP:61.61.xxx.xxx 未訂閱
謝謝 wyndog 及jammar 幫我解說^^ 舉個倒子如下面這一個方塊倒T型的 0,0,0,0 0,0,2,0 0,2,2,2 0,0,0,0 CheckUnit(int x, int y, int r) x表示目前這一方塊所在的位置 y也是 若目前方塊位置(-2,3)的話 …… ->第一列的判斷沒有格子 bx=2 (-2) ->可以向左移動 bx=1 (-2) ->不可以向左移動 ……把所有的16格掃完 因為有一格 bx=1 (-2) -->所以整個方塊是不可以向左移動的 是這樣嗎??
wyndog
資深會員


發表:7
回覆:362
積分:348
註冊:2004-10-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-03-14 17:44:07 IP:60.248.xxx.xxx 未訂閱
引言: bx=1 (-2) ->不可以向左移動 因為有一格 bx=1 (-2) -->所以整個方塊是不可以向左移動的 是這樣嗎??
大致上,可以這麼說
系統時間:2017-12-12 20:19:42
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!