/// <summary> /// 玩家出麻将 /// </summary> /// <param name="cardIndex"></param> /// <param name="cardName"></param> /// <returns></returns> private void _playerPlay(int cardIndex, string cardName, bool go) { if (!go) { UnitTool.ToolStartCoroutine(_waitCoroutine(cardIndex, cardName, false)); return; } //当前玩家的出牌 Debug.Log("Player " + index + " 出 " + cardIndex); int n = 0; for (int i = 0; i < players[index].myCards.Count; i++) { if (players[index].myCards[i].cardName == cardName) { n = i; break; } } _majiangTable.PlayMajiangAnimation(cardName, players[index].myCards, index); //保存这个玩家出的牌 pCard = players[index].myCards[n]; //清除 players[index].myCards.RemoveAt(n); //当前玩家重新排序 _sortCards(players[index].myCards); _majiangTable.ShowMajiang(players[index].myCards, index); //当前玩家出牌后,其他三个玩家进行检测胡、碰、杠操作 _checkMajiang(); }
/// <summary> /// 根据数据返回卡牌物体 /// </summary> /// <param name="cardInfo"></param> /// <returns></returns> public MCard GetCardObject(MCardInfo cardInfo) { MCard card = null; foreach (var c in uiCards) { if (c.name == cardInfo.cardName) { card = c; } } return(card); }
/// <summary> /// 判断是否能胡牌 /// </summary> /// <param name="list"></param> /// <param name="mCardInfo"></param> /// <returns></returns> public static bool IsCanHU(List <MCardInfo> list, MCardInfo mCardInfo) { List <int> pais = new List <int>(); for (int i = 0; i < list.Count; i++) { pais.Add(list[i].cardIndex); } if (mCardInfo != null) { pais.Add(mCardInfo.cardIndex); } //只有两张牌 if (pais.Count == 2) { return(pais[0] == pais[1]); } //先排序 pais.Sort(); //依据牌的顺序从左到右依次分出将牌 for (int i = 0; i < pais.Count; i++) { List <int> paiT = new List <int>(pais); List <int> ds = pais.FindAll(delegate(int d) { return(pais[i] == d); }); //判断是否能做将牌 if (ds.Count >= 2) { //移除两张将牌 paiT.Remove(pais[i]); paiT.Remove(pais[i]); //避免重复运算 将光标移到其他牌上 i += ds.Count; if (HuPaiPanDin(paiT)) { return(true); } } } return(false); }
/// <summary> /// 碰判断 /// </summary> /// <param name="list"></param> /// <param name="mCardInfo"></param> /// <returns></returns> public static int IsPeng(List <MCardInfo> list, MCardInfo mCardInfo) { int n = -1; for (int i = 0; i < list.Count - 1; i++) { if (list[i].cardIndex == list[i + 1].cardIndex && list[i].cardIndex == mCardInfo.cardIndex) { n = list[i].cardIndex; break; } } return(n); }
/// <summary> /// 清除数据 /// </summary> private void _clearDatas() { //清除桌数据 pCard = null; tCards.Clear(); temp.Clear(); //清除玩家手牌 for (int i = 0; i < 4; i++) { players[i].myCards.Clear(); } //重置玩家索引 index = MyUtil.GetRange(0, 4); //清除UI _majiangTable.ClearUi(); }
/// <summary> /// 生成卡牌数据 /// </summary> private void _initCards() { for (int i = 89; i < 123; i++) { Sprite o = FileIO.LoadSprite(i); for (int j = 0; j < 4; j++) { MCardInfo cardInfo = new MCardInfo(o.name, j + 1); tCards.Add(cardInfo); } } //洗牌 tCards = _getRandomList <MCardInfo>(tCards); }
/// <summary> /// 加载麻将图片 /// </summary> /// <param name="mCardInfo"></param> /// <returns></returns> private Sprite _initImage(MCardInfo mCardInfo, int type) { //根据卡牌信息生成图片 string path; Sprite sprite = null; //由于没有提供根据名字来加载的方法,所以只能自己通过名字取index来加载 if (type == 0) { int i = 0; string name = "n_" + mCardInfo.cardIndex.ToString(); path = "lfx/tablemajiang/spritepack/majiang/" + name; for (i = 0; i < R.SpritePack.path.Length; i++) { if (path == R.SpritePack.path[i]) { break; } } sprite = FileIO.LoadSprite(i); } else if (type == 1) { sprite = FileIO.LoadSprite(125); } else if (type == 2) { sprite = FileIO.LoadSprite(123); } else if (type == 3) { sprite = FileIO.LoadSprite(124); } if (sprite == null) { Debug.Log("Sprite Null"); return(null); } else { return(sprite); } }
/// <summary> /// 麻将动画和图片 /// </summary> /// <param name="mCardInfo"></param> /// <param name="pos"></param> /// <param name="index"></param> /// <param name="isSend"></param> private void _majiangAnimation(MCardInfo mCardInfo, Vector3 pos, int index, bool isSend) { var card = GetCardObject(mCardInfo); card.transform.localScale = new Vector3(1, 1, 1); card.image.sprite = _initImage(mCardInfo, index); if (!isSend) { card.transform.SetParent(playerTrans[index]); card.transform.SetAsFirstSibling(); } else { card.transform.SetParent(table); } _moveMajiang(mCardInfo, pos); }
/// <summary> /// 摸牌动画 /// </summary> /// <param name="mCardInfo"></param> /// <param name="index"></param> public void DrawMajiangAnimation(MCardInfo mCardInfo, int index) { Vector3 pos = Vector3.zero; if (index == 0) { pos = playerTrans[index].position + new Vector3(3f, 0, 0); } if (index == 1) { pos = playerTrans[index].position + new Vector3(-2f, 3.3f, 0); } if (index == 2) { pos = playerTrans[index].position + new Vector3(-9f, 0, 0); } if (index == 3) { pos = playerTrans[index].position + new Vector3(-2f, -3.8f, 0); } _majiangAnimation(mCardInfo, pos + new Vector3(2, 0, 0), index, false); }
/// <summary> /// 检查某个玩家是否胡牌 /// </summary> /// <param name="list"></param> /// <param name="mCardInfo"></param> /// <returns></returns> private bool _checkHu(List <MCardInfo> list, MCardInfo mCardInfo, int win) { bool canHu = false; if (MajiangRules.IsCanHU(list, mCardInfo)) { canHu = true; winIndex = win; if (mCardInfo != null) { players[win].myCards.Add(pCard); } if (winIndex % 4 != 0) { _huMajiang(); } else { _setButton(false, false, true, false); } } return(canHu); }
/// <summary> /// 移动麻将到指定的位置 /// </summary> /// <param name="cardInfo"></param> /// <param name="time"></param> private void _moveMajiang(MCardInfo mCardInfo, Vector3 endPos) { var tran = GetCardObject(mCardInfo).GetComponent <Transform>(); tran.position = endPos; }
/// <summary> /// 添加麻将到玩家的myCards列表中 /// </summary> /// <param name="mCardInfo"></param> public void AddCard(MCardInfo mCardInfo) { _myCards.Add(mCardInfo); }