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

写一下胡牌的思路

和牌算法在下面的类里面

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

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

步骤二: 余牌数量为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,不能用GetComponentInChildren


            for (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 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值