最近《羊了个羊》很火,下载玩完之后,就觉得实现十分简单。火的有些莫名其妙,于是自己周末搞了下。
首先根据机制,有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%的人都过不了第三关。
真棒!!