写一下胡牌的思路

和牌算法在下面的类里面

思路:
步骤一:从数组中找到一对做”将”,并从数组中移除

      依次进行步骤二的检查 检查完最后一种情况而没有返回 "能胡牌" 则返回 不能胡牌

步骤二: 余牌数量为0 则返回 “能胡牌” 否则进入下一步.

步骤三: 判断余牌前三张是否相同 相同-> 步骤四 ; 不同 -> 步骤五.

步骤四: 移除余牌中的前三张牌 , 返回步骤二.

步骤五: 若余牌中第一个数为N , 则判断是否有N + 1 与 N + 2 同时存在与余牌中 , 有将N , n+1 , n+2 从余牌中移除并返回 步骤二, 否则返回 步骤一

出牌,判断和牌算法在下面会贴相应的代码


–以下是我的代码—

缓存类

using UnityEngine;
using System.Collections;
using System.Collections.Generic;/// <summary>
/// Player缓存
/// </summary>
public class PlayerChache
{private static PlayerChache instance;private List<Card> library;private bool Iscurrent;//是否当前出牌者private bool auto;private bool cando;//当前是否有吃碰杠的行为/// <summary>/// 单例属性/// </summary>public static PlayerChache Instance{get{if (instance == null){instance = new PlayerChache();}return instance;}}/// <summary>/// 获取牌库中牌的数量/// </summary>public int CardsCount{get { return library.Count; }}public List<Card> Library{get{return library;}}public bool Iscurrent1{get{return Iscurrent;}set{Iscurrent = value;}}public bool Auto{get{return auto;}set{auto = value;}}public bool Cando{get{return cando;}set{cando = value;}}/// <summary>/// 私有构造/// </summary>private PlayerChache(){library = new List<Card>();}/// <summary>/// 向牌库中添加牌/// </summary>/// <param name="card"></param>public void AddCard(Card card){card.BelongTo = CharacterType.Desk;library.Add(card);}/// <summary>/// 删除一张牌/// </summary>/// <param name="card"></param>public void DeleteCard(Card card){library.Remove(card);}/// <summary>/// 清除内容/// </summary>public void ClearAll() {library.Clear();Iscurrent = false;instance = null;}
}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;/// <summary>
/// 桌面缓存区
/// </summary>
public class CardCache
{private static CardCache instance;private List<Card> library;private CharacterType ctype;private Suits rule;public void Init(){}/// <summary>/// 单例属性/// </summary>public static CardCache Instance{get{if (instance == null){instance = new CardCache();}return instance;}}public Suits Rule{set { rule = value; }get { return rule; }}/// <summary>/// 索引器/// </summary>/// <param name="index"></param>/// <returns></returns>public Card this[int index]{get{return library[index];}}/// <summary>/// 获取牌库中牌的数量/// </summary>public int CardsCount{get { return library.Count; }}/// <summary>/// 总权值/// </summary>public Card TotalWeight{get{return GameController.GetWeight(library.ToArray(), rule);}}/// <summary>/// 私有构造/// </summary>private CardCache(){library = new List<Card>();}/// <summary>/// 发牌/// </summary>public Card Deal(){Card ret = library[library.Count - 1];library.Remove(ret);return ret;}/// <summary>/// 向牌库中添加牌/// </summary>/// <param name="card"></param>public void AddCard(Card card ){card.BelongTo = CharacterType.Desk;library.Add(card);}/// <summary>/// 清空桌面/// </summary>public void Clear(){if (library.Count != 0){CardSprite[] cardSprites = GameObject.Find("showpoint").GetComponentsInChildren<CardSprite>();//注意这里要用GetComponentsInChildren,不能用GetComponentInChildrenfor (int i = 0; i < cardSprites.Length; i++){cardSprites[i].transform.parent = null;cardSprites[i].Destroy();}while (library.Count != 0){Card card = library[library.Count - 1];library.Remove(card);// CardControl.Instance.AddCard(card);}}}/// <summary>/// 手牌排序/// </summary>public void Sort(){CardRules.SortCards(library, true);}}

using UnityEngine;
using System.Collections;
using System.Collections.Generic;/// <summary>
/// AI缓存
/// </summary>
public class AICache
{private static AICache instance;private List<Card> library;private bool Iscurrent;//是否当前出牌者/// <summary>/// 单例属性/// </summary>public static AICache Instance{get{if (instance == null){instance = new AICache();}return instance;}}/// <summary>/// 获取牌库中牌的数量/// </summary>public int CardsCount{get { return library.Count; }}/// <summary>/// 私有构造/// </summary>private AICache(){library = new List<Card>();}/// <summary>/// 向牌库中添加牌/// </summary>/// <param name="card"></param>public void AddCard(Card card){card.BelongTo = CharacterType.Desk;library.Add(card);}public List<Card> Library{get{return library;}}public bool Iscurrent1{get{return Iscurrent;}set{Iscurrent = value;}}/// <summary>/// 删除一张牌/// </summary>/// <param name="card"></param>public void DeleteCard(Card card){library.Remove(card);}/// <summary>/// 清除内容/// </summary>public void ClearAll(){library.Clear();Iscurrent = false;instance = null;}}

玩家出牌及AI出牌的控制类

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//玩家出牌
public class PlayCard : MonoBehaviour
{private GameController controller;private void Start(){controller = GameObject.Find("GameControll").GetComponent<GameController>();}/// <summary>/// 遍历选中的牌和牌精灵/// </summary>public bool CheckSelectCards(){CardSprite[] sprites = this.GetComponentsInChildren<CardSprite>();//找出所有选中的牌List<Card> selectedCardsList = new List<Card>();List<CardSprite> selectedSpriteList = new List<CardSprite>();for (int i = 0; i < sprites.Length; i++){if (sprites[i].Select){selectedSpriteList.Add(sprites[i]);selectedCardsList.Add(sprites[i].Poker);}}//排好序CardRules.SortCards(selectedCardsList, true);//出牌return CheckPlayCards(selectedCardsList, selectedSpriteList);}/// <summary>/// 检测是否符合type类信息/// </summary>/// <returns></returns>public bool CheckCardsType(CardsType cardstype,bool cando) {HandCards player = GameObject.Find("Player").GetComponent<HandCards>();List<Card> AllCards= GetAllCards();//获取所有手牌Card deskCard = CardCache.Instance.TotalWeight;switch (cardstype) {case CardsType.fightui_chi:CardRules.SortCards(AllCards, false);if (CardRules.CanEat(AllCards,deskCard,cando)){return true;}else {Debug.Log("Can't Eat!!");return false;}case CardsType.fightui_peng:List<Card> selectedCardsList = CardRules.CanPeng(GetAllCards(), deskCard);if (selectedCardsList!=null){if (cando){for (int i = 0; i < selectedCardsList.Count; i++){player.PopCard(selectedCardsList[i]);}GameController controller = GameObject.Find("GameControll").GetComponent<GameController>();controller.ChangePosition(CharacterType.Player, CardsType.fightui_peng, selectedCardsList);controller.basePointPerMatch = controller.basePointPerMatch + 100;controller.UpdateGrade(controller.basePointPerMatch, CharacterType.Player);}return true;}return false;case CardsType.fightui_gang:List<Card> selectedList = CardRules.CanGang(GetAllCards(), deskCard);if (selectedList!=null){if (cando) {for (int i = 0; i < selectedList.Count; i++){player.PopCard(selectedList[i]);}GameController controller = GameObject.Find("GameControll").GetComponent<GameController>();controller.ChangePosition(CharacterType.Player, CardsType.fightui_gang, selectedList);controller.basePointPerMatch = controller.basePointPerMatch + 200;controller.UpdateGrade(controller.basePointPerMatch, CharacterType.Player);}return true;}return false;case CardsType.fightui_angang:return false;case CardsType.fightui_hu://判断手牌长度List<Card> newcards = GetAllCards();if (GetAllCards().Count == 13 || GetAllCards().Count == 10 || GetAllCards().Count == 7 || GetAllCards().Count == 4 || GetAllCards().Count == 1){newcards.Add(deskCard);CardRules.SortCards(newcards, true);Debug.Log("添加桌上的牌---------------检查能否胡");}if (CardRules.CanHu(newcards)) {if (cando) {controller.basePointPerMatch = controller.basePointPerMatch + 1000;controller.UpdateGrade(controller.basePointPerMatch, CharacterType.Player);}return true;}return false;}return false;}/// <summary>/// 获取chi选择的list/// </summary>public bool GetMySelectList() {//找出所有选中的牌List<CardSprite> csp =ConSpCache.Instance.Sp;//排好序//CardRules.SortCards(selectedCardsList, false);HandCards player = GameObject.Find("Player").GetComponent<HandCards>();List<Card> AllCards = GetAllCards();//获取所有手牌List<Card> theselectList = new List<Card>();for (int i=0; i<csp.Count;i++) {theselectList.Add(csp[i].Poker);}csp.Clear();for (int i = 0; i < theselectList.Count; i++){player.PopCard(theselectList[i]);}Debug.Log("GetMySelectList:"+ theselectList.Count);GameController controller = GameObject.Find("GameControll").GetComponent<GameController>();controller.ChangePosition(CharacterType.Player, CardsType.fightui_chi, theselectList);player.Integration = player.Integration + 100;controller.UpdateGrade(controller.basePointPerMatch, CharacterType.Player);buttonControl bc = GameObject.Find("ButtonPanel").GetComponent<buttonControl>();bc.canEat();return true;}/// <summary>/// 单选项直接出牌/// </summary>public void noChoice(List<Card> list) {HandCards player = GameObject.Find("Player").GetComponent<HandCards>();List<Card> AllCards = GetAllCards();//获取所有手牌List<Card> theselectList = new List<Card>();for (int i = 0; i < list.Count; i++){theselectList.Add(list[i]);}for (int i = 0; i < theselectList.Count; i++){player.PopCard(theselectList[i]);}GameController controller = GameObject.Find("GameControll").GetComponent<GameController>();controller.ChangePosition(CharacterType.Player, CardsType.fightui_chi, theselectList);player.Integration = player.Integration + 100;controller.UpdateGrade(controller.basePointPerMatch, CharacterType.Player);buttonControl bc = GameObject.Find("ButtonPanel").GetComponent<buttonControl>();bc.canEat();}/// <summary>/// 检测玩家出牌/// </summary>/// <param name="selectedCardsList"></param>/// <param name="selectedSpriteList"></param>bool CheckPlayCards(List<Card> selectedCardsList, List<CardSprite> selectedSpriteList){Card[] selectedCardsArray = selectedCardsList.ToArray();//检测是否符合出牌规则if (CardRules.PopEnable(selectedCardsArray)) {PlayCards(selectedCardsList, selectedSpriteList);Debug.Log("符合出牌规则:CheckPlayCards--true");return true;}return false;}/// <summary>/// 玩家出牌/// </summary>/// <param name="selectedCardsList"></param>/// <param name="selectedSpriteList"></param>void PlayCards(List<Card> selectedCardsList, List<CardSprite> selectedSpriteList){HandCards player = GameObject.Find("Player").GetComponent<HandCards>();//如果符合将牌从手牌移到出牌缓存区CardCache.Instance.Clear();Debug.Log("----------------"+selectedSpriteList.Count);CardCache.Instance.Rule = selectedCardsList[0].Suits;for (int i = 0; i < selectedSpriteList.Count; i++){//先进行卡牌移动player.PopCard(selectedSpriteList[i].Poker);CardCache.Instance.AddCard(selectedSpriteList[i].Poker);selectedSpriteList[i].transform.parent = GameObject.Find("showpoint").transform;}CardCache.Instance.Sort();GameController.AdjustCardSpritsPosition(CharacterType.Desk,false);GameController.AdjustCardSpritsPosition(CharacterType.Player,false);controller.Readjust(CharacterType.Player, true);//排序//把牌放到桌面存牌区域GameController.CreateSprites(CharacterType.Player,selectedCardsList[0]);if (CardControl.Instance.CardsCount==0) {controller.GameOver(Identity.none);Debug.Log("在这里结束啦啦啦啦啦啊");}}public  bool checkCardsLength(){List<Card> clist = new List<Card>();clist= GetAllCards();if (clist.Count==13||clist.Count==10||clist.Count==7||clist.Count==4||clist.Count==1) {return true;}return false;}/// <summary>/// 获取所有手牌/// </summary>/// <returns></returns>protected List<Card> GetAllCards( List<Card> exclude = null){List<Card> cards = new List<Card>();HandCards allCards = gameObject.GetComponent<HandCards>();bool isContinue = false;for (int i = 0; i < allCards.CardsCount; i++){isContinue = false;if (exclude != null){for (int j = 0; j < exclude.Count; j++){if (allCards[i] == exclude[j]){isContinue = true;break;}}}if (!isContinue)cards.Add(allCards[i]);}//从小到大排序CardRules.SortCards(cards, false);return cards;}public void StarAuto(bool start, CharacterType currentper) {StartCoroutine(DelayDiscardCard(start,currentper));}/// <summary>/// 延时出牌/// </summary>/// <returns></returns>public virtual IEnumerator DelayDiscardCard(bool start, CharacterType currentper){if (start) {yield return new WaitForSeconds(5);StarAutoControll(currentper);}}/// <summary>/// 移除手牌/// </summary>/// <param name="cards"></param>protected void RemoveCards(List<Card> cards){HandCards allCards = gameObject.GetComponent<HandCards>();for (int j = 0; j < cards.Count; j++){for (int i = 0; i < allCards.CardsCount; i++){if (cards[j] == allCards[i]){allCards.PopCard(cards[j]);break;}}}}/// <summary>/// 获得card对应的精灵/// </summary>/// <param name="cards"></param>/// <returns></returns>protected List<CardSprite> GetSprite(List<Card> cards){HandCards t = gameObject.GetComponent<HandCards>();CardSprite[] sprites = GameObject.Find(t.cType.ToString()).GetComponentsInChildren<CardSprite>();List<CardSprite> selectedSpriteList = new List<CardSprite>();for (int i = 0; i < sprites.Length; i++){for (int j = 0; j < cards.Count; j++){if (cards[j] == sprites[i].Poker){selectedSpriteList.Add(sprites[i]);break;}}}return selectedSpriteList;}/// <summary>/// 出牌/// </summary>public void SendCards() {HandCards player = GameObject.Find("Player").GetComponent<HandCards>();CardSprite[] sprites = this.GetComponentsInChildren<CardSprite>();//找出所有选中的牌List<Card> selectedCardsList = new List<Card>();selectedCardsList.Add(player.NewCard);//出牌CheckPlayCards(selectedCardsList, GetSprite(selectedCardsList));}/// <summary>/// 开始自动回牌  获取当前出牌者  想写一个托管方法的,但是情况太复杂然后时间不太够我就放弃了...ggg/// </summary>public void StarAutoControll(CharacterType currentper) {}}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;//AI的出牌控制
public class SimpleSmartCard  : SmartCard
{private CharacterType cType;public CharacterType CType{get{return cType;}set{cType = value;}}/// <summary>/// 开始回牌/// </summary>public void startSend(bool isNone ) {//将摸到的牌发出去AutoDiscardCard(isNone);}
}

出牌算法,判断和牌

算法的思路是百度上的,算法是自己设计的

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
//玩家出牌主算法
public class CardRules
{public static void SortCards(List<Card> cards, bool ascending){cards.Sort((Card a, Card b) =>{if (!ascending){//先按照权重降序,再按花色升序return -a.Suits.CompareTo(b.Suits) * 2 +a.Weight.CompareTo(b.Weight);}else//按照权重升序return a.Weight.CompareTo(b.Weight);});}/// <summary>/// 是否能吃牌  /// </summary>///    查花色   查权值是否相邻public static bool CanEat(List<Card> list,Card deskcard,bool todoeat) {List<Card> newlist = new List<Card>();List<Card> cardcount = new List<Card>();if (list.Count<3) {return false;}//找 n-1,n-2   n+1,n+2Card Nc1=null, Nc2=null, Nadd1=null, Nadd2=null;for (int i=0;i<list.Count ;i++) {if (deskcard.Weight==(list[i].Weight+1)) {if (deskcard.Suits==list[i].Suits) {Nc1 = list[i];break;}}}for (int i = 0; i < list.Count; i++){if (deskcard.Weight == (list[i].Weight + 2)){if (deskcard.Suits == list[i].Suits){Nc2 = list[i];break;}}}for (int i = 0; i < list.Count; i++){if (deskcard.Weight == (list[i].Weight -1)){if (deskcard.Suits == list[i].Suits){Nadd1 = list[i];break;}}}for (int i = 0; i < list.Count; i++){if (deskcard.Weight == (list[i].Weight - 2)){if (deskcard.Suits == list[i].Suits){Nadd2 = list[i];break;}}}if (Nc1!=null&&Nc2!=null) {newlist.Add(Nc2);newlist.Add(Nc1);newlist.Add(deskcard);cardcount.Add(Nc2);cardcount.Add(Nc1);}if (Nc1 != null && Nadd1 != null){cardcount.Add(Nc1);cardcount.Add(Nadd1);newlist.Add(Nc1);newlist.Add(deskcard);newlist.Add(Nadd1);}if (Nadd1 != null && Nadd2 != null) {cardcount.Add(Nadd1);cardcount.Add(Nadd2);newlist.Add(deskcard);newlist.Add(Nadd1);newlist.Add(Nadd2);}if (cardcount.Count == 2){if (todoeat) {ConSpCache.Instance.CardClear();GameController.CometoEat(newlist);}return true;}else if(cardcount.Count<=1){return false;}if (Nc1!=null&&Nc2!=null) {newlist.Clear();newlist.Add(Nc2);newlist.Add(Nc1);newlist.Add(deskcard);if (todoeat) {GameController.MakeDialogCell(newlist);}}if (Nc1 != null && Nadd1 != null){newlist.Clear();newlist.Add(Nc1);newlist.Add(deskcard);newlist.Add(Nadd1);if (todoeat){GameController.MakeDialogCell(newlist);}}if (Nadd1 != null && Nadd2 != null){newlist.Clear();newlist.Add(deskcard);newlist.Add(Nadd1);newlist.Add(Nadd2);if (todoeat){GameController.MakeDialogCell(newlist);}}if (newlist.Count>=3) {return true;}return false;}/// <summary>/// 碰牌/// </summary>/// <param name="cardlist"></param>/// <returns></returns>///  查花色   再看权值是否相等public static List<Card> CanPeng(List<Card> cardlist,Card deskcard) {if (cardlist.Count < 3){return null;}for (int i= 0; i<cardlist.Count;i++) {if (deskcard.Weight==cardlist[i].Weight&& deskcard.Suits==cardlist[i].Suits) {for (int n = i + 1; n < cardlist.Count; n++){if (deskcard.Weight == cardlist[n].Weight && deskcard.Suits == cardlist[n].Suits) {List<Card> list = new List<Card>();list.Add(deskcard);list.Add(cardlist[i]);list.Add(cardlist[n]);return list;}}}}return null;}/// <summary>/// 杠牌/// </summary>/// <param name="cardlist"></param>/// <returns></returns>///  首先查长度是否正确   再查花色   再看权值是否相等public static List<Card> CanGang(List<Card> list,Card deskcard){if (list.Count < 3){return null;}List<Card> newlist = new List<Card>();for (int i=0; i<list.Count;i++) {if (list[i].Suits==deskcard.Suits) {if (list[i].Weight == deskcard.Weight) {newlist.Add(list[i]);}}}if (newlist.Count>=3) {return newlist;}return null;}/// <summary>/// 判断是否符合出牌规则/// </summary>/// <param name="cards"></param>/// <param name="type"></param>/// <returns></returns>public static bool PopEnable(Card[] cards){bool isRule = false;if (cards==null) {return false;}//Debug.Log("选中的牌:" + cards[0].CardName);if (cards.Length>0&&cards.Length<=1) {isRule=true;return isRule;}return isRule; }/// <summary>/// 胡    首先拿到所有手牌/// </summary>/// <returns></returns>public static bool CanHu(List<Card> clist) {//根据不同花色的牌长度分别进行处理// DealCardLength(Suits.Tiao,clist);if (DealCardlist(clist)) {return true;}return false;//思路://步骤一:从数组中找到一对做"将",并从数组中移除//  依次进行步骤二的检查 检查完最后一种情况而没有返回 "能胡牌" 则返回 不能胡牌//步骤二: 余牌数量为0 则返回 "能胡牌" 否则进入下一步.//步骤三: 判断余牌前三张是否相同 相同-> 步骤四 ; 不同 -> 步骤五.//步骤四: 移除余牌中的前三张牌 , 返回步骤二.//步骤五: 若余牌中第一个数为N , 则判断是否有N + 1 与 N + 2 同时存在与余牌中 , 有将N , n+1 , n+2 从余牌中移除并返回 步骤二, 否则返回 步骤一}/// <summary>/// 筛选出同花色的牌/// </summary>/// <param name="suit"></param>/// <param name="clist"></param>/// <returns></returns>private static List<Card> DealSuit(Suits suit,List<Card> clist){List<Card> newCardlist = new List<Card>();for (int i = 0; i < clist.Count; i++){if (clist[i].Suits==suit) {newCardlist.Add(clist[i]);}}CardRules.SortCards(clist, false);if (newCardlist.Count==0) {return null;}return newCardlist;}/// <summary>/// 判断牌长  根据牌长度做出不同选择/// </summary>/// <param name="suit"></param>/// <param name="clist"></param>/// <returns></returns>private static bool DealCardLength(Suits suit,List<Card> clist) {if (DealCardlist(clist)) {return true;};return false;}private static bool DealCardlist(List<Card> clist) {if (clist.Count==2) {if (clist[0].Suits==clist[1].Suits) {if (clist[0].Weight == clist[1].Weight) {return true;}}}int count = 1;//下标移动//先找对子for (int x = 0; x < clist.Count; x++){List<Card> newlist = new List<Card>();newlist.Clear();for (int i=0; i<clist.Count;i++) {newlist.Add(clist[i]);}CardRules.SortCards(newlist, false);//排序newlist = FindDouble(newlist, count);count++;if (newlist != null){for (int index = 0; index < newlist.Count; index++){int length1 = 0, length2 = 0;newlist = FindThereSame(newlist);//找三同length1 = newlist.Count;newlist = FindThereCount(newlist);//找顺子length2 = newlist.Count;if (newlist.Count == 0){Debug.Log("hule!!!");return true;}if (length1 == 0||length2==0){return true;}if (newlist.Count < 3){//检查余牌长度Debug.Log("余牌长度!!!Length=" + newlist.Count);return false;}}if (newlist.Count == 0){Debug.Log("hule!!!");return true;}if (newlist.Count < 3){//检查余牌长度Debug.Log("余牌长度!!!Length=" + newlist.Count);return false;}}else{//list=null没有对子,直接GG Debug.Log("null!!!");return false;}}return false;}//找对 找到对子就删除private static List<Card> FindDouble(List<Card> list,int i){if (i >= list.Count){return null;}for (;i<list.Count;i++) {if (list[i - 1].Weight == list[i].Weight){if (list[i-1].Suits == list[i].Suits){//检查花色是否相同if (i <=list.Count - 1){list.Remove(list[i]);//在这里我先删除游标大的再删除小的list.Remove(list[i - 1]);return list;}}}}return null;}/// <summary>/// 找三同/// </summary>/// <param name="list"></param>/// <returns></returns>private static List<Card> FindThereSame(List<Card> list){if (list.Count<3) {return list;}for (int n=0; n<list.Count;n++) {int i = n+1;if (i>=list.Count) {break;}for (; i < list.Count; i++){if (list[n].Weight == list[n].Weight){if (list[n].Suits == list[i].Suits){//检查花色是否相同if (n != i){break;}}}}int z = i+1;if (z >= list.Count){continue;}for (; z < list.Count; z++) {if (list[i].Weight == list[z].Weight){if (list[n].Suits == list[z].Suits) {if (n != z){break;}}}}if (z==list.Count) {z = z - 1;}//有可能历遍完了也没有找到三同,所以需要再查一次花色和权值if (list[n].Suits == list[i].Suits&&list[i].Suits==list[z].Suits) {if (list[n].Weight == list[z].Weight && list[i].Weight == list[z].Weight) {if (n != i && n != z){list.Remove(list[z]);list.Remove(list[i]);list.Remove(list[n]);return list;}}}}return list;}/// <summary>/// 找三顺/// </summary>/// <param name="list"></param>/// <returns></returns>private static List<Card> FindThereCount(List<Card> list){if (list.Count < 3){return list;}for (int n = 0; n < list.Count; n++){int i = n+1;if (i >= list.Count){break;}for (; i < list.Count; i++){if (list[n].Weight == (list[i].Weight-1)){if (list[n].Suits == list[i].Suits){//检查花色是否相同if (n != i){break;}}}}int z = i + 1;if (z >= list.Count){continue;}for (; z < list.Count; z++){if (list[i].Weight ==(list[z].Weight-1)){if (list[n].Suits == list[z].Suits){if (n != z){break;}}}}if (z== list.Count)//注意这里的z在历遍循环以后会+1{z = z - 1;}else {//有可能历遍完了也没有找到三顺,所以需要再查一次花色和权值if (list[n].Suits == list[i].Suits && list[i].Suits == list[z].Suits){if (list[n].Weight == (list[i].Weight - 1) && list[i].Weight == (list[z].Weight - 1)){if (n != i && n != z){list.Remove(list[z]);list.Remove(list[i]);list.Remove(list[n]);return list;}}}}}return list;}private static bool isEnd() {CardControl c = CardControl.Instance;if (c.IsEnd) {//如果游戏结束}return false;}}
using UnityEngine;
using System.Collections;
using System.Collections.Generic;/// <summary>
/// 电脑出牌AI出牌
/// </summary>
public abstract class SmartCard : MonoBehaviour
{public GameObject showType;public GameController controller;// Use this for initializationvoid Start(){showType = transform.Find("showType").gameObject;showType.SetActive(false);}/// <summary>/// notice /// </summary>protected void ShowNotice(CardsType type){showType.SetActive(true);showType.GetComponent<UISprite>().spriteName=type.ToString();showType.GetComponent<TweenAlpha>().ResetToBeginning();showType.GetComponent<TweenAlpha>().PlayForward();StartCoroutine(DisActiveNotice(showType));}protected IEnumerator DisActiveNotice(GameObject notice){yield return new WaitForSeconds(2.0f);showType.SetActive(false);}/// <summary>/// 自动出牌/// </summary>public void AutoDiscardCard(bool isNone){HandCards t = gameObject.GetComponent<HandCards>();GameController controller = GameObject.Find("GameControll").GetComponent<GameController>();if (CharacterType.AI == t.cType){if (isNone) {//延时出牌// StartCoroutine(DelayDiscardCard(isNone));//直接出牌//Send();StartCoroutine(DelayDealCard(true));}}}/// <summary>/// 检查是否可以做某事/// </summary>/// <returns></returns>public void checkCando() {if (CanEat(GetAllCards(), CardCache.Instance.TotalWeight) != null){ShowNotice(CardsType.fightui_chi);//可以吃牌List<Card> list = CanEat(GetAllCards(), CardCache.Instance.TotalWeight);HandCards player = GameObject.Find("AI").GetComponent<HandCards>();List<Card> AllCards = GetAllCards();//获取所有手牌List<Card> theselectList = new List<Card>();for (int i = 0; i < list.Count; i++){theselectList.Add(list[i]);}for (int i = 0; i < theselectList.Count; i++){player.PopCard(theselectList[i]);}GameController controller = GameObject.Find("GameControll").GetComponent<GameController>();controller.ChangePosition(CharacterType.AI, CardsType.fightui_chi, theselectList);PlayerChache.Instance.DeleteCard(CardCache.Instance.TotalWeight);player.Integration = player.Integration + 100;controller.UpdateGrade(controller.basePointPerMatch, CharacterType.AI);controller.ReCreateSprites(CharacterType.Player, PlayerChache.Instance.Library);// controller.ReCreateSprites(CharacterType.AI, AICache.Instance.Library);//吃完检查能否胡if (CheckHu()){ShowNotice(CardsType.fightui_hu);//能胡游戏结束controller.GameOver(Identity.fightui_host);Debug.Log("在这里结束啦啦啦啦啦啊");}else{if (Send(false)) {//游戏结束了----if (!checkEnd()){controller.TrunNext(CharacterType.AI);}}}}else if (CanPeng(GetAllCards(), CardCache.Instance.TotalWeight) != null){//可以碰ShowNotice(CardsType.fightui_peng);List<Card> selectedCardsList = CanPeng(GetAllCards(), CardCache.Instance.TotalWeight);HandCards player = GameObject.Find("AI").GetComponent<HandCards>();for (int i = 0; i < selectedCardsList.Count; i++){player.PopCard(selectedCardsList[i]);}GameController controller = GameObject.Find("GameControll").GetComponent<GameController>();controller.ChangePosition(CharacterType.AI, CardsType.fightui_peng, selectedCardsList);PlayerChache.Instance.DeleteCard(CardCache.Instance.TotalWeight);controller.ReCreateSprites(CharacterType.Player, PlayerChache.Instance.Library);// controller.ReCreateSprites(CharacterType.AI, AICache.Instance.Library);controller.basePointPerMatch = controller.basePointPerMatch + 100;controller.UpdateGrade(controller.basePointPerMatch, CharacterType.AI);//碰完检查能否胡if (CheckHu()){//能胡游戏结束controller.GameOver(Identity.loser);Debug.Log("在这里结束啦啦啦啦啦啊");}else{if (Send(false)) {if (!checkEnd()){buttonControl bc = GameObject.Find("ButtonPanel").GetComponent<buttonControl>();controller.TrunNext(CharacterType.AI);bc.Cando();}}}}else if (CanGang(GetAllCards(), CardCache.Instance.TotalWeight) != null){//可以杠ShowNotice(CardsType.fightui_gang);List<Card> selectedList = CanGang(GetAllCards(), CardCache.Instance.TotalWeight);HandCards player = GameObject.Find("AI").GetComponent<HandCards>();for (int i = 0; i < selectedList.Count; i++){player.PopCard(selectedList[i]);}GameController controller = GameObject.Find("GameControll").GetComponent<GameController>();controller.ChangePosition(CharacterType.AI, CardsType.fightui_gang, selectedList);controller.basePointPerMatch = controller.basePointPerMatch + 200;controller.UpdateGrade(controller.basePointPerMatch, CharacterType.AI);PlayerChache.Instance.DeleteCard(CardCache.Instance.TotalWeight);//   controller.deleteCardOnDestory(CharacterType.Player,PlayerChache.Instance.Library);controller.ReCreateSprites(CharacterType.Player, PlayerChache.Instance.Library);//杠完补牌controller.AddCard(CharacterType.AI);//检查能否胡if (CheckHu()){ShowNotice(CardsType.fightui_hu);Debug.Log("在这里结束啦啦啦啦啦啊");//能胡游戏结束controller.GameOver(Identity.loser);}else{if (Send(false)) {if (!checkEnd()){//检查能否吃碰杠buttonControl bc = GameObject.Find("ButtonPanel").GetComponent<buttonControl>();controller.TrunNext(CharacterType.AI);bc.Cando();}}}}else {Debug.Log("AI直接出牌。。。。");if (Send(true)) {if (!checkEnd()){//检查player能否吃碰杠buttonControl bc = GameObject.Find("ButtonPanel").GetComponent<buttonControl>();controller.TrunNext(CharacterType.AI);bc.Cando();}}}}public virtual IEnumerator DelayDealCard(bool isNone){checkCando();yield return new WaitForSeconds(0.5f);}public bool CheckHu() {//判断手牌长度if (GetAllCards().Count == 13 || GetAllCards().Count == 10 || GetAllCards().Count == 7 || GetAllCards().Count == 4 || GetAllCards().Count == 1){Card deskc = CardCache.Instance.TotalWeight;GetAllCards().Add(deskc);CardRules.SortCards(GetAllCards(), true);}if (CardRules.CanHu(GetAllCards())){controller.basePointPerMatch = controller.basePointPerMatch + 1000;controller.UpdateGrade(controller.basePointPerMatch, CharacterType.AI);return true;}return false;}public bool Send(bool sendcard) {HandCards t = gameObject.GetComponent<HandCards>();GameController controller = GameObject.Find("GameControll").GetComponent<GameController>();if (CardControl.Instance.CardsCount != 0){Card card;if (sendcard){card = controller.AddCard(CharacterType.AI);//发一张}else {card=t[0];//挑一张发}List<Card> discard = new List<Card>();discard.Clear();discard.Add(card);RemoveCards(discard);if (!DiscardCards(discard, GetSprite(discard))) {//游戏结束return false;}}return true;}/// <summary>/// 出牌动画/// </summary>/// <param name="selectedCardsList"></param>/// <param name="selectedSpriteList"></param>protected bool DiscardCards(List<Card> selectedCardsList, List<CardSprite> selectedSpriteList){Card[] selectedCardsArray = selectedCardsList.ToArray();//检测是否符合出牌规则Suits type= selectedCardsArray[0].Suits;if (CardRules.PopEnable(selectedCardsArray )){HandCards player = gameObject.GetComponent<HandCards>();//如果符合将牌从手牌移到出牌缓存区CardCache.Instance.Clear();CardCache.Instance.Rule =type ;for (int i = 0; i < selectedSpriteList.Count; i++){CardCache.Instance.AddCard(selectedSpriteList[i].Poker);selectedSpriteList[i].transform.parent = GameObject.Find("showpoint").transform;selectedSpriteList[i].Poker = selectedSpriteList[i].Poker;Debug.Log("符合:DiscardCards():+ type" + type + "selectedSpriteList[i].Poker" + selectedSpriteList[i].sprite.spriteName);}CardCache.Instance.Sort();GameController.AdjustCardSpritsPosition(CharacterType.Desk, true);GameController.AdjustCardSpritsPosition(CharacterType.AI,false);GameController.CreateSprites(CharacterType.AI,selectedCardsList[0]);//在这里存放判断游戏什么时候结束的逻辑controller = GameObject.Find("GameControll").GetComponent<GameController>();if (player.CardsCount==0) {controller.GameOver(Identity.loser);Debug.Log("在这里结束啦啦啦啦啦啊");}else if (CardControl.Instance.CardsCount==0) {Debug.Log("AI这里结束了一次");controller.GameOver(Identity.none);//牌出完了return false;}}return true;}/// <summary>/// 判断游戏什么时候结束/// </summary>public bool checkEnd() {HandCards player = gameObject.GetComponent<HandCards>();if (player.CardsCount == 0){Debug.Log("在这里结束啦啦啦啦啦啊");controller.GameOver(Identity.none);return true;}else if (CardControl.Instance.CardsCount == 0){Debug.Log("在这里结束啦啦啦啦啦啊");controller.GameOver(Identity.none);//牌出完了return true;}return false;}/// <summary>/// 获取所有手牌/// </summary>/// <returns></returns>protected List<Card> GetAllCards(List<Card> exclude = null){List<Card> cards = new List<Card>();HandCards allCards = gameObject.GetComponent<HandCards>();bool isContinue = false;for (int i = 0; i < allCards.CardsCount; i++){isContinue = false;if (exclude != null){for (int j = 0; j < exclude.Count; j++){if (allCards[i] == exclude[j]){isContinue = true;break;}}}if (!isContinue)cards.Add(allCards[i]);}//从小到大排序CardRules.SortCards(cards, false);return cards;}/// <summary>/// 获得card对应的精灵/// </summary>/// <param name="cards"></param>/// <returns></returns>protected List<CardSprite> GetSprite(List<Card> cards){HandCards t = gameObject.GetComponent<HandCards>();CardSprite[] sprites = GameObject.Find(t.cType.ToString()).GetComponentsInChildren<CardSprite>();List<CardSprite> selectedSpriteList = new List<CardSprite>();for (int i = 0; i < sprites.Length; i++){for (int j = 0; j < cards.Count; j++){if (cards[j] == sprites[i].Poker){selectedSpriteList.Add(sprites[i]);break;}}}return selectedSpriteList;}/// <summary>/// 移除手牌/// </summary>/// <param name="cards"></param>protected void RemoveCards(List<Card> cards){HandCards allCards = gameObject.GetComponent<HandCards>();for (int j = 0; j < cards.Count; j++){for (int i = 0; i < allCards.CardsCount; i++){if (cards[j] == allCards[i]){allCards.PopCard(cards[j]);break;}}}}/// <summary>/// 是否能吃牌  /// </summary>///    查花色   查权值是否相邻public  List<Card> CanEat(List<Card> list, Card deskcard){List<Card> newlist = new List<Card>();if (list.Count < 3){return null;}//找 n-1,n-2   n+1,n+2Card Nc1 = null, Nc2 = null, Nadd1 = null, Nadd2 = null;for (int i = 0; i < list.Count; i++){if (deskcard.Weight == (list[i].Weight + 1)){if (deskcard.Suits == list[i].Suits){Nc1 = list[i];break;}}}for (int i = 0; i < list.Count; i++){if (deskcard.Weight == (list[i].Weight + 2)){if (deskcard.Suits == list[i].Suits){Nc2 = list[i];break;}}}for (int i = 0; i < list.Count; i++){if (deskcard.Weight == (list[i].Weight - 1)){if (deskcard.Suits == list[i].Suits){Nadd1 = list[i];break;}}}for (int i = 0; i < list.Count; i++){if (deskcard.Weight == (list[i].Weight - 2)){if (deskcard.Suits == list[i].Suits){Nadd2 = list[i];break;}}}if (list.Count == 3){return newlist;}if (Nc1 != null && Nc2 != null){newlist.Add(Nc2);newlist.Add(Nc1);newlist.Add(deskcard);return newlist;}if (Nc1 != null && Nadd1 != null){newlist.Clear();newlist.Add(Nc1);newlist.Add(deskcard);newlist.Add(Nadd1);return newlist;}if (Nadd1 != null && Nadd2 != null){newlist.Clear();newlist.Add(deskcard);newlist.Add(Nadd1);newlist.Add(Nadd2);return newlist;}return null;}/// <summary>/// 碰牌/// </summary>/// <param name="cardlist"></param>/// <returns></returns>///  查花色   再看权值是否相等public  List<Card> CanPeng(List<Card> cardlist, Card deskcard){if (cardlist.Count < 3){return null;}for (int i = 0; i < cardlist.Count; i++){if (deskcard.Weight == cardlist[i].Weight && deskcard.Suits == cardlist[i].Suits){for (int n = i + 1; n < cardlist.Count; n++){if (deskcard.Weight == cardlist[n].Weight && deskcard.Suits == cardlist[n].Suits){List<Card> list = new List<Card>();list.Add(deskcard);list.Add(cardlist[i]);list.Add(cardlist[n]);return list;}}}}return null;}/// <summary>/// 杠牌/// </summary>/// <param name="cardlist"></param>/// <returns></returns>///  首先查长度是否正确   再查花色   再看权值是否相等public  List<Card> CanGang(List<Card> list, Card deskcard){if (list.Count < 3){return null;}List<Card> newlist = new List<Card>();for (int i = 0; i < list.Count; i++){if (list[i].Suits == deskcard.Suits){if (list[i].Weight == deskcard.Weight){newlist.Add(list[i]);}}}if (newlist.Count >= 3){return newlist;}return null;}public void hu(List<Card> list) {CardRules.CanHu(list);}//Coroutine协程似乎是一个很高级的东西,随后大多数语言或多或少都支持协程。//协程也被叫做轻量级线程。通俗点讲就是定义一大堆任务,然后通过一个线程轮着对每个任务都执行一下,协作运行。//它的厉害之处在于每运行到一个任务的时候,它都可以从这个任务上一次中断的地方开始运行。
}

完全的新手入门_使用Unity做个单机二人小麻将(二) 吃碰杠胡牌算法相关推荐

  1. unity3d做会减少的血条_用Unity做血条或进度条常用脚本 - 纳金网

    本节汇宝盆为大家带来的是:用Unity做血条或进度条常用脚本 * 血条或进度条的效果 用Unity3d做血条或进度条真的很方便,GUI里scrollbar就可以轻松实现,再加上lerp一个血条或进度条 ...

  2. 新手入门宝典:从零开始做微信小程序开发

    微信小程序联盟出品.jpg 开发前必读简要 基于大量无效开发,无法上线的案例,所以开发前部分知识十分重要:| 链接 微信小程序个人注册简单步骤 打开mp.weixin.qq.com,点击右上角立即注册 ...

  3. python设计麻将_麻将胡牌算法,python版本

    #!/usr/bin/env python #coding=utf-8 ####################################################### #C 语言版 # ...

  4. 新手入门:你适合做程序员吗?

    从我第一次接触vb到现在,断断续续的学习编程已经快有4年了.我感觉如果想做一名普通的程序员,并不需要太高的IQ,反而兴趣与耐心是最重要的.很多还未入门的新手一定想知道自己是否适合做一名程序员,那我就带 ...

  5. 如何学python新手入门_如何学习Python,以及新手如何入门?

    好久以前就想写这个回答了. 学校里面开了一门极其火的python通识课,我幸运选上,加上我对python还是比较感兴趣的.就这样我开始了我的python学习之路. 提前说明吧,我真的还只是一个纯纯纯新 ...

  6. unity入门_探索Unity MARS入门模板

    unity入门 Starter Templates are predesigned, customizable building blocks created to help AR developer ...

  7. tcp unity 图片_用 Unity 做个游戏(七) - TCP Socket 客户端

    前言 这真的是最后一篇有关基础框架的文章了! 写到这里已经第七篇了orz之前的其实还是挺枯燥的,都是些基础方面的东西,并看不到什么有趣的内容 可能是我把事情想的太复杂了吧,所有东西都想做到能力范围内的 ...

  8. 后羿采集器怎么导出数据_数据采集教程_新手入门_常见问题清单_后羿采集器

    1.如果您是新手,请务必先看一下官网视频讲解教程. 视频教程是由我们官方培训讲师给大家讲解后羿采集器的使用方法,每一篇教程其实都很简短,如果大家在开始采集之前先看一下这些视频讲解教程,大部分问题都能得 ...

  9. 腐烂国度2巨霸版计算机学知识,【图片】《腐烂国度2:巨霸版》新手入门_腐烂国度2吧_百度贴吧...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 前期建设 建造建筑的前提是金属材料,这一个每个都是.这个游戏开始建议造两个设施,一个是医务室,一个是工坊.这两个建筑可以帮助我们度过前期.医护室可以治疗我 ...

  10. kurtzpel亚服服务器位置,kurtzpel新手pve攻略汇总_kurtzpel新手入门_游戏堡

    <kurtzpel>新手pve攻略汇总,这游戏亚服才发展没多久,pve模式永恒难度下坑比队友太多.此贴目的是为了给大量萌新开荒永恒难度副本用的,欢迎大家一起来编辑. 复苏的傀儡 注意事项 ...

最新文章

  1. Java HashMap和Hashtable的区别
  2. vba 定义类_VBA|自定义类型、枚举类型和类模块及其使用
  3. 知识点小记之转义字符
  4. SDCC 2015前端专场札记:Facebook、百度、腾讯、美团、饿了么等互联网公司的前端实战
  5. How to become the truely yourself?
  6. android 环形时间显示_使用Arduino构建OLED显示屏与Android手机接口的智能手表
  7. 域内禁止不明东西连接DHCP
  8. 提交成功信息显示_上海居住证积分从提交材料,到打印通知单要多久?
  9. java编程编一个小系统_如何编写一个java学生信息管理系统?
  10. ubuntu 安装Docker教程
  11. 在电脑上安装python-在电脑上安装python的方法
  12. debian英文环境中中文输入
  13. 【有限差分法】(三)一维和二维抛物方程CN格式以及长时间稳定性分析(附算例与Python代码)
  14. 怎样解决CMD命令行窗口中文乱码问题
  15. deepin驱动精灵_Deepin 15.4.1 X64官方正式版(64位)
  16. 获取当天开始时间以及结束时间
  17. BDTC 2016 出品人阵容曝光!附首批邀请嘉宾名单
  18. Python_从零开始学习_(27) 字符串
  19. HCL打开显示当前系统用户怎么解决_iPhone8手机变成白苹果怎么办?
  20. 如何利用少数粉丝,实现短时间流量倍增?

热门文章

  1. JavaWeb之前端知识
  2. 还在为英语学习发愁吗?身为程序员的你可能需要这样一份“宝典”(下)
  3. (四部曲泸沽湖)--累了睡在马路上
  4. 推荐这些实用但冷门的软件
  5. 嵌入式Linux开发-根文件系统本地挂载
  6. METASTOCK数据文件格式解析
  7. 使用Selenium+Chrome爬取淘宝美食
  8. 怎样进行电路板的抗干扰设计
  9. python自动化办公之爬取HTML目录样式写入word文档实战(含NO pandoc was found报错解决)
  10. Python爬取科比职业生涯高清图集