發(fā)布時(shí)間:2023-11-27 00:30:05 瀏覽量:116次
在80后、90后的兒時(shí)記憶里,俄羅斯方塊是必備的消遣小游戲,它的玩法非常簡單基本大家都懂,但如何用編程語言開發(fā)一款兒時(shí)同款「俄羅斯方塊」,恐怕知道的同學(xué)就很少啦。
這周,班主任給大家?guī)硇抡n程《零基礎(chǔ)入門經(jīng)典小游戲開發(fā)---俄羅斯方塊》課程,讓同學(xué)們可以在枯燥的正統(tǒng)編程學(xué)習(xí)之余,找到些兒時(shí)的樂趣,換個(gè)方式學(xué)習(xí)編程。
俄羅斯方塊游戲中的格子一般是10列20行(10*20),我們稱之為世界地圖。
一般都是這種豎屏的界面
10*20的空間是用來盛放方塊的,當(dāng)方塊落定之后位置便不能再改變。這個(gè)時(shí)候它會被保存到地圖的狀態(tài)中,我們給地圖狀態(tài)設(shè)計(jì)一個(gè)二維的數(shù)組。
方塊有7種樣式組成,最大的長寬是4個(gè)方格,為了在邏輯上比較好的處理所有類型的方塊,我們構(gòu)建了一個(gè)4x4的邏輯區(qū)域,用來統(tǒng)一描述所有類型的方塊,包括顯示、旋轉(zhuǎn)等。這一區(qū)域就成為了它自身的空間整體,而方塊被放到世界地圖中時(shí),也是以這樣的整體加入進(jìn)去的。
我們給方塊定義了四種屬性,分別是方向、顏色、種類以及在世界地圖中的坐標(biāo)。
方塊可以做旋轉(zhuǎn),每經(jīng)過四次旋轉(zhuǎn)便會回到原始的狀態(tài),分別用0123來表示方塊的四個(gè)方向,新產(chǎn)生的方塊設(shè)定的是默認(rèn)方向。
下圖中的數(shù)值代表它在自己的空間內(nèi),哪些格子是有方塊的,哪些是沒有的。這是一個(gè)二進(jìn)制的16位的顯示掩碼,0x4444代表的就是第一行第三列,第二行的第三列,第三行的第三列和第四行的第三列。
旋轉(zhuǎn)掩碼是用一個(gè)16bit的數(shù)據(jù)表示的,每個(gè)旋轉(zhuǎn)掩碼后面跟著的是一個(gè)16bit的顯示掩碼。
我們以S型方塊作為參考來介紹,方向?yàn)榱愕臅r(shí)候它占據(jù)第一行的第二列第三列,第二行的第四列第三列,當(dāng)它做一次旋轉(zhuǎn),方向由0到1這個(gè)過程中,它的旋轉(zhuǎn)是會掃過這些位置,變成方向1的狀態(tài)。在旋轉(zhuǎn)過程中,如果它掃過的位置有其他方塊占住,那么它便不能旋轉(zhuǎn)。
還有,如果方塊到達(dá)邊緣的時(shí)候,旋轉(zhuǎn)時(shí)超出了世界地圖的范圍,也是失敗的,會繼續(xù)維持現(xiàn)在這種狀態(tài)。
旋轉(zhuǎn)掩碼和顯示掩碼組合在一起,旋轉(zhuǎn)掩碼的意義是,當(dāng)前方向值下的方塊,旋轉(zhuǎn)到下一個(gè)方向值的時(shí)候,需要參考的障礙區(qū)域有哪些,以上就是位置掩碼以及旋轉(zhuǎn)掩碼的介紹。
接下來我們來看下游戲中的主要邏輯判斷。
移動邏輯
游戲中產(chǎn)生的方塊,在產(chǎn)生之后,做周期性的下落運(yùn)動。
同一時(shí)刻地圖中只會有一個(gè)方塊處于活動狀態(tài),可以在地圖中做移動、旋轉(zhuǎn)等操作,方塊每次自由下落都會做一個(gè)下落判斷,判斷是否已經(jīng)觸底。
觸底指的是,方塊不能再往下移動,導(dǎo)致方塊不能再往下移動的原因有2種,第一種是方塊的下邊緣已經(jīng)在世界地圖的邊緣;第二種是方塊再往下更新的位置,被其他已經(jīng)落定的方塊占據(jù)了。
如圖上代碼所示,方塊移動的位置被其他方塊所占據(jù)
方塊觸底之后,狀態(tài)就由活動狀態(tài)切換到了落定狀態(tài)。此時(shí)方塊的顯示掩碼中標(biāo)注的所有可顯示的塊,都將會寫入地圖的狀態(tài)中,以用來表明,這些塊已經(jīng)被占據(jù)了,寫入地圖狀態(tài)中的值有兩項(xiàng)屬性:哪些塊被占據(jù)了,已經(jīng)被占據(jù)的塊的顏色值。
假定方塊當(dāng)前的坐標(biāo)是(x1,y2),從方塊的當(dāng)前移動方向中,我們可以得到方塊等待判斷是否可以移動過去的更新坐標(biāo)(x2, y2)。
例如,方塊向左移動,則:x2 = x1 - 1, y2 = y1;方塊向右移動,則:x2 = x1 + 1, y2 =y1;方塊向下移動,則:x2 = x1, y2 = y1 + 1;
根據(jù)方塊的類型以及當(dāng)前的方向值,從掩碼表中可以拿到方塊當(dāng)前的顯示掩碼,方塊是否能放置到新位置,只需要判斷顯示掩碼中標(biāo)明需要顯示出來的位置,是否已經(jīng)有其他方塊占據(jù),掩碼中所有需要顯示出來的位置,只要有一個(gè)位置被其他方塊占據(jù),本次移動判斷失敗,方塊維持原有坐標(biāo)
旋轉(zhuǎn)邏輯
能夠旋轉(zhuǎn)涉及到一個(gè)方塊是否改變它的方向,x、y是方塊在世界地圖中的坐標(biāo),block是它的狀態(tài)值。
我們?nèi)∷姆N類、方向這兩個(gè)屬性,在4×4的空間里,計(jì)算出每一格對應(yīng)到世界中的坐標(biāo)。
“isBoxRotateMaskEmpty”這個(gè)代表什么意思呢?這是旋轉(zhuǎn)掩碼在旋轉(zhuǎn)過程中要參照的點(diǎn),方塊旋轉(zhuǎn)掃過的點(diǎn),以及它落定之后的這幾個(gè)點(diǎn),這些點(diǎn)就是它的旋轉(zhuǎn)掩碼。
轉(zhuǎn)寫掩碼值用一個(gè)七行四列的數(shù)組來保存,分別對應(yīng)七種方塊樣式以及四個(gè)方向?qū)?yīng)的值。它的高16位是旋轉(zhuǎn)掩碼,低16位是顯示掩碼。
方塊的掩碼表
方塊是否能夠旋轉(zhuǎn),先要看它的旋轉(zhuǎn)掩碼里面是為空,掩碼為空則可以旋轉(zhuǎn),旋轉(zhuǎn)完之后,需要判斷方塊新的坐標(biāo)是否還在世界地圖里,如果它超出邊緣超出底線,那肯定是旋轉(zhuǎn)不了的。
還有就是判斷當(dāng)前格子在世界地圖中是否被其他的方塊給占了,如果被占了的話,也是旋轉(zhuǎn)不了的,這就是基本的旋轉(zhuǎn)判定邏輯。
得分邏輯
方塊落定之后,根據(jù)方塊落定是的邏輯坐標(biāo),從上往下依次遍歷地圖中的4行狀態(tài)值,當(dāng)某一行的所有地圖塊的狀態(tài)都是被占據(jù)狀態(tài),該行被判定為得分行,得分行會被消掉,當(dāng)消完所有的得分行之后,得分行上方的所有未得分行,依次向下平移。
我們控制游戲難度的時(shí)候也是以這個(gè)為參考,玩家獲得的分?jǐn)?shù)越多,游戲難度越大。
我們可以通過修改方塊出現(xiàn)的時(shí)間間隔,以及下落速度,來控制整個(gè)游戲的難度。
當(dāng)玩家拿的分?jǐn)?shù)越多,每消除一行的等級就會加一,分?jǐn)?shù)是遞增100,方塊下降的速度是通過5的取模方式從1秒里面去扣,最小值是0.6秒。
如果某一行格子只要有一個(gè)空著的話,消除便失敗。某一行的方塊全部被消掉之后,上面的方塊會向下平移,對應(yīng)的行數(shù)需要刷新。
這便是關(guān)于得分的判斷邏輯 。
最后再來看下整個(gè)游戲玩的流程圖。
游戲的核心邏輯是時(shí)間間隔,玩家點(diǎn)開始之后,每隔一段時(shí)間會調(diào)度一次,如果游戲沒有結(jié)束,判斷當(dāng)前是屬于暫停狀態(tài),沒有說暫停的話,就做一個(gè)moveBlock。
當(dāng)然,moveBlock有可能是玩家點(diǎn)了操縱的方向鍵,如果沒點(diǎn)的話直接就返回了。緊接著處理方塊的下落過程,判斷它落定的時(shí)候是否結(jié)束了。
沒有結(jié)束暫停的話,就處理移動,移動處理完之后,再去處理下落,如果剛好時(shí)間間隔已經(jīng)到了,那它就會往下落一次,往下落的話有可能成功,也有可能失敗。
判斷結(jié)束后會出現(xiàn)游戲結(jié)束界面,可以選擇是否重來一次,如果再來一次便會做一次重置。
這里需要做一個(gè)關(guān)于世界地圖的補(bǔ)充說明,這里補(bǔ)充了一個(gè)地圖的坐標(biāo)系,游戲地圖的坐標(biāo)系X軸沿著水平方向向右,Y軸是沿著垂直方向向下增長,坐標(biāo)系的原點(diǎn)是在左上角。
方塊在邏輯空間中的坐標(biāo),是以左上角為參考點(diǎn)的,方塊的坐標(biāo)隨著而改變。
熱門資訊
探討游戲引擎的文章,介紹了10款游戲引擎及其代表作品,涵蓋了RAGE Engine、Naughty Dog Game Engine、The Dead Engine、Cry Engine、Avalanche Engine、Anvil Engine、IW Engine、Frostbite Engine、Creation引擎、Unreal Engine等引擎。借此分析引出了游戲設(shè)計(jì)領(lǐng)域和數(shù)字藝術(shù)教育的重要性,歡迎點(diǎn)擊咨詢報(bào)名。
2. 手機(jī)游戲如何開發(fā)(如何制作傳奇手游,都需要準(zhǔn)備些什么?)
?如何制作傳奇手游,都需要準(zhǔn)備些什么?提到傳奇手游相信大家都不陌生,他是許多80、90后的回憶;從起初的端游到現(xiàn)在的手游,說明時(shí)代在進(jìn)步游戲在更新,更趨于方便化移動化。而如果我們想要制作一款傳奇手游的
3. B站視頻剪輯軟件「必剪」:免費(fèi)、炫酷特效,小白必備工具
B站視頻剪輯軟件「必剪」,完全免費(fèi)、一鍵制作炫酷特效,適合新手小白??靵碓囋嚕?/span>
4. Steam值得入手的武俠游戲盤點(diǎn),各具特色的快意江湖
游戲中玩家將面臨武俠人生的掙扎抉擇,戰(zhàn)或降?殺或放?每個(gè)抉定都將觸發(fā)更多愛恨糾葛的精彩奇遇。《天命奇御》具有多線劇情多結(jié)局,不限主線發(fā)展,高自由...
5. Bigtime加密游戲經(jīng)濟(jì)體系揭秘,不同玩家角色的經(jīng)濟(jì)活動
Bigtime加密游戲經(jīng)濟(jì)模型分析,探討游戲經(jīng)濟(jì)特點(diǎn),幫助玩家更全面了解這款GameFi產(chǎn)品。
6. 3D動漫建模全過程,不是一般人能學(xué)的會的,會的多不是人?
步驟01:面部,頸部,身體在一起這次我不準(zhǔn)備設(shè)計(jì)圖片,我從雕刻進(jìn)入。這一次,它將是一種純粹關(guān)注建模而非整體繪畫的形式。像往常一樣,我從Sphere創(chuàng)建它...
7. 3D動畫軟件你知道幾個(gè)?3ds Max、Blender、Maya、Houdini大比拼
當(dāng)提到3D動畫軟件或動畫工具時(shí),指的是數(shù)字內(nèi)容創(chuàng)建工具。它是用于造型、建模以及繪制3D美術(shù)動畫的軟件程序。但是,在3D動畫軟件中還包含了其他類型的...
8. 3D打印技巧揭秘!Cura設(shè)置讓你的模型更堅(jiān)固
想讓你的3D打印模型更堅(jiān)固?不妨嘗試一下Cura參數(shù)設(shè)置和設(shè)計(jì)技巧,讓你輕松掌握!
?三昧動漫對于著名ARPG游戲《巫師》系列,最近CD Projekt 的高層回應(yīng)并不會推出《巫師4》。因?yàn)椤段讕煛废盗性诓邉澋臅r(shí)候一直定位在“三部曲”的故事框架,所以在游戲的出品上不可能出現(xiàn)《巫師4》
10. 虛幻引擎5節(jié)省存儲空間用這招!緩存的清理與設(shè)置
眾所周知,虛幻引擎5(下面簡稱UE5)特別占用存儲空間,僅一個(gè)版本安裝好的文件就有60G,這還不包括我們在使用時(shí)保存的工程文件和隨之產(chǎn)生的緩存文件。而...
最新文章
同學(xué)您好!