卡牌小游戲

<p>
  一個(gè)卡片消除小游戲,主要是用來(lái)熟悉unity的基本用法归斤,功能比較簡(jiǎn)單痊夭,完成了隨機(jī)發(fā)牌以及卡牌對(duì)比消除功能~
</p>
--

一刁岸、代碼的主體思路:

代碼包括兩塊:

  • 用來(lái)做初始化模板的卡牌
     這里包括卡牌自身的屬性字段脏里,以及使用方法,包括:卡牌的序號(hào)(id)虹曙,卡背迫横,設(shè)置卡牌的方法(SetCard)番舆,卡牌點(diǎn)擊方法(OnMouseDown),卡背消失方法(SetBack)矾踱。
  • 游戲中恨狈,用來(lái)負(fù)責(zé)卡牌發(fā)送,點(diǎn)擊判斷等處理的卡牌管理代碼呛讲。
     這是用來(lái)對(duì)整個(gè)游戲做管理的代碼禾怠,包括:卡牌的數(shù)量(CARD_NUMBER),所有卡牌的ID贝搁,以及所有卡牌的圖片(sprite)和卡牌之間的間隔(offsetX吗氏,offsetY);
     方法包括:卡牌序號(hào)的隨機(jī)初始化(ArrayInit)雷逆,接收卡牌方法(ReceiveCard)弦讽,卡牌比較方法(Macth)

<pre>
上面是整體代碼的結(jié)構(gòu),下面會(huì)根據(jù)自己開(kāi)發(fā)的思路一步一步完成膀哲。
</pre>

二往产、開(kāi)發(fā)步驟:
  • 1.先把需要的卡牌拖入到hierarchy中,并且將卡背作為卡牌的子對(duì)象:
1.png

完成后記得把卡背的z軸坐標(biāo)調(diào)整為-2某宪,讓卡背在前仿村。

  • 2.完成卡牌模板后,給卡片添加script組件Card缩抡,以及碰撞組件(collider 2d):

<pre>
這里先實(shí)現(xiàn)基本功能奠宜,卡背,卡牌的ID瞻想,卡牌點(diǎn)擊方法(先完成點(diǎn)點(diǎn)擊卡背消失)
</pre>

private int id;                  //卡片的序號(hào)id
public GameObject cardBack;     //卡背對(duì)象压真,在unity拖拽賦值

//鼠標(biāo)點(diǎn)擊事件需要在對(duì)象上添加collider組件
void OnMouseDown()
{
cardBack.SetActive(false);
}

  • 3.有了模板卡牌后沮脖,可以完成卡牌的隨機(jī)分發(fā)功能了:
     為了完成隨機(jī)分發(fā)塔插,需要用到卡牌的設(shè)置方法還有隨機(jī)數(shù)組:
//首先在卡牌的script組件中,添加卡牌的設(shè)置方法SetCard队询,有兩個(gè)參數(shù)佃迄,一個(gè)是id泼差,一個(gè)是sprite

 public void SetCard(int id, Sprite fruit)
    {
        this.id = id;
        this.GetComponent<SpriteRenderer>().sprite = fruit;
    }


然后在hierarchy中創(chuàng)建一個(gè)空對(duì)象,用來(lái)掛CardManage腳本呵俏,來(lái)負(fù)責(zé)整個(gè)游戲的處理:

2.png
//設(shè)置卡牌的數(shù)量堆缘,和精靈的數(shù)量,精靈用拖拽賦值普碎;
    private const int CARD_NUMBER = 10;
    int[] cardId=new int[CARD_NUMBER];
    public Sprite[] fruitSprites=new Sprite[5];

//在CardManage中寫(xiě)上生成隨機(jī)數(shù)組的方法
void ArrayInit(int[] array)
    {
        //給數(shù)組每一個(gè)元素賦值吼肥,分別為0,0,1,1,2,2,3,3,4,4,5,5
        for (int i = 0; i < array.Length; i++)
        {
            array[i] = i/2;
        }

        //對(duì)有了初值的數(shù)組做亂序處理,從最后一個(gè)元素往前和隨機(jī)的元素調(diào)換位置。
        int swap, temp;
        for (int i = array.Length-1; i > 0; i--)
        {
            swap = Random.Range(0, i);
            temp = array[swap];
            array[swap] = array[i];
            array[i] = temp;
        }      
    }

完成之后再CardManage中的Star方法中缀皱,開(kāi)始生成隨機(jī)卡牌:

//聲明初始的卡牌和后續(xù)用到的實(shí)例化的卡牌對(duì)象
    public Card oriCard;
    private Card cloneCard;

//每張卡牌的間隔
    private int offsetX = 2;
    private int offsetY = 2;

    // Use this for initialization
    void Start()
    {
    //給oriCard賦值并且記錄初始卡牌的位置信息(startpoz)
        oriCard = GameObject.Find("Card").GetComponent<Card>();
        Vector3 startPoz = oriCard.transform.position;
        ArrayInit(cardId);

    //通過(guò)for循環(huán)給所有的卡牌賦值并設(shè)置位置
        for (int i = 0; i < CARD_NUMBER; i++)
        {
            if (i == 0)
            {
                cloneCard = oriCard;
            }
            else
            {
                cloneCard = Instantiate(oriCard);//實(shí)例化卡牌
            }
            //通過(guò)setCard方法設(shè)置每張卡牌的精靈斗这。
            cloneCard.SetCard(cardId[i], fruitSprites[cardId[i]]);
            //設(shè)置每張卡牌的位置
            cloneCard.transform.position = new Vector3(startPoz.x + offsetX * (i % 5), startPoz.y - offsetY * (i / 5), startPoz.z);
        }
    }
  • 4.隨機(jī)卡牌生成完成之后,就是對(duì)點(diǎn)擊的卡牌進(jìn)行比較啤斗,這個(gè)功能也是在CardManage中完成:
    這個(gè)功能分為兩個(gè)步驟:
    a表箭,首先是接收鼠標(biāo)點(diǎn)擊了的卡牌;
    b钮莲,對(duì)存儲(chǔ)了的卡牌進(jìn)行比較(這里可以通過(guò)卡牌的ID來(lái)進(jìn)行比較)免钻。
    //接收鼠標(biāo)點(diǎn)擊的卡牌,這個(gè)在CardManage中完成:
    //聲明兩個(gè)空對(duì)象用來(lái)接收點(diǎn)擊的卡牌
    public Card first = null;  
    public Card second = null;
    //接收方法
    public void ReceiveCard(Card card)
    {
        if(first==null)
        {
            first = card;
        }
        else
        {
            second = card;
            //開(kāi)啟一個(gè)協(xié)程崔拥,當(dāng)兩張卡牌進(jìn)行比較的時(shí)候伯襟,如果不一致,延遲執(zhí)行卡背恢復(fù)的操作握童。
            StartCoroutine(Macth(first, second));
        }
    }
//寫(xiě)好接收的方法后姆怪,在Card中,進(jìn)行調(diào)用:
//首先實(shí)例化CardManage中的腳本
CardManage manage;
private void Awake()
 {
 manage = GameObject.Find("CardManage").GetComponent<CardManage>();
 }

    //然后在鼠標(biāo)點(diǎn)擊事件調(diào)用接收方法:
    //鼠標(biāo)點(diǎn)擊事件要記得加collider
    void OnMouseDown()
    {
        //接收的條件為澡绩,當(dāng)?shù)诙€(gè)接收的卡牌對(duì)象為空稽揭,并且該次點(diǎn)擊的卡牌是沒(méi)有被點(diǎn)擊過(guò)的。
        if(manage.second==null&&cardBack.activeSelf)
        {
            cardBack.SetActive(false);
            manage.ReceiveCard(this);
        }    
    }

完成接收后肥卡,可以進(jìn)行比較了溪掀,這里用到了:
 設(shè)置卡背消失方法,這個(gè)是在Card中實(shí)現(xiàn).
 比較方法步鉴,這個(gè)是在CardManage中實(shí)現(xiàn)揪胃,

    //設(shè)置卡背方法
    public void SetBack(bool isTurn)
    {
        cardBack.SetActive(isTurn);
    }
    //比較方法,由開(kāi)啟了協(xié)程氛琢,所以需要返回IEnumerator類型的方法
    IEnumerator Macth(Card fir,Card sec)
    {
        if(fir.GetId!=sec.GetId)
        {
            //程序執(zhí)行到這里的時(shí)候會(huì)等待1秒后在執(zhí)行
            yield return new WaitForSeconds(1);
            fir.SetBack(true);
            sec.SetBack(true);
        }
      //比較完畢后喊递,清空接受的卡牌
        first = null;
        second = null;
    }

  • 5.游戲結(jié)束
     當(dāng)卡牌全部翻轉(zhuǎn)過(guò)來(lái)的時(shí)候,則結(jié)束游戲阳似。
//結(jié)束的思路是骚勘,首先設(shè)置一個(gè)判定值,每成功比較出一對(duì)撮奏,加1俏讹,當(dāng)判定值達(dá)到了,則結(jié)束畜吊。
//判定值泽疆,從0開(kāi)始計(jì)數(shù)
int index = 0;
//游戲勝利時(shí)條件
int end = CARD_NUMBER / 2;

//在比較方法中添加一個(gè)判斷,當(dāng)成功時(shí)玲献,index+1殉疼;
 IEnumerator Macth(Card fir,Card sec)
    {
        if (fir.GetId == sec.GetId)
        {
            index++;
            
        }
}

//最后在Update方法中逗嫡,實(shí)時(shí)進(jìn)行判斷是否滿足勝利條件。
void Update () {
        if(index==end)
        {
           print("游戲勝利~");
           index = 0;
        }
    }

寫(xiě)到這里主體的功能也就完成啦株依,有興趣的話可以增加更多的關(guān)卡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末延窜,一起剝皮案震驚了整個(gè)濱河市恋腕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逆瑞,老刑警劉巖荠藤,帶你破解...
    沈念sama閱讀 216,919評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異获高,居然都是意外死亡哈肖,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)念秧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)淤井,“玉大人,你說(shuō)我怎么就攤上這事摊趾”液荩” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,316評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵砾层,是天一觀的道長(zhǎng)漩绵。 經(jīng)常有香客問(wèn)我,道長(zhǎng)肛炮,這世上最難降的妖魔是什么止吐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,294評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮侨糟,結(jié)果婚禮上碍扔,老公的妹妹穿的比我還像新娘。我一直安慰自己秕重,他們只是感情好蕴忆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著悲幅,像睡著了一般套鹅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上汰具,一...
    開(kāi)封第一講書(shū)人閱讀 51,245評(píng)論 1 299
  • 那天卓鹿,我揣著相機(jī)與錄音,去河邊找鬼留荔。 笑死吟孙,一個(gè)胖子當(dāng)著我的面吹牛澜倦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播杰妓,決...
    沈念sama閱讀 40,120評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼藻治,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了巷挥?” 一聲冷哼從身側(cè)響起桩卵,我...
    開(kāi)封第一講書(shū)人閱讀 38,964評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎倍宾,沒(méi)想到半個(gè)月后雏节,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡高职,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評(píng)論 2 333
  • 正文 我和宋清朗相戀三年钩乍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片怔锌。...
    茶點(diǎn)故事閱讀 39,764評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寥粹,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出埃元,到底是詐尸還是另有隱情排作,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評(píng)論 5 344
  • 正文 年R本政府宣布亚情,位于F島的核電站妄痪,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏楞件。R本人自食惡果不足惜衫生,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評(píng)論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望土浸。 院中可真熱鬧罪针,春花似錦、人聲如沸黄伊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,697評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)还最。三九已至墓阀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間拓轻,已是汗流浹背斯撮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,846評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扶叉,地道東北人勿锅。 一個(gè)月前我還...
    沈念sama閱讀 47,819評(píng)論 2 370
  • 正文 我出身青樓帕膜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親溢十。 傳聞我的和親對(duì)象是個(gè)殘疾皇子垮刹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容