[Unity3D+算法]一小時做個2048

2048是繼FlappyBird之後另一個比較熱的輕量級的手遊,簡單易玩。最近要離職原先的公司——因爲我想做遊戲,雖然玩遊戲不是很多,但還是熱愛開發遊戲,因此就想去一家遊戲公司,感覺對老闆有一點愧疚和感激,願原公司發展越來越好,用灰太狼的話講,我還會回來的,哈哈!即將入職新公司,聽說壓力會很大,加班無止境,加班其實我到不怕,乘年輕,還有拼勁,加班算什麼,其實只要自己能做出東西,感覺有成就感,倒還是喜歡花更多的時間去做東西,最近處於過渡期,寫寫之前公司的工作小結,還不是很忙,今天花了一個多小時,自己想了一下2048的算法,然後將其實現,可能算法不是那麼優,還望批評交流!

效果圖


實現的還比較粗糙,貼出主要邏輯代碼,僅供參考,歡迎給出更優算法!


using UnityEngine;
using System.Collections;

public class NewBehaviourScript : MonoBehaviour
{
    public UILabel valueLabel;
    bool gameover = false;
    void Start()
    {
        gameover = false;
        valueLabel = GameObject.Find("ValueLabel").GetComponentInChildren<UILabel>();
        valueLabel.text = "Game Start";
        valueLabel.color = Color.green;
    }

    // Update is called once per frame
    void Update()
    {
        if (!gameover)
        {
            if (Input.GetKeyDown(KeyCode.D))
            {
                moveR();
                CreateNumber();
            }
            else if (Input.GetKeyDown(KeyCode.A))
            {
                moveL();
                CreateNumber();
            }
            else if (Input.GetKeyDown(KeyCode.W))
            {
                moveU();
                CreateNumber();
            }
            else if (Input.GetKeyDown(KeyCode.S))
            {
                moveD();
                CreateNumber();
            }
        }
    }


    void moveU()
    {
        for (int i = 1; i <= 4; i++)
        {
            bool flag = false;
            for (int j = 2; j <= 4; j++)
            {
                for (int k = j - 1; k >= 1; k--)
                {
                    //獲取當前元素
                    GameObject go = GameObject.Find("L" + (k + 1).ToString() + i.ToString());
                    print("當前對象" + go.name);
                    UILabel I = go.GetComponentInChildren<UILabel>();

                    //獲取下一個元素
                    GameObject goNext = GameObject.Find("L" + k.ToString() + i.ToString());
                    print("下一個對象" + goNext.name);
                    UILabel INext = goNext.GetComponentInChildren<UILabel>();

                    //比較代碼
                    if (I.text != "")
                    {
                        if (INext.text == "")
                        {
                            INext.text = I.text;
                            I.text = "";
                        }
                        else if (I.text == INext.text)
                        {
                            if (!flag)
                            {
                                int a = int.Parse(INext.text) + int.Parse(I.text);
                                INext.text = a.ToString();
                                I.text = "";
                                flag = true;
                            }
                        }
                    }
                }
            }
        }
    }

    void moveD()
    {
        for (int i = 1; i <= 4; i++)
        {
            bool flag = false;
            for (int j = 3; j >= 1; j--)
            {
                for (int k = j + 1; k <= 4; k++)
                {
                    //獲取當前元素
                    GameObject go = GameObject.Find("L" + (k-1).ToString() + i.ToString());
                    print("當前對象" + go.name);
                    UILabel I = go.GetComponentInChildren<UILabel>();

                    //獲取下一個元素
                    GameObject goNext = GameObject.Find("L" + k.ToString() + i.ToString());
                    print("下一個對象" + goNext.name);
                    UILabel INext = goNext.GetComponentInChildren<UILabel>();

                    //比較代碼
                    if (I.text != "")
                    {
                        if (INext.text == "")
                        {
                            INext.text = I.text;
                            I.text = "";
                        }
                        else if (I.text == INext.text)
                        {
                            if (!flag)
                            {
                                int a = int.Parse(INext.text) + int.Parse(I.text);
                                INext.text = a.ToString();
                                I.text = "";
                                flag = true;
                            }
                        }
                    }
                }
            }
        }
    }



    void moveL()
    {
        for (int i = 1; i <= 4; i++)
        {
            bool flag = false;
            for (int j = 2; j <= 4; j++)
            {
                
                for (int k = j - 1; k >=1 ; k--)
                {
                    //獲取當前元素
                    GameObject go = GameObject.Find("L" + i.ToString() + (k + 1).ToString());
                    print("當前對象" + go.name);
                    UILabel I = go.GetComponentInChildren<UILabel>();

                    //獲取下一個元素
                    GameObject goNext = GameObject.Find("L" + i.ToString() + k.ToString());
                    print("下一個對象" + goNext.name);
                    UILabel INext = goNext.GetComponentInChildren<UILabel>();

                    //比較代碼
                    if (I.text != "")
                    {
                        if (INext.text == "")
                        {
                            INext.text = I.text;
                            I.text = "";
                        }
                        else if (I.text == INext.text)
                        {
                            if (!flag)
                            {
                                int a = int.Parse(INext.text) + int.Parse(I.text);
                                INext.text = a.ToString();
                                I.text = "";
                                flag = true;
                            }
                        }
                    }
                }
            }
        }
    }

    void moveR()
    {
        for (int i = 1; i <= 4; i++)
        {
            bool flag = false;
            for (int j = 3; j >= 1; j--)
            {
                
                for (int k = j + 1; k <= 4; k++)
                {
                    //獲取當前元素
                    GameObject go = GameObject.Find("L" + i.ToString() + (k - 1).ToString());
                    print("當前對象" + go.name);
                    UILabel I = go.GetComponentInChildren<UILabel>();

                    //獲取下一個元素
                    GameObject goNext = GameObject.Find("L" + i.ToString() + k.ToString());
                    print("下一個對象" + goNext.name);
                    UILabel INext = goNext.GetComponentInChildren<UILabel>();

                    //比較代碼
                    if (I.text != "")
                    {
                        if (INext.text == "")
                        {
                            INext.text = I.text;
                            I.text = "";
                        }
                        else if (I.text == INext.text)
                        {
                            if (!flag)
                            {
                                int a = int.Parse(INext.text) + int.Parse(I.text);
                                INext.text = a.ToString();
                                I.text = "";
                                flag = true;
                            }
                        }
                    }
                }
            }
        }
    }



    void CreateNumber()
    {
        int count = 0;
        bool flag = false;
        for (int i = 1; i <= 4; i++)
        {
            if (!flag)
            {
                for (int j = 1; j <= 4; j++)
                {
                    GameObject go = GameObject.Find("L" + i.ToString() + j.ToString());
                    UILabel label = go.GetComponentInChildren<UILabel>();
                    if (label.text == "")
                    {
                        int r = Random.Range(1, 10);
                        if (r <= 5)
                        {
                            int value = Random.Range(1, 5);
                            if (value < 4)
                                label.text = "2";
                            else
                                label.text = "4";
                            flag = true;
                            break;
                        }
                    }
                    else
                    {
                        if (++count == 16)
                        {
                            valueLabel.text = "Game Over";
                            valueLabel.color = Color.red;
                            gameover = true;
                        }
                    }
                }
            }
            else
                break;
        }
    }


}

歡迎關注我的微博

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章