?? readme.txt
字號:
一點說明:
夢想寫出完美的程序是每個程序員一生的追求,也許我就是在這個追求的過程中吧。總體感覺搞笑俄羅斯方塊是個做得很爛的產品,因為其實我本人并不太喜歡玩游戲,對游戲的感覺也不如那些骨灰級玩家們好,更談不上做好它了。所以搞笑俄羅斯方塊枉叫搞笑俄羅斯方塊。據不完全的統計,這個程序竟然在網絡里被下載了將近一萬多份,向我來信索取源碼的朋友也有將250人。其中對我的幫助當然很大。在此謝謝大家。
這份代碼是經過重新整理了以后的,并且附加上這份說明,希望能夠對大家有所幫助。也許在以后的閱讀中您就會發現:這些程序真是做的爛,風格不好,方法不當,所以希望閱讀者能夠多扔雞蛋:)扔死為止(hehe) email:yousp@yeah.net。同時也希望這份開放的源代碼能夠繼續做下去,畢竟還是有那么多喜歡小游戲的朋友。
游晶
http://www.cxlife.com
2001年10月9日 凌晨 南昌大學
下邊是關于源代碼的說明:(感謝 Mu Gen 不斷的提問題,下邊是許多關于他的問題的回答)
(1) 我的俄羅斯方塊的具體原理是這樣的:(從源程序里貼了部分講解,用Delphi寫的)
//---------------------------------------------------------------------
type
TBlockCell=record <---- 表示每一個方快,其中包含兩種信息,一種是顏色信息,
Empty: Boolean; <---- 另外一種表示的是,該位置是空還是實。如:
Color: TColor;
end;
1 1 0 0 1 1 1 1
1 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 表示的是一個方快 0 0 0 0 表示的是一橫
當然這里顏色值我就沒有寫出來了,每一個位置都是一個 TBlockCell 類型的數組單元。
//---------------------------------------------------------------------
type
TBoxArray = Array [1..MLen,1..MLen] of TBlockCell; //單個方塊對應的數組
TMapData = Array [1..MapWid,1..MapHei] of TBlockCell; //當前記錄
前邊介紹的是方塊數組,而TMapData 表示的則是背景數組:
背景數組其實和 TBoxArray 是一樣的,只不過大小和功能有點不一樣。
TBoxArray 是動的,而 TMapData 是靜止的。TMapData中同樣也是每一個格子表示是否為空,
外加顏色信息。
開始的時候背景里完全為空:
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 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 0 1 1 x x 0 0 0
0 0 0 1 1 x x 0 0 0
0 0 0 x x x x 0 0 0
0 0 0 x x x x 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
( 1 表示的是方快數組里,不為空的,x 表示為空的 )
注意這個時候我還沒有改變 TMapData 即背景,我只是單純的判斷是否該方快數組位置以下的,
在背景數組里的值是否為 1 ,為 1 就表示不能下降了,下邊有物體擋住了。
如果為 1 如下:
0 0 0 1 1 x x 0 0 0
0 0 0 1 1 x x 0 0 0
0 0 0 1 x x x 0 0 0
0 0 0 x x x x 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
那么這個方快就被擋在原來的位置,把它寫到 TMapData 數組里就可以,然后開始一個新的循環。
寫完之后如下:
0 0 0 1 1 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 1 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
0 0 0 0 0 0 0 0 0 0
當然我這里講的很簡單,里邊有很多細節問題。最重要的是:
a 坐標變換 b 方快旋轉(矩陣旋轉變換)
c 最好把方快和背景分別寫成類(我沒有實現,當然我很想實現)
(2) 使用 CanGo 函數判斷是否可以向 x,y 位置移動
這個函數判斷是否可以將方快數組移動到背景數組的 X,Y 位置!
下邊直接在程序上解釋:
======= 2001-09-28 15:39:00 您在來信中寫道:=======
function CanGo(X,Y: Integer;B: TBoxArray): Boolean;
var
i,j: Integer;
Flag: Boolean;
begin
if (X<1) or (X>MapWid) or //判斷是否出了邊界,1 到 MapWid ……
(Y<1) or (Y>MapHei) then
begin
CanGo := false; //如果指定的 X,Y不在背景數組內,不可以移動到此位置
Exit;
end;
Flag := true;
for i := X to X+MLen-1 do //從背景數組的 X,Y位置開始判斷,是否方塊和背景同一位置有非空塊
for j := Y to Y+MLen-1 do
begin
// 如果 Map 的 [i,j] 位置不為空 并且 方塊數組的[i-X+1,j-Y+1] 位置不為空 那么不能將方快移動到這個位置
if (Map[i,j].Empty <>EmptyBlock{true}) and (B[i-X+1,j-Y+1].Empty <>EmptyBlock{=true}) then
Flag := false;
end;
CanGo := Flag;
end;
= = = = 0 0 0 0 0
b b b b 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 0 0 0 0 0
= = = = 表示當前方塊,如果要下降,
將當前的 X 不變 ,y + 1 做測試:
如當前 x=1 y=1 那么要下降的話就測試 x=1,y=2位置,如圖中的 b b b b
這個時候就可以發現,= = = = 和 b b b b 都不為空,其實就是要移動到的位置已經被占用了,
所以就被擋住了!
(3) 關于如何做方塊的旋轉
旋轉的時候,復制當前的方快數組到另外一個B數組,用該旋轉后的變換數組去和背景數組比較,
如果這個時候有沖突,我就不做旋轉了,否則就進行旋轉。
掃描數組的過程有兩個:
function GetWidth(B: TBoxArray): Integer;
function GetHeight(B: TBoxArray): Integer;
分別用來獲得一個方快的高度和寬度,因為4*4數組里,往往不是滿的如:
1 1 0 0
1 1 0 0
0 0 0 0
0 0 0 0 的寬度和高度都為2
還有一個 ScanEmptyLine 過程掃描整個背景數組,看有沒有添滿1的行,這樣的行可以消掉,然后
刷新屏幕,實現消行效果。
(4) 為什么獲取 5,6 號方塊高度和寬度時必須修正?
SetBoxArray(Box[5],1,'1000');
SetBoxArray(Box[5],2,'1100');
SetBoxArray(Box[5],3,'0100');
SetBoxArray(Box[5],4,'0000');
SetBoxArray(Box[6],1,'0100');
SetBoxArray(Box[6],2,'1100');
SetBoxArray(Box[6],3,'1000');
SetBoxArray(Box[6],4,'0000');
這兩個是 5號和6號方塊,你說這個樣子他們的高度和寬度分別為多少?
應該分別是: 3 和 2 吧。
但是我的GetHeight算法中是這樣處理:掃描每一行,看有多少個1 ,最多的1的個數為高度或者寬度,
但顯然這個方法對 5號和6號方塊不適用,所以必須修正。
怎樣修正代碼里就很明白了!
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -