俄羅斯方塊 |
尚未結案
|
fantasy
一般會員 發表:10 回覆:9 積分:3 註冊:2003-11-27 發送簡訊給我 |
各位大哥,我想從別人給的程式碼學程式,看了俄羅斯方塊的程式碼遇到了藍色部分的問題
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 發送簡訊給我 |
|
fantasy
一般會員 發表:10 回覆:9 積分:3 註冊:2003-11-27 發送簡訊給我 |
|
wyndog
資深會員 發表:7 回覆:362 積分:348 註冊:2004-10-12 發送簡訊給我 |
首先,我沒看過完整的程式
僅就這片段程式碼來理解的話
引言:每個俄羅斯方塊,都是 4x4 的方塊 你看可以看到 i loop & k loop 都是跑 0~3(∴有四次) 顯然,k 就是橫向的,而 i 就是縱向的 CurrUnit.un[r][i][k] 就是紀錄這個 4x4 的座標空間中 每個小方格是否有方塊的 掃完這 4x4 共 16 格的小方塊,發現皆可移動才是可移動的bx = k x; 為什麼要用loop k 1, k 2 ,k 3 代表什麼? 引言:這一段是判斷左右移動沒錯 它的流程可能是這樣: 使用者按下向左鍵 or 向右鍵 此時,程式會先假設性地向左移 or 向右移 再呼叫 CheckUnit,檢查是不是真的能夠移動 不行的話,就傳完 v = 2(illegal move) 可以的話,就傳回 v = 0 才會真的去移動方塊 因為當方塊在最左邊的時候,x 會是 0 向左移,x 至少要 - 1 所以會 < -1 當然就要檢查 < 0 的情形了 同理,當方塊在最右邊的時候,x 會是 MapXsize - 1 往右移,至少要 1 所以會 >= MapXsize 在這二種情形,都是顯然不可移的,故傳回 v = 2if((bx<0)||(bx>=MapXsize)||(by>=MapYsize))bx==k x怎會<0 ?、bx>=MapXsize是左右移動嗎? |
jammar
一般會員 發表:2 回覆:18 積分:4 註冊:2003-10-26 發送簡訊給我 |
說到俄羅斯方塊 小弟之前也是參考別人的俄羅斯方塊 回歸正題
這邊應該是不清楚為什麼 只移動一次卻要跑4X4的迴圈吧 程式中x為實際的位置
x000
0000
0011
0011
若以螢幕座標,左上角為(0,0) 右下角為(3,3) bx為運算方格是否重複時的臨時座標,
這邊需要判斷bx是否小於0
應該是方向控制函式只單純控制X內的數值而無判斷能否成立 所以x有可能被更改成-1囉 至於MapXsize 則是看一行有多少格子
此函數主要是用來判斷是否 貼圖會超過範圍或與其它的格子重複到
|
fantasy
一般會員 發表:10 回覆:9 積分:3 註冊:2003-11-27 發送簡訊給我 |
謝謝 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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |