亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        基于Unity3D的“奮了個(gè)斗”算法設(shè)計(jì)與實(shí)現(xiàn)

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

        張佳豪 許向榮 安沛沛

        摘? 要:隨著時(shí)代的進(jìn)步,很多在以往風(fēng)靡一時(shí)的經(jīng)典游戲逐漸退出人們的視線并被人們慢慢淡忘,對(duì)這些消除類(lèi)游戲的游戲特性進(jìn)行整合創(chuàng)新,從而創(chuàng)作出新的游戲,并帶動(dòng)整個(gè)消除類(lèi)游戲的新熱潮。在原本的消除類(lèi)游戲的主要特性中,對(duì)游戲消除的類(lèi)型與個(gè)數(shù)進(jìn)行創(chuàng)新,加入原本的三個(gè)相同元素進(jìn)行消除的思路,采用人生的階段與游戲關(guān)卡一一對(duì)應(yīng),加入更多解密的難度,基于Unity3D引擎創(chuàng)作了一款新型的解謎燒腦三消類(lèi)游戲:奮了個(gè)斗。

        關(guān)鍵詞:三消類(lèi)游戲;Unity3D;游戲開(kāi)發(fā)

        中圖分類(lèi)號(hào):TP311? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ? ? 文章編號(hào):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ā)展下,手機(jī)成為很普遍的產(chǎn)物。從青少年到老年人幾乎人手智能手機(jī)。因疫情原因,大大推動(dòng)了游戲行業(yè)的發(fā)展[1]。隨著生活節(jié)奏的加快,游戲成為人們首選的休閑娛樂(lè)方式[2]。人們的生活水平隨著時(shí)代的發(fā)展不斷提高,對(duì)于物質(zhì)的追求也逐漸變得不那么熱切,對(duì)于精神上的需求卻更加強(qiáng)烈,因此對(duì)于游戲這方面的關(guān)注便不斷增加,對(duì)于游戲的需求也越發(fā)強(qiáng)烈。

        Unity是由丹麥Unity Technologies公司開(kāi)發(fā)的綜合性多平臺(tái)的游戲開(kāi)發(fā)工具。使用Unity可實(shí)現(xiàn)多平臺(tái)一次性開(kāi)發(fā)且兼容性較好。Unity支持Android,Windows,Linux,Web Player,PC,IOS,BlackBerry,Windows Phone 8,Xbox等多個(gè)平臺(tái)發(fā)布[3,4]。作為現(xiàn)如今最為主流的游戲設(shè)計(jì)軟件,其強(qiáng)大之處不必多說(shuō),對(duì)整個(gè)游戲的創(chuàng)作與開(kāi)發(fā)也為我們提供了莫大的支持。整個(gè)游戲體系的創(chuàng)建是基于傳統(tǒng)經(jīng)典游戲的特色和原有游戲體系的結(jié)構(gòu)想法上加以創(chuàng)新,創(chuàng)造出一個(gè)全新的游戲結(jié)構(gòu),將原本的消除類(lèi)游戲加入新的創(chuàng)意,使其具有更加豐富的游戲趣味,適應(yīng)現(xiàn)時(shí)代的時(shí)代游戲浪潮。

        1? 項(xiàng)目簡(jiǎn)介

        此游戲主要基于Unity3D作為主要游戲開(kāi)發(fā)平臺(tái),C#等程序語(yǔ)言作為程序設(shè)計(jì)基礎(chǔ)設(shè)計(jì)出的一款解密燒腦類(lèi)三消游戲,本文主要闡明其中的重要算法以及關(guān)鍵思路。以方塊作為整個(gè)游戲的游戲特征元素并以三消作為整個(gè)游戲的類(lèi)型,玩家需要思考并解決的問(wèn)題是通過(guò)選取、換位或配對(duì),將原本看起來(lái)混亂、隨機(jī)排列的游戲元素進(jìn)行調(diào)整,使三個(gè)相同的游戲元素進(jìn)行匹配,最終達(dá)到消除的效果[5,6]。

        2? 主要設(shè)計(jì)思路與關(guān)鍵算法

        本項(xiàng)目主要的基本結(jié)構(gòu)在于項(xiàng)目的基本設(shè)計(jì)的基礎(chǔ)上對(duì)項(xiàng)目的需要進(jìn)行分類(lèi),將其分為:游戲分布設(shè)計(jì)、隨機(jī)分組設(shè)計(jì)以及其他功能設(shè)計(jì),如圖1所示。這些結(jié)構(gòu)都是整個(gè)項(xiàng)目結(jié)構(gòu)的一部分,在下方將對(duì)這些結(jié)構(gòu)分組進(jìn)行說(shuō)明講解。

        2.1? 游戲分布設(shè)計(jì)

        現(xiàn)有的為大眾所喜愛(ài)的游戲中,很多游戲創(chuàng)作者對(duì)于游戲的整個(gè)游戲設(shè)計(jì)界面是下了極大的心思的,研究玩家最為接受的審美,以此為基礎(chǔ)對(duì)整個(gè)游戲的功能布局以及游戲界面進(jìn)行設(shè)計(jì),使得游戲的界面設(shè)計(jì)更加貼合玩家習(xí)慣與審美,具有更良好的游戲體驗(yàn)。在設(shè)計(jì)游戲的整體布局時(shí),主要考慮到玩家對(duì)于游戲的認(rèn)知和對(duì)游戲布局的感知是比較敏感的,需要在設(shè)計(jì)整體的分布時(shí)更加注重大眾的美感以及整體的協(xié)調(diào)性,因此在游戲創(chuàng)作中采用的是對(duì)稱(chēng)性設(shè)計(jì),將整個(gè)游戲的分布設(shè)計(jì)成多個(gè)矩陣疊加的情況,并按照對(duì)稱(chēng)的性質(zhì)將矩陣按照最為和諧的設(shè)計(jì)呈現(xiàn)在眼前,而這也是整個(gè)游戲的分布中最為主要的分布設(shè)計(jì)。

        因?yàn)樵谧畛踉O(shè)定的游戲類(lèi)型是三消,也就是三元素消除的游戲類(lèi)型,而要實(shí)現(xiàn)這一設(shè)計(jì)則是需要設(shè)計(jì)不同組的元素和相同的元素,而在其中在重要的是如何將相同元素進(jìn)行選中、集合的操作。因?yàn)樵谧畛醯脑O(shè)想中是將各個(gè)元素以單獨(dú)的方式呈現(xiàn),讓它能夠作為一個(gè)能夠被選中的、單獨(dú)的物體存在,所以實(shí)現(xiàn)這一想法的最優(yōu)解是將一個(gè)小的矩形作為元素的承載,使其成為元素的一個(gè)對(duì)應(yīng)物體來(lái)代替元素作為被選中、集合的目標(biāo),也就是卡牌作為元素的對(duì)應(yīng)物體,也是作為矩陣的最基礎(chǔ)的組成單位。在設(shè)計(jì)整體布局時(shí),矩陣作為主要的設(shè)計(jì)模型成為整個(gè)游戲的主要結(jié)構(gòu),最初的設(shè)計(jì)方案是將多個(gè)矩陣根據(jù)一定的規(guī)律進(jìn)行疊加處理,在用矩陣疊加的層數(shù)與疊加的規(guī)律對(duì)游戲難度進(jìn)行控制的同時(shí),也帶來(lái)更多設(shè)計(jì)其他模式的可能性,預(yù)想的矩形結(jié)構(gòu)設(shè)計(jì)圖如圖2所示。

        2.2? 隨機(jī)分組算法

        三消類(lèi)游戲最主要的特點(diǎn)是三元素消除,在卡牌的生成的設(shè)計(jì)是需要對(duì)卡牌數(shù)量進(jìn)行一定的限制,整個(gè)面板里的卡牌數(shù)量需要是3的倍數(shù),這樣才能避免出現(xiàn)游戲到最后出現(xiàn)只余下1個(gè)或2個(gè)卡牌的情況,在這一前提條件下,卡牌數(shù)量需要針對(duì)性地去限制其數(shù)量??ㄅ茢?shù)量分為三種情況:卡牌數(shù)量除去3后沒(méi)有余數(shù)、卡牌數(shù)量除去3后余1和卡牌數(shù)量除去3后余2,針對(duì)這三種情況,處理方法大致相同,即加一定的卡牌到其中使得卡牌的數(shù)量始終是3的倍數(shù)。

        在確定卡牌的數(shù)量是3的倍數(shù),避免出現(xiàn)多余卡牌不能消除的情況后,便是打亂卡牌的順序并在卡牌上貼上對(duì)應(yīng)元素的貼圖。 在這一階段的主要目的是將所有的卡牌整個(gè)卡牌的貼圖順序打亂并對(duì)這些卡牌進(jìn)行貼圖,其步驟是在統(tǒng)計(jì)所有卡牌的個(gè)數(shù)后,單獨(dú)建立一個(gè)列表TempGroup用于存儲(chǔ)卡牌的緩存數(shù)據(jù),將所有panel中卡牌遍歷進(jìn)入列表中,對(duì)卡牌進(jìn)行打亂操作,在將列表的卡牌順序打亂后每三個(gè)卡牌貼上相同元素的貼圖,之后再把列表內(nèi)的卡牌按照原先順序重新放回panel內(nèi),在此之后整個(gè)游戲內(nèi)的卡牌便是一個(gè)較為無(wú)序的狀態(tài),也達(dá)成了原本的目的。

        2.3? 相關(guān)技能設(shè)定

        在技能設(shè)定方面主要是依據(jù)最為常用的牌類(lèi)游戲中的想法:重新洗牌、撤回卡牌以及推出卡牌。這三項(xiàng)功能主要針對(duì)卡牌本身位置、所處的panel還有卡牌上的貼圖進(jìn)行代碼設(shè)計(jì),而且這幾項(xiàng)功能都是和卡牌所處的多項(xiàng)panel,卡牌在選中前后的位置以及隨機(jī)分組的算法有關(guān)。洗牌是對(duì)隨機(jī)分組算法的重新應(yīng)用,但還要考慮各個(gè)pane中的卡牌數(shù)量以及剩余的還未消除的元素和在卡牌中的貼圖個(gè)數(shù),在此基礎(chǔ)對(duì)卡牌的貼圖進(jìn)行更改、交換來(lái)達(dá)到洗牌的效果,實(shí)現(xiàn)效果如圖3所示。

        撤回卡牌則是對(duì)卡牌所處的位置以及所在panel的序列進(jìn)行標(biāo)記,然后在撤回進(jìn)行時(shí)將卡牌放回原位,實(shí)現(xiàn)效果如圖4所示;推出卡牌則是建立一個(gè)新的panel來(lái)存儲(chǔ)pencilbox這一panel中最前面三個(gè)卡牌來(lái)實(shí)現(xiàn)中這一功能,如圖5所示。

        2.4? 其他功能設(shè)計(jì)

        最主要的結(jié)構(gòu)設(shè)計(jì)結(jié)束之后便實(shí)現(xiàn)其他的必要實(shí)現(xiàn)功能,如遮擋算法、移除展示、生成位置等功能,這些功能是游戲中必要且必需的功能,主要用于卡牌的遮擋、卡牌的移除等方面,也是對(duì)游戲功能的完善。遮擋算法的設(shè)計(jì)是為避免上層卡牌在為消除時(shí),下層卡牌就處于可選取的狀態(tài),從而導(dǎo)致原本需要消除上層卡牌才能解鎖下層卡牌的情況變成了在上層卡牌未消除的狀態(tài)下,下層卡牌就已經(jīng)處于解鎖狀態(tài),這將破壞了整個(gè)游戲設(shè)立的游戲機(jī)制。想要是實(shí)現(xiàn)這一算法主要依據(jù)于字典Dictionary,利用字典來(lái)對(duì)卡牌進(jìn)行查找與覆蓋,在此基礎(chǔ)上統(tǒng)計(jì)每個(gè)卡牌的類(lèi)型、個(gè)數(shù)并判定卡牌之間的遮擋關(guān)系。移除展示算法的世界是為了實(shí)現(xiàn)選中卡牌的移動(dòng)并在移動(dòng)后取消原有的遮擋關(guān)系,解鎖在其下層的卡牌,并使得遮擋算法重新判定遮擋關(guān)系這一系列的功能,從另一方面實(shí)現(xiàn)卡牌的移動(dòng)。生成位置算法則是為了panel面板的生成而設(shè)計(jì)出來(lái)的,因?yàn)橛螒虻脑O(shè)計(jì)因素需要panel面板不是一整個(gè)平面的平鋪,而是多個(gè)面板的重疊、覆蓋,這也就需要對(duì)面板的生成要有一定的把控,需要其出現(xiàn)在它該生成的位置,所以設(shè)定其生成的位置來(lái)把控面板的層級(jí)大小和覆蓋的面積。

        3? 設(shè)計(jì)思路與關(guān)鍵算法的實(shí)現(xiàn)

        3.1? 矩陣設(shè)計(jì)算法

        矩陣在游戲中是作為整個(gè)游戲的基礎(chǔ)設(shè)計(jì)結(jié)構(gòu)而存在的,也在一定程度上決定了整個(gè)游戲的難度,使得游戲的結(jié)構(gòu)層次上有了更加廣闊的豐富性,帶給玩家更優(yōu)秀的游戲體驗(yàn)。因而在對(duì)矩陣的設(shè)計(jì)中,更多的是需要對(duì)矩陣的多種變化,而要實(shí)現(xiàn)這些效果則是需要在程序中將其以代碼的方式來(lái)裁剪矩陣,使得矩陣的基本形狀能夠被限制,矩陣中卡牌的位置也需要重新設(shè)定,因程序代碼過(guò)于繁瑣,在此只以上下對(duì)稱(chēng)算法為例,核心代碼如下:

        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]);

        }

        }

        }

        }

        因?yàn)閁nity3D本身的設(shè)計(jì)中渲染是需要一定時(shí)間的,而對(duì)于矩形的裁剪就需要在Unity3D本身的渲染完畢后,在使用相對(duì)應(yīng)的代碼來(lái)實(shí)現(xiàn)相應(yīng)的功能,也就是說(shuō)在整個(gè)程序的渲染未完成的時(shí)候是不能對(duì)進(jìn)行任何修改的,否則就會(huì)造成矩陣的錯(cuò)誤,導(dǎo)致卡牌處于多重的疊加在同一位置上的BUG,具體的矩陣設(shè)計(jì)思路如圖6所示。

        3.2? 隨機(jī)分組算法

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

        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;

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

        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個(gè)卡牌貼上3個(gè)相同的貼圖,在貼圖全部被貼圖后將卡牌送回其原本在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? 技能算法

        在洗牌、推出卡牌、撤回三項(xiàng)最基礎(chǔ)的技能中, 洗牌是其中最復(fù)雜的代碼,其思路也是相對(duì)簡(jiǎn)單的,但實(shí)現(xiàn)其的難度相比于推出卡牌的操作實(shí)現(xiàn)還是比較困難的。推出卡牌的操作實(shí)現(xiàn)是建立新的panel用于容納推出的卡牌,而只要將pencilbox中的卡牌選取前三個(gè)將其傳入新建的panel即可,撤回則是對(duì)卡牌之前所在位置進(jìn)行標(biāo)記,尋求其父親的存在并以此為撤回的標(biāo)準(zhǔn)。因此在此只對(duì)洗牌進(jìn)行代碼實(shí)現(xiàn)進(jìn)行說(shuō)明,洗牌的核心代碼如下:

        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? 其他功能性算法

        該算法是整個(gè)項(xiàng)目中較為耗費(fèi)思考的算法,其中要考慮到卡牌的整體堆砌、卡牌的數(shù)量、相鄰卡牌的距離、卡牌之間的聯(lián)系等方面,需要從多個(gè)方面來(lái)對(duì)遮蓋算法進(jìn)行設(shè)計(jì),方方面面都要考慮到,不然到調(diào)試運(yùn)行的時(shí)候,bug和錯(cuò)誤將會(huì)層出不窮,下面的算法是整個(gè)遮蓋算法最為主要的地方,也就是這一部分的核心算法,如下:

        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;

        }

        移除算法與移動(dòng)算法不同,移動(dòng)算法是位置的改變,而一處算法則是在尋找到這一卡牌后,將這一卡牌從其中所有卡牌中消除,其對(duì)應(yīng)的各項(xiàng)關(guān)系并在移除后進(jìn)行重新判定,并從字典中移除這一卡牌,更新其周?chē)ㄅ频恼趽蹶P(guān)系,核心代碼如下:

        if (CoverToOthers.ContainsKey(g))

        {

        returnCardCovers = CoverToOthers[g];

        foreach (var v in CoverToOthers[g])

        {

        v.GetComponent().coveredNumber--;

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

        {

        v.GetComponent

        亚洲激情一区二区三区视频| 五月综合激情婷婷六月色窝| 国产高潮刺激叫喊视频| 无码人妻一区二区三区免费| 大伊香蕉精品视频一区| 蜜桃av噜噜噜一区二区三区| 中国男女黄色完整视频| 亚洲小说区图片区色综合网| 50岁退休熟女露脸高潮| 久久精品夜夜夜夜夜久久| 国产午夜福利在线观看红一片| 亚洲av日韩av综合| 一本一本久久久久a久久综合激情 91短视频在线观看免费 | 一区二区三区中文字幕p站| 久久无码专区国产精品| 欧美国产日本高清不卡| 亚洲色婷婷综合开心网| 日本一区二区在线播放| 精品人妖一区二区三区四区| 东北老女人高潮大喊舒服死了| 久久婷婷国产剧情内射白浆| 无码8090精品久久一区| 日本高清一区二区在线播放| 国产自拍三级黄片视频| 人妻少妇被猛烈进入中文字幕| 摸进她的内裤里疯狂揉她动图视频| 女女女女bbbbbb毛片在线| 人妻少妇人人丰满视频网站| 国产大屁股白浆一区二区三区 | 91精品亚洲一区二区三区| 久久久国产熟女综合一区二区三区| 无码精品一区二区三区在线| 国产乱妇无码大片在线观看| 牲欲强的熟妇农村老妇女| 日本加勒比东京热日韩| 综合图区亚洲另类偷窥| 亚洲免费精品一区二区| 国产av无码专区亚洲a∨毛片| 99精品一区二区三区无码吞精| 国产成人精品日本亚洲专区6| 色婷婷一区二区三区77|