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