張佳豪 許向榮 安沛沛



摘? 要:隨著時代的進步,很多在以往風靡一時的經典游戲逐漸退出人們的視線并被人們慢慢淡忘,對這些消除類游戲的游戲特性進行整合創(chuàng)新,從而創(chuàng)作出新的游戲,并帶動整個消除類游戲的新熱潮。在原本的消除類游戲的主要特性中,對游戲消除的類型與個數進行創(chuàng)新,加入原本的三個相同元素進行消除的思路,采用人生的階段與游戲關卡一一對應,加入更多解密的難度,基于Unity3D引擎創(chuàng)作了一款新型的解謎燒腦三消類游戲:奮了個斗。
關鍵詞:三消類游戲;Unity3D;游戲開發(fā)
中圖分類號:TP311? ? ? ? 文獻標識碼:A? ? ? ? 文章編號:2096-4706(2023)05-0090-05
Design and Implement of“Finish a Struggle”Algorithm Based on Unity3D
ZHANG Jiahao, XU Xiangrong, AN Peipei
(School of Information Engineering, Zhengzhou University of Science and Technology,Zhengzhou? 450064, China)
Abstract: With the progress of the times, many classic games which were popular in the past gradually drop out of people's sight and are slowly forgotten by them. This paper integrates and innovates the game characteristics of these elimination games to create new games, and promotes the whole new craze of elimination games. In the main characteristics of original elimination games, it innovates the type and number of elimination in games, adds the thought of eliminating original three same elements, uses the stage of life with the game level for one to one correspondence, and adds more difficulty of decryption, based on Unity3D engine, creates a new three-elimination game with solving puzzles to exercise brain: Finish a Struggle.
Keywords: three-elimination game; Unity3D; game development
0? 引? 言
在科技的快速發(fā)展下,手機成為很普遍的產物。從青少年到老年人幾乎人手智能手機。因疫情原因,大大推動了游戲行業(yè)的發(fā)展[1]。隨著生活節(jié)奏的加快,游戲成為人們首選的休閑娛樂方式[2]。人們的生活水平隨著時代的發(fā)展不斷提高,對于物質的追求也逐漸變得不那么熱切,對于精神上的需求卻更加強烈,因此對于游戲這方面的關注便不斷增加,對于游戲的需求也越發(fā)強烈。
Unity是由丹麥Unity Technologies公司開發(fā)的綜合性多平臺的游戲開發(fā)工具。使用Unity可實現多平臺一次性開發(fā)且兼容性較好。Unity支持Android,Windows,Linux,Web Player,PC,IOS,BlackBerry,Windows Phone 8,Xbox等多個平臺發(fā)布[3,4]。作為現如今最為主流的游戲設計軟件,其強大之處不必多說,對整個游戲的創(chuàng)作與開發(fā)也為我們提供了莫大的支持。整個游戲體系的創(chuàng)建是基于傳統(tǒng)經典游戲的特色和原有游戲體系的結構想法上加以創(chuàng)新,創(chuàng)造出一個全新的游戲結構,將原本的消除類游戲加入新的創(chuàng)意,使其具有更加豐富的游戲趣味,適應現時代的時代游戲浪潮。
1? 項目簡介
此游戲主要基于Unity3D作為主要游戲開發(fā)平臺,C#等程序語言作為程序設計基礎設計出的一款解密燒腦類三消游戲,本文主要闡明其中的重要算法以及關鍵思路。以方塊作為整個游戲的游戲特征元素并以三消作為整個游戲的類型,玩家需要思考并解決的問題是通過選取、換位或配對,將原本看起來混亂、隨機排列的游戲元素進行調整,使三個相同的游戲元素進行匹配,最終達到消除的效果[5,6]。
2? 主要設計思路與關鍵算法
本項目主要的基本結構在于項目的基本設計的基礎上對項目的需要進行分類,將其分為:游戲分布設計、隨機分組設計以及其他功能設計,如圖1所示。這些結構都是整個項目結構的一部分,在下方將對這些結構分組進行說明講解。
2.1? 游戲分布設計
現有的為大眾所喜愛的游戲中,很多游戲創(chuàng)作者對于游戲的整個游戲設計界面是下了極大的心思的,研究玩家最為接受的審美,以此為基礎對整個游戲的功能布局以及游戲界面進行設計,使得游戲的界面設計更加貼合玩家習慣與審美,具有更良好的游戲體驗。在設計游戲的整體布局時,主要考慮到玩家對于游戲的認知和對游戲布局的感知是比較敏感的,需要在設計整體的分布時更加注重大眾的美感以及整體的協(xié)調性,因此在游戲創(chuàng)作中采用的是對稱性設計,將整個游戲的分布設計成多個矩陣疊加的情況,并按照對稱的性質將矩陣按照最為和諧的設計呈現在眼前,而這也是整個游戲的分布中最為主要的分布設計。
因為在最初設定的游戲類型是三消,也就是三元素消除的游戲類型,而要實現這一設計則是需要設計不同組的元素和相同的元素,而在其中在重要的是如何將相同元素進行選中、集合的操作。因為在最初的設想中是將各個元素以單獨的方式呈現,讓它能夠作為一個能夠被選中的、單獨的物體存在,所以實現這一想法的最優(yōu)解是將一個小的矩形作為元素的承載,使其成為元素的一個對應物體來代替元素作為被選中、集合的目標,也就是卡牌作為元素的對應物體,也是作為矩陣的最基礎的組成單位。在設計整體布局時,矩陣作為主要的設計模型成為整個游戲的主要結構,最初的設計方案是將多個矩陣根據一定的規(guī)律進行疊加處理,在用矩陣疊加的層數與疊加的規(guī)律對游戲難度進行控制的同時,也帶來更多設計其他模式的可能性,預想的矩形結構設計圖如圖2所示。
2.2? 隨機分組算法
三消類游戲最主要的特點是三元素消除,在卡牌的生成的設計是需要對卡牌數量進行一定的限制,整個面板里的卡牌數量需要是3的倍數,這樣才能避免出現游戲到最后出現只余下1個或2個卡牌的情況,在這一前提條件下,卡牌數量需要針對性地去限制其數量。卡牌數量分為三種情況:卡牌數量除去3后沒有余數、卡牌數量除去3后余1和卡牌數量除去3后余2,針對這三種情況,處理方法大致相同,即加一定的卡牌到其中使得卡牌的數量始終是3的倍數。
在確定卡牌的數量是3的倍數,避免出現多余卡牌不能消除的情況后,便是打亂卡牌的順序并在卡牌上貼上對應元素的貼圖。 在這一階段的主要目的是將所有的卡牌整個卡牌的貼圖順序打亂并對這些卡牌進行貼圖,其步驟是在統(tǒng)計所有卡牌的個數后,單獨建立一個列表TempGroup用于存儲卡牌的緩存數據,將所有panel中卡牌遍歷進入列表中,對卡牌進行打亂操作,在將列表的卡牌順序打亂后每三個卡牌貼上相同元素的貼圖,之后再把列表內的卡牌按照原先順序重新放回panel內,在此之后整個游戲內的卡牌便是一個較為無序的狀態(tài),也達成了原本的目的。
2.3? 相關技能設定
在技能設定方面主要是依據最為常用的牌類游戲中的想法:重新洗牌、撤回卡牌以及推出卡牌。這三項功能主要針對卡牌本身位置、所處的panel還有卡牌上的貼圖進行代碼設計,而且這幾項功能都是和卡牌所處的多項panel,卡牌在選中前后的位置以及隨機分組的算法有關。洗牌是對隨機分組算法的重新應用,但還要考慮各個pane中的卡牌數量以及剩余的還未消除的元素和在卡牌中的貼圖個數,在此基礎對卡牌的貼圖進行更改、交換來達到洗牌的效果,實現效果如圖3所示。
撤回卡牌則是對卡牌所處的位置以及所在panel的序列進行標記,然后在撤回進行時將卡牌放回原位,實現效果如圖4所示;推出卡牌則是建立一個新的panel來存儲pencilbox這一panel中最前面三個卡牌來實現中這一功能,如圖5所示。
2.4? 其他功能設計
最主要的結構設計結束之后便實現其他的必要實現功能,如遮擋算法、移除展示、生成位置等功能,這些功能是游戲中必要且必需的功能,主要用于卡牌的遮擋、卡牌的移除等方面,也是對游戲功能的完善。遮擋算法的設計是為避免上層卡牌在為消除時,下層卡牌就處于可選取的狀態(tài),從而導致原本需要消除上層卡牌才能解鎖下層卡牌的情況變成了在上層卡牌未消除的狀態(tài)下,下層卡牌就已經處于解鎖狀態(tài),這將破壞了整個游戲設立的游戲機制。想要是實現這一算法主要依據于字典Dictionary,利用字典來對卡牌進行查找與覆蓋,在此基礎上統(tǒng)計每個卡牌的類型、個數并判定卡牌之間的遮擋關系。移除展示算法的世界是為了實現選中卡牌的移動并在移動后取消原有的遮擋關系,解鎖在其下層的卡牌,并使得遮擋算法重新判定遮擋關系這一系列的功能,從另一方面實現卡牌的移動。生成位置算法則是為了panel面板的生成而設計出來的,因為游戲的設計因素需要panel面板不是一整個平面的平鋪,而是多個面板的重疊、覆蓋,這也就需要對面板的生成要有一定的把控,需要其出現在它該生成的位置,所以設定其生成的位置來把控面板的層級大小和覆蓋的面積。
3? 設計思路與關鍵算法的實現
3.1? 矩陣設計算法
矩陣在游戲中是作為整個游戲的基礎設計結構而存在的,也在一定程度上決定了整個游戲的難度,使得游戲的結構層次上有了更加廣闊的豐富性,帶給玩家更優(yōu)秀的游戲體驗。因而在對矩陣的設計中,更多的是需要對矩陣的多種變化,而要實現這些效果則是需要在程序中將其以代碼的方式來裁剪矩陣,使得矩陣的基本形狀能夠被限制,矩陣中卡牌的位置也需要重新設定,因程序代碼過于繁瑣,在此只以上下對稱算法為例,核心代碼如下:
int maxX = g.GetComponent
int maxY = g.GetComponent
for (int i = 0; i < (maxY+1)/2; i++)
{
for (int j = 0; j < maxX ; j++)
{
int r = UnityEngine.Random.Range(0, 2);
if (r == 0)
{
Destroy(g.GetComponent
if (i != (maxY - 1 - i))
{
Destroy(g.GetComponent
}
}
else
{
g.GetComponent
if (i != (maxY - 1 - i))
{
g.GetComponent
}
}
}
}
因為Unity3D本身的設計中渲染是需要一定時間的,而對于矩形的裁剪就需要在Unity3D本身的渲染完畢后,在使用相對應的代碼來實現相應的功能,也就是說在整個程序的渲染未完成的時候是不能對進行任何修改的,否則就會造成矩陣的錯誤,導致卡牌處于多重的疊加在同一位置上的BUG,具體的矩陣設計思路如圖6所示。
3.2? 隨機分組算法
在對卡牌的三種情況的相關算法處理中,三種情況的處理都是十分類似的,使用的思路也是相同的,都是通過遍歷卡牌的數量并除以3來對三種情況進行區(qū)分,而之后便是對各種情況的代碼設計。在此只羅列一種情況,如下:
if (n == 0)
{
return;
}
elseif (n == 2)
{
foreach (GameObject g in smallCardsPanesls)
{
if (g.GetComponent
{
g.GetComponent
break;
}
}
currentCardNumber += 1;
在卡牌數量的修正后,我們便可對卡牌進行打亂處理,然后進行貼圖來事的所有的卡牌的貼圖是混亂的,而不是井然有序。其主要的設計思路是創(chuàng)建一個list表將所有卡牌遍歷進入列表中,再使用打亂處理將卡牌的順序打亂,核心代碼如下:
List
();
foreach (var v in bigCardsPanels)
{
tempGroups.AddRange(v.GetComponent
}
foreach (var v in smallCardsPanesls)
{
tempGroups.AddRange(v.GetComponent
}
while (tempGroups.Count != 0)
{
int r = UnityEngine.Random.Range(0, tempGroups.Count);
currentCards.Add(tempGroups[r]);
tempGroups.RemoveAt(r);
}
在將卡牌在變后的列表中被打亂后,將每3個卡牌貼上3個相同的貼圖,在貼圖全部被貼圖后將卡牌送回其原本在panel中的位置,核心代碼如下:
foreach (var g in currentCards)
{
if (count % 3 == 0)
{
randomType = UnityEngine.Random.Range(0, cardTypes.Count);
count = 0;
}
g.GetComponent
g.GetComponent
count++;
}
3.3? 技能算法
在洗牌、推出卡牌、撤回三項最基礎的技能中, 洗牌是其中最復雜的代碼,其思路也是相對簡單的,但實現其的難度相比于推出卡牌的操作實現還是比較困難的。推出卡牌的操作實現是建立新的panel用于容納推出的卡牌,而只要將pencilbox中的卡牌選取前三個將其傳入新建的panel即可,撤回則是對卡牌之前所在位置進行標記,尋求其父親的存在并以此為撤回的標準。因此在此只對洗牌進行代碼實現進行說明,洗牌的核心代碼如下:
for (int i = 0; i < currentCards.Count / 2; i++)
{
Sprite tempSprite = currentCards[i].GetComponent
().cardTypeImage.sprite;
CardTypeEnum tempCardType = currentCards[i].GetComponent
currentCards[i].GetComponent
currentCards[i].GetComponent
[currentCards.Count - 1 - i].GetComponent
currentCards[currentCards.Count - 1 - i].GetComponent
currentCards[currentCards.Count - 1 - i].GetComponent
}
3.4? 其他功能性算法
該算法是整個項目中較為耗費思考的算法,其中要考慮到卡牌的整體堆砌、卡牌的數量、相鄰卡牌的距離、卡牌之間的聯(lián)系等方面,需要從多個方面來對遮蓋算法進行設計,方方面面都要考慮到,不然到調試運行的時候,bug和錯誤將會層出不窮,下面的算法是整個遮蓋算法最為主要的地方,也就是這一部分的核心算法,如下:
if (target.position.x + target.rect.xMax <= b.position.x + b.rect.xMin ||
target.position.x + target.rect.xMin >= b.position.x + b.rect.xMax ||
target.position.y + target.rect.yMax <= b.position.y + b.rect.yMin ||
target.position.y + target.rect.yMin >= b.position.y + b.rect.yMax
)
{
continue;
}
移除算法與移動算法不同,移動算法是位置的改變,而一處算法則是在尋找到這一卡牌后,將這一卡牌從其中所有卡牌中消除,其對應的各項關系并在移除后進行重新判定,并從字典中移除這一卡牌,更新其周圍卡牌的遮擋關系,核心代碼如下:
if (CoverToOthers.ContainsKey(g))
{
returnCardCovers = CoverToOthers[g];
foreach (var v in CoverToOthers[g])
{
v.GetComponent
if (v.GetComponent
{
v.GetComponent
v.GetComponent
}
}
}
CoverToOthers.Remove(g);//字典中移除
g.transform.parent.GetComponent
生成位置算法主要是針對于panel面板的生成,將panel面板在生成時不再是死板地一層層疊加到同一位置,而是多次變換位置,縮減面板大小來創(chuàng)造多樣的面板格式使得各個層面的面板都不再重復,核心代碼如下:
int nx = x + intervalX * borderX;
int ny = y + intervalY * borderY;
gameObject.GetComponent
new Vector2(2 * intervalX * rowNumber, 2 * intervalY * lineNumber);
currentRow = currentLine = 8 - lineNumber;
returnnew Vector3(nx, ny, 0);
4? 結? 論
在對整個游戲進行開發(fā)的過程中,我們發(fā)現很多之前并未發(fā)現的程序實現途徑以及Unity3D的一些特殊性質,當然也因為其中的出現的邏輯性錯誤和Unity3D的相關特性而出現很多卡殼,曾一度導致游戲開發(fā)進度陷入困局,但之后我們仍舊將這一項目開發(fā)成功。在游戲開發(fā)過程中對于游戲整體體系設計與整個游戲效果設計是采取最為簡便的方法實現最為復雜的情況,對游戲中多項難點以及錯誤多次糾正、修改甚至更改游戲原有設計以達到游戲能夠運行的程度。因此我們在完成原有的設計功能后,在這些基礎上,又對項目進行重新開發(fā),加入更多的元素,使得其具有更加豐富的層次性。
參考文獻:
[1] 史甜,鄭凱東.基于Unity3D彩虹消消樂小游戲設計 [J].信息技術與信息化,2021(8):140-142.
[2] 周雪薇.基于Unity3D的小學科學教育游戲的設計與開發(fā) [J].微型電腦應用,2021,37(1):44-46+51.
[3] 黃得懿,曾妮麗,余欣婷,等.基于Unity的三維游戲APP設計與實現 [J].電腦編程技巧與維護,2020(10):61-62+71.
[4] 吳可玉,莊建軍,徐琳玲.基于Unity 3D的虛擬消防與安全教育系統(tǒng) [J].實驗技術與管理,2020,37(12):237-240.
[5] 閆麗麗.激勵機制在消除類手機游戲中的應用研究 [J].藝術科技,2015,28(10):78.
[6] 葉現勇,許向榮,梁啟萌.基于Unity3D的漢字游戲的設計與實現 [J].現代信息科技,2022,6(5):22-25.
作者簡介:張佳豪(2001—),男,漢族,河南鄭州人,本科在讀,研究方向:數字媒體技術;許向榮(2000—),男,漢族,河南周口人,本科在讀,研究方向:數字媒體技術;安沛沛(2000—),男,漢族,河南平頂山人,本科在讀,研究方向:數字媒體技術。
收稿日期:2022-10-27