999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于Unity3D的“奮了個斗”算法設計與實現

2023-06-22 13:47:17張佳豪許向榮安沛沛
現代信息科技 2023年5期

張佳豪 許向榮 安沛沛

摘? 要:隨著時代的進步,很多在以往風靡一時的經典游戲逐漸退出人們的視線并被人們慢慢淡忘,對這些消除類游戲的游戲特性進行整合創(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().cardArrays.GetLength(0);

int maxY = g.GetComponent().cardArrays.GetLength(1);

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().cardArrays[i, j]);

if (i != (maxY - 1 - i))

{

Destroy(g.GetComponent().cardArrays[maxY - 1 - i, j]);

}

}

else

{

g.GetComponent().currentCards.Add(g.GetComponent().cardArrays[i, j]);

if (i != (maxY - 1 - i))

{

g.GetComponent().currentCards.Add(g.GetComponent().cardArrays[maxY - 1 - i, j]);

}

}

}

}

因為Unity3D本身的設計中渲染是需要一定時間的,而對于矩形的裁剪就需要在Unity3D本身的渲染完畢后,在使用相對應的代碼來實現相應的功能,也就是說在整個程序的渲染未完成的時候是不能對進行任何修改的,否則就會造成矩陣的錯誤,導致卡牌處于多重的疊加在同一位置上的BUG,具體的矩陣設計思路如圖6所示。

3.2? 隨機分組算法

在對卡牌的三種情況的相關算法處理中,三種情況的處理都是十分類似的,使用的思路也是相同的,都是通過遍歷卡牌的數量并除以3來對三種情況進行區(qū)分,而之后便是對各種情況的代碼設計。在此只羅列一種情況,如下:

if (n == 0)

{

return;

}

elseif (n == 2)

{

foreach (GameObject g in smallCardsPanesls)

{

if (g.GetComponent().panelOrder == 1)

{

g.GetComponent().AddCard(1, false);

break;

}

}

currentCardNumber += 1;

在卡牌數量的修正后,我們便可對卡牌進行打亂處理,然后進行貼圖來事的所有的卡牌的貼圖是混亂的,而不是井然有序。其主要的設計思路是創(chuàng)建一個list表將所有卡牌遍歷進入列表中,再使用打亂處理將卡牌的順序打亂,核心代碼如下:

List tempGroups = new List

();

foreach (var v in bigCardsPanels)

{

tempGroups.AddRange(v.GetComponent

().currentCards);

}

foreach (var v in smallCardsPanesls)

{

tempGroups.AddRange(v.GetComponent

().cards);

}

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().cardTypeImage.sprite = cardTypes[randomType];

g.GetComponent().cardType = (CardTypeEnum)Enum.Parse(typeof(CardTypeEnum), cardTypes[randomType].name);

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().cardType;

currentCards[i].GetComponent().cardTypeImage.sprite = currentCards[currentCards.Count - 1 - i].GetComponent

().cardTypeImage.sprite;

currentCards[i].GetComponent().cardType = currentCards

[currentCards.Count - 1 - i].GetComponent().cardType;

currentCards[currentCards.Count - 1 - i].GetComponent

().cardTypeImage.sprite = tempSprite;

currentCards[currentCards.Count - 1 - i].GetComponent

().cardType = tempCardType;

}

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().coveredNumber--;

if (v.GetComponent().coveredNumber == 0)

{

v.GetComponent

主站蜘蛛池模板: 青青久久91| 欧美精品H在线播放| 四虎影视永久在线精品| 亚洲成人高清无码| 呦视频在线一区二区三区| 亚洲天堂久久| 国产在线精品美女观看| 毛片在线播放a| 亚洲国产在一区二区三区| 视频国产精品丝袜第一页| 美女一区二区在线观看| 国产精品一区二区国产主播| 91亚洲视频下载| 国产91精品调教在线播放| 国产精品乱偷免费视频| 欧美成人日韩| 热九九精品| 亚洲免费三区| 青青操国产视频| 亚洲天堂网视频| 综合社区亚洲熟妇p| 日韩无码视频播放| 黄色网页在线观看| 久久青草免费91观看| 日韩在线欧美在线| 日本午夜影院| 亚洲国产精品美女| 国产成人禁片在线观看| 91精品国产一区| 国产精品专区第一页在线观看| 国产肉感大码AV无码| 亚洲av无码人妻| 免费看美女自慰的网站| 亚洲制服丝袜第一页| 亚洲天堂网在线观看视频| 国产成人a毛片在线| 久久一色本道亚洲| 久久精品人人做人人综合试看| 久久情精品国产品免费| 精品国产福利在线| 亚洲精品男人天堂| 四虎影视无码永久免费观看| 高清不卡毛片| 三级欧美在线| 福利视频一区| 夜夜操国产| 91偷拍一区| 一级毛片在线免费视频| 毛片基地美国正在播放亚洲| 国产成人久久综合一区| 韩日免费小视频| 日韩A∨精品日韩精品无码| 国产女人18毛片水真多1| 亚洲AV电影不卡在线观看| 99久视频| 亚洲熟妇AV日韩熟妇在线| 2020极品精品国产| 久久99国产乱子伦精品免| 九色综合伊人久久富二代| 熟妇丰满人妻av无码区| 免费国产高清视频| 国产高清不卡| 日日碰狠狠添天天爽| 四虎影视8848永久精品| 国产精品久久久久鬼色| 欧美97欧美综合色伦图| AV色爱天堂网| 夜夜操狠狠操| 国产最爽的乱婬视频国语对白| 美女视频黄又黄又免费高清| 野花国产精品入口| 日韩av在线直播| a在线观看免费| 国产精欧美一区二区三区| 免费观看男人免费桶女人视频| 亚洲一区二区三区中文字幕5566| 午夜啪啪福利| 99视频免费观看| 中文无码毛片又爽又刺激| 亚洲人成在线精品| 免费xxxxx在线观看网站| 麻豆AV网站免费进入|