花半天时间写的《羊了个羊》,感觉这游戏没啥难度,火的有些莫名其妙

5 篇文章 0 订阅

  最近《羊了个羊》很火,下载玩完之后,就觉得实现十分简单。火的有些莫名其妙,于是自己周末搞了下。

  首先根据机制,有8种牌类,凑齐3个会消除。卡牌上面如果有卡牌遮住,就不能点击;没有卡牌遮挡的情况就可以点击。

  核心代码如下:

 public class Card
    {
        public int Id;
        public int cardId;
        public RectTransform rectTran;
    }



    #region 初始界面
    private List<Card> cardList = new List<Card>();
    private Transform openScene;
    private int sceneID = 0;

    private List<Card> showCardList = new List<Card>();


    //public Vector2 width = new Vector2(50f, 50f);
    
    private void OpenScene(int _num)
    {
        transform.Find("scene/Title").gameObject.SetActive(true);
        transform.Find("scene/Title").GetComponent<Text>().text = "第" + _num + "关";
        sceneID = _num;
        cardList.Clear();
        transform.Find("scene/show").gameObject.SetActive(true);
        openScene = transform.Find("scene/" + _num);
        openScene.gameObject.SetActive(true);
        switch (_num)
        {
            case 1: CreatScene1(); break;
            case 2: CreatScene2(); break;
            case 3: CreatScene3(); break;
        }
    }

    private void CreatScene1()
    {
        Transform _parent = openScene;
        //先发保底6种牌
        var _list = new List<int>();
        for (var _j = 0; _j < 6; _j++)
        {
            var _bite = Random.Range(0, allImgs.Count);
            for (var _jj = 0; _jj < 3; _jj++) _list.Add(_bite);
        }



        var _disY = 0;
        for (var _i = _list.Count; _i > 0; _i--)
        {
            var _cardID = _list[Random.Range(0, _list.Count)];
            _list.Remove(_cardID);
            var _pos = new Vector2((_i % 3) * 200 - 200, (_i % 9) / 3 * 150 + _disY+ (_i <= 9 ? 20 : 0));
            AddCard(_parent, _i, _cardID, _pos);

        }
    }

    //最后一张牌是否摆放到上面
    private void ShowJudge(Card _c)
    {
        for (var _i = 0; _i < cardList.Count; _i++)
        {
            if (
                      Mathf.Abs(cardList[_i].rectTran.position.x - _c.rectTran.position.x) < len &&
                       Mathf.Abs(cardList[_i].rectTran.position.y - _c.rectTran.position.y) < len
                       )
            {
                cardList[_i].rectTran.GetChild(0).gameObject.SetActive(false);
                cardList[_i].rectTran.GetComponent<Button>().interactable = false;
             
            }
        }
    }

    private float len = 100f;

    public void ClickCard(Card _c)
    {
        cardList.Remove(_c);
        _c.rectTran.SetParent(transform.Find("scene/show"));
        showCardList.Add(_c);
       
        //_c.rectTran.anchoredPosition = new Vector2(showCardList.Count * width.x  - 400, 0);

        //Debug.LogError(upCardList.Count);
        for(var i=0;i<cardList.Count;i++)
        //foreach (var idx in cardList)
        {
            var idx = cardList[i];
            bool _isOpen = true ;
            for (var j = i + 1; j < cardList.Count; j++)
            {
                var oo = cardList[j];
                if (
                       Mathf.Abs(oo.rectTran.position.x - idx.rectTran.position.x) < len &&
                        Mathf.Abs(oo.rectTran.position.y - idx.rectTran.position.y) < len
                        )
                {
                    _isOpen = false;
                    break;
                }
            }
           

            if (_isOpen)
            {
                idx.rectTran.GetChild(0).gameObject.SetActive(false);
                idx.rectTran.GetComponent<Button>().interactable = true;
            }
        } 

        var _dic = new Dictionary<int, List<Card>>();
        foreach (var idd in showCardList)
            if (!_dic.ContainsKey(idd.cardId))
            {
                var _l = new List<Card>();
                _l.Add(idd);
                _dic.Add(idd.cardId, _l);
            }
            else _dic[idd.cardId].Add(idd);

        foreach (var idx in _dic)
        {
            var _l = idx.Value;
            Debug.Log("~~~~~~~~"+idx.Key+"  "+_l.Count);
            //foreach (var _m in _l) Debug.Log(_m.cardId);
            if (_l.Count >= 3)
                foreach (var jj in _l)
                {
                    showCardList.Remove(jj);
                    Destroy(jj.rectTran.gameObject);
                }
        }

        for (var _i = 0; _i < showCardList.Count; _i++) showCardList[_i].rectTran.anchoredPosition = new Vector2(_i * 100 - 300, 0);

        if (showCardList.Count >= 7)
        {
            Debug.Log("游戏失败");
            RecyleScene();
            transform.Find("loser").gameObject.SetActive(true);
            return;
        }

        if (showCardList.Count == 0 && cardList.Count == 0)
        {
            RecyleScene();
            
            if (sceneID == 1)
                OpenScene(2);
            else if (sceneID == 2)
                OpenScene(3);
            else transform.Find("win").gameObject.SetActive(true);
        }
                
    }

    private Transform CreatCard()
    {
        return GameObject.Instantiate(Resources.Load<GameObject>("card")).transform;
    }

    private void RecyleScene()
    {
        cardList.Clear();
        showCardList.Clear();
        transform.Find("scene/Title").gameObject.SetActive(false);
        var _show = transform.Find("scene/show");
        _show.gameObject.SetActive(false);
        for (var _i = _show.childCount - 1; _i >= 0; _i--)
            Destroy(_show.GetChild(_i).gameObject);
        openScene.gameObject.SetActive(false);
        for (var _i = openScene.childCount - 1; _i >= 0; _i--)
            Destroy(openScene.GetChild(_i).gameObject);

    }



    private void CreatScene2()
    {
        Transform _parent = openScene;
        //先发保底6种牌
        var _list = new List<int>();
        for (var _j = 0; _j < 30; _j++)
        {
            var _bite = Random.Range(0, allImgs.Count);
            for (var _jj = 0; _jj < 3; _jj++) _list.Add(_bite);
        }



        for (var _i = _list.Count; _i > 0; _i--)
        {
            var _cardID = _list[Random.Range(0, _list.Count)];
            _list.Remove(_cardID);
            var _pos = new Vector2(Random.Range(-350, 350f), Random.Range(-350, 350f));
            AddCard(_parent, _i, _cardID,_pos);
        }
    }

    private void CreatScene3()
    {
        Transform _parent = openScene;
        先发保底6种牌
        //var _list = new List<int>();
        //for (var _j = 0; _j < 40; _j++)
        //{
        //    var _bite = Random.Range(0, allImgs.Count);
        //    for (var _jj = 0; _jj < 3; _jj++) _list.Add(_bite);
        //}



        for (var _i = 999; _i > 0; _i--)
        {
            var _cardID = Random.Range(0, allImgs.Count);
            //_list.Remove(_cardID);
            var _pos = new Vector2(Random.Range(-400, 400f), Random.Range(-400, 400f));
            AddCard(_parent, _i, _cardID, _pos);
        }
    }

    private void AddCard(Transform _parent,int _id,int _cardID,Vector2 _pos)
    {
        var _card = new Card();
        _card.Id = _id;

        _card.cardId = _cardID;
        

        var _t = CreatCard();
        _t.SetParent(_parent);
        _t.GetComponent<Image>().sprite = allImgs[_card.cardId];


        _t.GetComponent<RectTransform>().anchoredPosition = _pos;

        _t.GetChild(0).gameObject.SetActive(false);

        _card.rectTran = _t.GetComponent<RectTransform>();

        ShowJudge(_card);


        _t.GetComponent<Button>().onClick.AddListener(delegate { ClickCard(_card); });

        cardList.Add(_card);
    }

    #endregion

最终实现效果:

 

 

 

 

  第一关不用说很简单就能过,第二关凑齐30对也能过,第三关我没写保底。于是就应了那句广告词:99.9%的人都过不了第三关。

 

  真棒!!

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值