孟蕓+朱肖安+羅劉敏+徐音
摘 要 介紹利用C語言開發(fā)俄羅斯方塊游戲的設計和實現(xiàn)方法,對于編寫類似的游戲程序具有指導和借鑒作用。
關鍵詞 C;俄羅斯方塊
中圖分類號:TP311 文獻標識碼:A 文章編號:1671-7597(2014)23-0019-02
俄羅斯方塊游戲是一款家喻戶曉、風靡世界、經(jīng)久不衰的游戲,本文將采用C語言設計開發(fā)俄羅斯方塊游戲,設計工具采用VC++6.0。
1 設計思想
1)圖形的設計。
俄羅斯方塊中有7種形狀的方塊,由于方塊有旋轉(zhuǎn)變化的需求,所以需要用到三維數(shù)組解決,第一維表示旋轉(zhuǎn)變化形狀的個數(shù)。
在俄羅斯方塊設計中,需要定義游戲的邊界,定義一個地圖二維數(shù)組map[y][x],在數(shù)組中值的變化會有相對應結(jié)果。從這個二維數(shù)組中可以看出左邊邊界是map[0][x]—map[max(y)][x],右邊邊界是map[0][x]—map[max(y)][x]。
2)控制函數(shù)的設計。
首先需要考慮控制的功能有移動功能、加速功能、形狀變化功能、暫停功能、退出功能。如圖1用例圖所示。
3)關鍵技術。
在功能確定之后,就要把其轉(zhuǎn)化為算法,例如:方塊如何下落,如何判斷方塊是否出界,方塊下落到何時為止,下落中不可以和之前方塊重疊,如何讓方塊落到之前下落的方塊上停下,方塊平移如何實現(xiàn),方塊旋轉(zhuǎn)如何實現(xiàn),旋轉(zhuǎn)中空間問題,這些都構(gòu)成了俄羅斯方塊的關鍵技術。
①方塊下落。
方塊下落是很容易做到的,但是在變化及下落過程中其他特性,例如在移動過程中不能超過邊界、不能和已經(jīng)存在的方塊重疊、縫隙填補這些都是要考慮的,不能把圖形看成一個個孤立的方塊構(gòu)成,而應看成一個整體,所以圖形的組要使用結(jié)構(gòu)體實現(xiàn)。結(jié)構(gòu)體定義如下:
結(jié)構(gòu)體中有三個成員,其中x,y代表坐標,shape代表圖形的基本信息。所謂圖形基本信息就是在圖形庫里提取出來的圖形信息,同時也就明確了所提取出來信息的形狀、位置。圖形的位置信息需要找一個參考點也就是基準點,所有的圖形參考點是相同的,由于圖形庫中的圖形采用的3*3矩陣存儲,所以選擇中間點為參考點。假設結(jié)構(gòu)體變量為firstShape[n][i][j],則參考點確定為firstShape[n][1][1],其中這個點的二維坐標x=firstShape[n][1][1].x,y=firstShape[n][1][1].y則其他位置的信息如表1所示。
當firstShape[n][1][1].x以及firstShape[n][1][1].y的值確定了,即參考點的坐標位置確定了,其他點的位置坐標也就確定了。在改變一個形狀的位置只需要把參考點的坐標確定了,用循環(huán)把四周的點位置信息記錄賦值到對應的結(jié)構(gòu)體數(shù)組中。
用循環(huán)判斷,判斷出相應的形狀。如果判斷firstShape[n][i][j].shape的值為1,則gotoxy(firstShape[n][i][j].x,firstShape[n][i][j].y),并打印出相應的形狀,在移動過程中,位置是時刻發(fā)生變化的,而形狀是不變的。當需要左右移動時,參考點的位置信息作出相應更改,但是當旋轉(zhuǎn)圖形時,參考點的位置信息以及形狀都會作出改變,當方塊移動過程中,在相應位置信息打印出圖形,這就實現(xiàn)了方塊的移動。
②方塊出界判斷。
解決方塊邊界問題,就需要搞清兩個問題。第一,左右邊界的x值必須和初始方塊位置的x保持一致;第二,防止過界及方塊不能和之前落下來的方塊重合,也就是說當你向左邊移動方塊,可是左邊是邊界或者是上一個落下的形狀,這時方塊就不能向左移動。
由于在水平方向上設置一個單位的長度為2個像素,所以方塊在初始位置的x坐標為單數(shù),則方塊只能在單身上移動,反之只能在雙數(shù)上移動。當方塊落下后相應位置把map[i][j]的值賦予2,這樣一個下落完畢的方塊左右邊也相當于一個小邊界,當位置信息確認時,判斷四周的位置信息,地圖的相應位置是否為2,如果是,則說明該點已經(jīng)在邊界上了,需要做出相應的操作了,如果此時是在左邊界上,玩家繼續(xù)按向左移動說明方塊左邊過邊界了,需要重新調(diào)整位置信息,即x=x+L,firstShape[n][1][1].x=x;當參考點的位置信息改變后,則四周的位置信息也要做出相應修改,這樣就解決了邊界問題,同時也解決了方塊重疊問題。
③消除重影。
俄羅斯方塊在移動過程中會發(fā)生重影現(xiàn)象,重影現(xiàn)象生成是由于顯示屏余輝效應,消除重影技術就是先把原來的形狀擦除,然后再打印出新的圖形或者延長圖形顯示間隔時間,本次俄羅斯方塊采用前者進行重影消除技術。
④下落終點判斷。
俄羅斯方塊還存在填補凹槽問題,在存儲圖形信息是以數(shù)組的形式保存的,以利于對每一個數(shù)組元素進行判斷。
俄羅斯方塊下落過程中何時到達終點,首先根據(jù)參考點以及參考點周圍的位置信息做出判斷,在判斷時當map中存儲的值為1說明該位置有圖像塊,繼續(xù)判斷該位置下面的map值是否為2,如果是,則意味著到達邊界,即刻結(jié)束該方塊的下落。方塊下落完成,把相應的map值進行修改。如圖2下落終點判斷流程圖所示。
⑤方塊變換。
圖形變換有兩種方式,一種是圖形不動,坐標系變動,稱之為坐標系模式變換;另一種是坐標系不動,圖形改變,稱之為圖形模式變換。方塊變換采用的是后者,旋轉(zhuǎn)變換就是基本幾何變換形式之一,在算法中需要用到圖形庫中對圖形進行存儲過程中的第一維數(shù)字,它代表該旋轉(zhuǎn)后形狀的個數(shù),在設計過程中,空格鍵控制旋轉(zhuǎn)方法,圖形的旋轉(zhuǎn)形狀采用循環(huán)方式進行,同時對參考點做出修改,當圖形下落完畢,新的圖形產(chǎn)生把控制圖形變化的值設為0。
方塊旋轉(zhuǎn)空間問題也是需要解決的一個關鍵問題,當方塊一邊或者兩邊有邊界,方塊下落時由于本身形狀問題,導致在旋轉(zhuǎn)變換過程中產(chǎn)生出界現(xiàn)象,又如當該方塊一旦落入到狹小空間中,由于沒有足夠空間,形狀旋轉(zhuǎn)就無法進行,需要在旋轉(zhuǎn)之前進行判斷操作,當確定好參考點后,對周圍的圖形信息賦予相應信息,判斷map中相對應的信息是否等于2,如果等于2,則說明該列有邊界,沒有足夠空間進行形狀旋轉(zhuǎn)。endprint
⑥消行的操作。
消行操作可以一次消除一行,或者消除多行,消除多行和消除單行的原理一樣,首先要搞清楚地圖數(shù)組即map中左右邊界之內(nèi)的可以裝下幾個圖形。這個計算為右邊邊界的橫軸坐標減去左邊邊界橫軸坐標,然后除于2,其最后的值為n。在地圖信息map中倒數(shù)第二行開始向前一行一行的判斷,若有一行中地圖信息的值等于2的個數(shù)一共有n個,則說明該行已經(jīng)全部裝滿圖形,可以把改行消去,在算法中,當這一行的地圖信息值等于2的有n個時,就要跳出循環(huán),并記下這個行數(shù),將該行的值替換成后一行的值,這樣循環(huán)到行數(shù)為1。
⑦暫停以及死亡的操作。
在游戲設計過程中,要考慮玩家的需求,所以暫停設置是非常有必要的。首先設置一個變量的值為0,如果按下暫停鍵則讓這個變量加1,再按一下暫停鍵后此值繼續(xù)加1,判斷該變量如果能被2除取余為0,則執(zhí)行代碼,意味暫停結(jié)束,否則不會執(zhí)行代碼。
正在下落的方塊的參考位置正是起始位置代表未有空間讓方塊下落,說明游戲結(jié)束,在此過程中要時時刻刻判斷地圖信息中的第一行若有一個值為2,則代表游戲結(jié)束,在結(jié)束時候,會有一個提示信息,即提示玩家是否重新開始新游戲,按Y為重新開始,按N則為結(jié)束游戲。在實現(xiàn)過程中利用getch()方法接受按鍵信息并判斷到底按下了哪個鍵。
⑧新的方塊顯示技術。
這個問題的解決首想的是要從圖形庫提出來兩個圖像,首先以firstShape[n][i][j]表示第一個提出來的圖像,twoShape[n][i][j]表示第二個提出來的圖像,以showShape[n][i][j]為真實下落的的圖像。第一次先提出來一個圖像firstShape[n][i][j],把該圖像的圖案信息全部賦值給showShape[n][i][j],showShape[n][i][j]表示的圖像下落,然后再調(diào)用圖形庫,這時twoShape[n][i][j]為第二個圖形信息,讓其打印出來顯示下次要下落的圖形,等到第一個圖形下落完畢后再把第二個圖形twoShape[n][i][j]的圖像信息賦給showShape[n][i][j],再讓showShape[n][i][j]表示的圖像下落,這時再從圖像庫中提出一個圖像firstShape[n][i][j],并打印出來,然后就這樣循環(huán)下去,在提出來的圖像會用一個相應的返回值,即該圖像變化形狀的個數(shù)。
2 俄羅斯方塊的實現(xiàn)
實驗測試與結(jié)果,如圖所示,可以通過鍵盤進行操作,完成俄羅斯方塊基本玩法,當按鍵盤上的a和d代表方塊左右移動,按s鍵代表快速下降,按空格代表變換形狀,按enter鍵代表暫停,按esc代表退出游戲。如圖3所示。
3 結(jié)束語
本文以俄羅斯方塊游戲的程序編寫為例,分析了設計思路,采用算法把游戲編程中功能問題轉(zhuǎn)化為計算問題,為利用C開發(fā)游戲的編寫者們提供了借鑒作用。
參考文獻
[1]王文舉.C#語言開發(fā)俄羅斯方塊游戲[J].電腦編程與維護,2013(3).
[2]于龍海,羅辰杰,王曉萍,等.俄羅斯方塊的結(jié)構(gòu)化匯編語言程序設計[J].單片機與嵌入式系統(tǒng)應用,2012(2).
[3]任傳成,孟蕓,等.基于UML的系統(tǒng)需求分析方法及其應用[J].德州學院學報,2004(6).endprint
⑥消行的操作。
消行操作可以一次消除一行,或者消除多行,消除多行和消除單行的原理一樣,首先要搞清楚地圖數(shù)組即map中左右邊界之內(nèi)的可以裝下幾個圖形。這個計算為右邊邊界的橫軸坐標減去左邊邊界橫軸坐標,然后除于2,其最后的值為n。在地圖信息map中倒數(shù)第二行開始向前一行一行的判斷,若有一行中地圖信息的值等于2的個數(shù)一共有n個,則說明該行已經(jīng)全部裝滿圖形,可以把改行消去,在算法中,當這一行的地圖信息值等于2的有n個時,就要跳出循環(huán),并記下這個行數(shù),將該行的值替換成后一行的值,這樣循環(huán)到行數(shù)為1。
⑦暫停以及死亡的操作。
在游戲設計過程中,要考慮玩家的需求,所以暫停設置是非常有必要的。首先設置一個變量的值為0,如果按下暫停鍵則讓這個變量加1,再按一下暫停鍵后此值繼續(xù)加1,判斷該變量如果能被2除取余為0,則執(zhí)行代碼,意味暫停結(jié)束,否則不會執(zhí)行代碼。
正在下落的方塊的參考位置正是起始位置代表未有空間讓方塊下落,說明游戲結(jié)束,在此過程中要時時刻刻判斷地圖信息中的第一行若有一個值為2,則代表游戲結(jié)束,在結(jié)束時候,會有一個提示信息,即提示玩家是否重新開始新游戲,按Y為重新開始,按N則為結(jié)束游戲。在實現(xiàn)過程中利用getch()方法接受按鍵信息并判斷到底按下了哪個鍵。
⑧新的方塊顯示技術。
這個問題的解決首想的是要從圖形庫提出來兩個圖像,首先以firstShape[n][i][j]表示第一個提出來的圖像,twoShape[n][i][j]表示第二個提出來的圖像,以showShape[n][i][j]為真實下落的的圖像。第一次先提出來一個圖像firstShape[n][i][j],把該圖像的圖案信息全部賦值給showShape[n][i][j],showShape[n][i][j]表示的圖像下落,然后再調(diào)用圖形庫,這時twoShape[n][i][j]為第二個圖形信息,讓其打印出來顯示下次要下落的圖形,等到第一個圖形下落完畢后再把第二個圖形twoShape[n][i][j]的圖像信息賦給showShape[n][i][j],再讓showShape[n][i][j]表示的圖像下落,這時再從圖像庫中提出一個圖像firstShape[n][i][j],并打印出來,然后就這樣循環(huán)下去,在提出來的圖像會用一個相應的返回值,即該圖像變化形狀的個數(shù)。
2 俄羅斯方塊的實現(xiàn)
實驗測試與結(jié)果,如圖所示,可以通過鍵盤進行操作,完成俄羅斯方塊基本玩法,當按鍵盤上的a和d代表方塊左右移動,按s鍵代表快速下降,按空格代表變換形狀,按enter鍵代表暫停,按esc代表退出游戲。如圖3所示。
3 結(jié)束語
本文以俄羅斯方塊游戲的程序編寫為例,分析了設計思路,采用算法把游戲編程中功能問題轉(zhuǎn)化為計算問題,為利用C開發(fā)游戲的編寫者們提供了借鑒作用。
參考文獻
[1]王文舉.C#語言開發(fā)俄羅斯方塊游戲[J].電腦編程與維護,2013(3).
[2]于龍海,羅辰杰,王曉萍,等.俄羅斯方塊的結(jié)構(gòu)化匯編語言程序設計[J].單片機與嵌入式系統(tǒng)應用,2012(2).
[3]任傳成,孟蕓,等.基于UML的系統(tǒng)需求分析方法及其應用[J].德州學院學報,2004(6).endprint
⑥消行的操作。
消行操作可以一次消除一行,或者消除多行,消除多行和消除單行的原理一樣,首先要搞清楚地圖數(shù)組即map中左右邊界之內(nèi)的可以裝下幾個圖形。這個計算為右邊邊界的橫軸坐標減去左邊邊界橫軸坐標,然后除于2,其最后的值為n。在地圖信息map中倒數(shù)第二行開始向前一行一行的判斷,若有一行中地圖信息的值等于2的個數(shù)一共有n個,則說明該行已經(jīng)全部裝滿圖形,可以把改行消去,在算法中,當這一行的地圖信息值等于2的有n個時,就要跳出循環(huán),并記下這個行數(shù),將該行的值替換成后一行的值,這樣循環(huán)到行數(shù)為1。
⑦暫停以及死亡的操作。
在游戲設計過程中,要考慮玩家的需求,所以暫停設置是非常有必要的。首先設置一個變量的值為0,如果按下暫停鍵則讓這個變量加1,再按一下暫停鍵后此值繼續(xù)加1,判斷該變量如果能被2除取余為0,則執(zhí)行代碼,意味暫停結(jié)束,否則不會執(zhí)行代碼。
正在下落的方塊的參考位置正是起始位置代表未有空間讓方塊下落,說明游戲結(jié)束,在此過程中要時時刻刻判斷地圖信息中的第一行若有一個值為2,則代表游戲結(jié)束,在結(jié)束時候,會有一個提示信息,即提示玩家是否重新開始新游戲,按Y為重新開始,按N則為結(jié)束游戲。在實現(xiàn)過程中利用getch()方法接受按鍵信息并判斷到底按下了哪個鍵。
⑧新的方塊顯示技術。
這個問題的解決首想的是要從圖形庫提出來兩個圖像,首先以firstShape[n][i][j]表示第一個提出來的圖像,twoShape[n][i][j]表示第二個提出來的圖像,以showShape[n][i][j]為真實下落的的圖像。第一次先提出來一個圖像firstShape[n][i][j],把該圖像的圖案信息全部賦值給showShape[n][i][j],showShape[n][i][j]表示的圖像下落,然后再調(diào)用圖形庫,這時twoShape[n][i][j]為第二個圖形信息,讓其打印出來顯示下次要下落的圖形,等到第一個圖形下落完畢后再把第二個圖形twoShape[n][i][j]的圖像信息賦給showShape[n][i][j],再讓showShape[n][i][j]表示的圖像下落,這時再從圖像庫中提出一個圖像firstShape[n][i][j],并打印出來,然后就這樣循環(huán)下去,在提出來的圖像會用一個相應的返回值,即該圖像變化形狀的個數(shù)。
2 俄羅斯方塊的實現(xiàn)
實驗測試與結(jié)果,如圖所示,可以通過鍵盤進行操作,完成俄羅斯方塊基本玩法,當按鍵盤上的a和d代表方塊左右移動,按s鍵代表快速下降,按空格代表變換形狀,按enter鍵代表暫停,按esc代表退出游戲。如圖3所示。
3 結(jié)束語
本文以俄羅斯方塊游戲的程序編寫為例,分析了設計思路,采用算法把游戲編程中功能問題轉(zhuǎn)化為計算問題,為利用C開發(fā)游戲的編寫者們提供了借鑒作用。
參考文獻
[1]王文舉.C#語言開發(fā)俄羅斯方塊游戲[J].電腦編程與維護,2013(3).
[2]于龍海,羅辰杰,王曉萍,等.俄羅斯方塊的結(jié)構(gòu)化匯編語言程序設計[J].單片機與嵌入式系統(tǒng)應用,2012(2).
[3]任傳成,孟蕓,等.基于UML的系統(tǒng)需求分析方法及其應用[J].德州學院學報,2004(6).endprint