Poker 發牌算法


 目前游戲行業到底怎末樣呢?
 從社會人群上看:目前社會主流是80、90、00 這三代人對游戲的接受度是很大的,越年輕,對游戲的認可度越高,不會像老一輩那樣排斥游戲。
 從國家政策上看:國家對游戲的監管力度也越來越規范和嚴謹,在保護未成年方面也越做越好,有序的市場環境逐漸在形成。
 從游戲設計產品上看:游戲的產品品質越做越好,越做越具有正向的引導和教育意義,不再是為了盈利而推出一些低俗,着迷的產品。
 從游戲硬件運用上看:目前已PC端和手游端為主,特別是手游帶動了游戲的快速發展,未來VR,人工智能的發展,以及5G時代的到來,將進一步加速游戲行業的升級與發展。隨着AI和工業自動化  的發展,大部分勞動崗位都會被機器取代,人們整體可支配時間會越來越多,而同時隨着移動設備,度可穿戴設備,VR等技術的發展,游戲這一行業勢必會成為人類一種較低成本的精神生活方式。所以在未來,專無論是優秀的內容提供商如影漪視界,還是專業的游戲內的服務提供商,都會因龐大的需求而涌現出更多。
 其中游戲中的棋牌類游戲,也越來越受玩家的歡迎,比如我們常見的斗地主,麻將更是男女老少通吃。下面我就說一下撲克的發牌算法是如何實現的:
 
Step1:創建撲克類(包含撲克花色和牌面大小)
using System;
namespace DealPoker
{
    /// <summary>
    /// 用C#模擬實現撲克牌發牌,
    /// 1、52張牌,四種花色(黑桃,紅心,梅花,方塊)
    /// 2、沒人一輪一張的方式發牌
    /// 3、最后將三個人的撲克牌大小和花色打印在控制台上
    /// 實現思路:可以將撲克牌對象存放到一個列表集合中,通過循環隨機數的方式依次發牌;
    /// 每循環一次,從列表中移除發過的牌
    /// </summary>

    //定義花色
    public enum PokerColor
    {
        紅心 = -1,
        黑桃 = -2,
        梅花 = -3,
        方塊 = -4
    }

    //定義大小
    public enum PokerNumber
    {
        Three 3,
        Four,
        Five,
        Six,
        Seven,
        Eight,
        Nine,
        Ten,
        J,
        Q,
        K,
        A,
        Two
    }

    public class Poker
    {
        //花色屬性
        public PokerColor p_Color {
            set;
            get;
        }
        //牌面屬性
        public PokerNumber p_Number {
            set;
            get;
        }
        //構造方法
        public Poker (PokerColor p_c, PokerNumber p_n)
        {
            this.p_Color = p_c;
            this.p_Number = p_n;
        }
        //打印撲克信息
        public void PrintPokerInfo ()
        {
            Console.WriteLine ("花色:" + this.p_Color + " 大小:" + p_Number);
        }
    }
}
Step2:創建撲克牌管理類(創建撲克牌對象,發牌,排序)
using System;
using System.Collections.Generic;

namespace DealPoker
{
    /// <summary>
    /// 撲克牌管理類
    /// 1、單例類
    /// 2、創建撲克牌的方法
    /// 3、依次發牌的的能力
    /// 4、打印所有玩家撲克的方法
    /// 5、打印某一個人的方法
    /// 6、按照花色對玩家撲克進行排序的方法
    /// 7、按照牌面大小進行排序的方法
    /// </summary>
    public class PokerManager
    {
        #region 單例類

        private static PokerManager _instance = null;

        private PokerManager ()
        {

        }

        public static PokerManager Instance {
            get {
                if (_instance == null) {
                    _instance new PokerManager ();
                }
                return _instance;
            }
        }

        #endregion

        //存放所有的撲克牌
        public List<Poker> allPoker = new List<Poker> ();
        //存放每個人的撲克牌集合
        public List<Poker> player01 = new List<Poker> ();
        public List<Poker> player02 = new List<Poker> ();
        public List<Poker> player03 = new List<Poker> ();

        /// <summary>
        /// 創建撲克
        /// </summary>
        public void CreatePoker ()
        {
            //外層循環控制花色,內層循環控制牌面大小
            for (int i = -4; i < 0; i++) {
                for (int j = 3; j < 16; j++) {
                    Array colorAry = Enum.GetValues (typeof(PokerColor));
                    Array numberAry = Enum.GetValues (typeof(PokerNumber));

                    PokerColor p_color = (PokerColor)colorAry.GetValue (i + 4);
                    PokerNumber p_number = (PokerNumber)numberAry.GetValue (j - 3);

                    //實例化一張撲克牌
                    Poker poker = new Poker (p_color, p_number);
                    allPoker.Add (poker);
                }
            }
        }

        //依次發牌
        public void SendPokerToPlayer ()
        {
            //創建隨機對象
            Random random = new Random ();
            //每個人拿到的牌數
            int count = allPoker.Count / 3;
            //設置發牌
            for (int i = 0; i < count; i++) {
                for (int j = 0; j < 3; j++) {
                    //隨機下標
                    int index = random.Next (0, allPoker.Count);
                    //根據下標依次發牌
                    switch (j) {
                    case 0:
                        player01.Add (allPoker [index]);
                        break;
                    case 1:
                        player02.Add (allPoker [index]);
                        break;
                    case 2:
                        player03.Add (allPoker [index]);
                        break;
                    default:
                        break;
                    }
                    allPoker.RemoveAt (index);
                }
            }
        }

        //打印所有玩家的撲克
        public void PrintPokerOfAllPlayer ()
        {
            for (int i = 0; i < 3; i++) {
                Console.WriteLine ("第{0}個人的牌是:", i + 1);
                for (int j = 0; j < player01.Count; j++) {
                    switch (i) {
                    case 0:
                        player01 [j].PrintPokerInfo ();
                        break;
                    case 1:
                        player02 [j].PrintPokerInfo ();
                        break;
                    case 2:
                        player03 [j].PrintPokerInfo ();
                        break;
                    default:
                        break;
                    }
                }
            }
        }
        //打印某個人的牌
        public void PrintSomeonePoker (List<Poker> p)
        {
            for (int i = 0; i < p.Count; i++) {
                p [i].PrintPokerInfo ();
            }

        }


        //按照花色進行排序
        public void OrderPokerByColor (List<Poker> p_List)
        {
            //方法一:
            //            p_List.Sort (SuitCompare);
            //方法二:匿名委托
            //            p_List.Sort (delegate(Poker x, Poker y) {
            //                int a = GetPokerValueByColor (x);
            //                int b = GetPokerValueByColor (y);
            //                return b.CompareTo (a);
            //            });
            //            p_List.Sort (delegate(Poker A, Poker B) {
            //                return -A.p_Number.CompareTo (B.p_Number);
            //            });
            //方法三:Lambda表達式
            p_List.Sort ((Poker x, Poker y) => {
                return GetPokerValueByColor (y).CompareTo (GetPokerValueByColor (x));
            });
        }

        //
        int SuitCompare (Poker A, Poker B)
        {
            //獲取撲克A和B的新的數值大小
            int a = GetPokerValueByColor (A);
            int b = GetPokerValueByColor (B);
            return b - a;
        }

        //按照花色獲取某張撲克代表的數值,
        //比較兩個三位數,先比較百位,其次是十位和個位
        //百位代表的是花色,十位和個位表示牌面大小
        int GetPokerValueByColor (Poker p)
        {
            //獲取撲克的花色
            PokerColor c = p.p_Color;
            //記錄每個花色的代表值
            int value = 0;
            switch (c) {
            case PokerColor.黑桃:
                value 400;
                break;
            case PokerColor.紅心:
                value 300;
                break;
            case PokerColor.梅花:
                value 200;
                break;
            case PokerColor.方塊:
                value 100;
                break;
            default:
                break;
            }

            //牌的大小
            PokerNumber num = p.p_Number;
            //記錄每張牌新的大小(花色值+牌面值)
            return value + (int)num;
        }


        //按照大小進行排序
        public void OrderPokerByNumber (List<Poker> p_List)
        {
            p_List.Sort (delegate(Poker x, Poker y) {
                int a = GetPokerValueByNumber (x);
                int b = GetPokerValueByNumber (y);
                return a.CompareTo (b);
            });
        }

        int GetPokerValueByNumber (Poker p)
        {
            //獲取撲克的牌面
            int value = (int)p.p_Number * 10;
            return value - (int)p.p_Color;
        }
    }
}
Step3:在主函數中調用
using System;
namespace DealPoker
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            //1、創建牌
            PokerManager.Instance.CreatePoker ();
            //2、依次發牌
            PokerManager.Instance.SendPokerToPlayer ();
            //3、打印撲克信息
            PokerManager.Instance.PrintPokerOfAllPlayer ();
            //4、按照花色排序玩家1的撲克(黑、紅、梅、方)
//            PokerManager.Instance.OrderPokerByColor (PokerManager.Instance.player01);
            PokerManager.Instance.OrderPokerByNumber (PokerManager.Instance.player01);
            Console.WriteLine ("玩家01按照花色排序后為:");
            PokerManager.Instance.PrintSomeonePoker (PokerManager.Instance.player01);

        }
    }
}

Poker 發牌算法—排序,

    根據對象中的某一屬性對對象進行排序
方法一:
//獲得數據列表
        List<BaseInfo> list = server.GetBaseInfo();
        //對列表排序
        list.Sort(delegate(BaseInfo A, BaseInfo B) {
            return A.Name.CompareTo(B.Name);
        });


//按照花色進行排序
        public void OrderPokerByColor (List<Poker> p_List)
        {
            //方法一:
            //            p_List.Sort (SuitCompare);
            //方法二:匿名委托
            //            p_List.Sort (delegate(Poker x, Poker y) {
            //                int a = GetPokerValueByColor (x);
            //                int b = GetPokerValueByColor (y);
            //                return b.CompareTo (a);
            //            });
            //            p_List.Sort (delegate(Poker A, Poker B) {
            //                return -A.p_Number.CompareTo (B.p_Number);
            //            });
            //方法三:Lambda表達式
            p_List.Sort ((Poker x, Poker y) => {
                return GetPokerValueByColor (y).CompareTo (GetPokerValueByColor (x));
            });
        }

        //
        int SuitCompare (Poker A, Poker B)
        {
            //獲取撲克A和B的新的數值大小
            int a = GetPokerValueByColor (A);
            int b = GetPokerValueByColor (B);
            return b - a;
        }

        //按照花色獲取某張撲克代表的數值,
        //比較兩個三位數,先比較百位,其次是十位和個位
        //百位代表的是花色,十位和個位表示牌面大小
        int GetPokerValueByColor (Poker p)
        {
            //獲取撲克的花色
            PokerColor c = p.p_Color;
            //記錄每個花色的代表值
            int value = 0;
            switch (c) {
            case PokerColor.黑桃:
                value 400;
                break;
            case PokerColor.紅心:
                value 300;
                break;
            case PokerColor.梅花:
                value 200;
                break;
            case PokerColor.方塊:
                value 100;
                break;
            default:
                break;
            }

            //牌的大小
            PokerNumber num = p.p_Number;
            //記錄每張牌新的大小(花色值+牌面值)
            return value + (int)num;
        }


        //按照大小進行排序
        public void OrderPokerByNumber (List<Poker> p_List)
        {
            p_List.Sort (delegate(Poker x, Poker y) {
                int a = GetPokerValueByNumber (x);
                int b = GetPokerValueByNumber (y);
                return a.CompareTo (b);
            });
        }

        //
        int GetPokerValueByNumber (Poker p)
        {
            //獲取撲克的牌面
            int value = (int)p.p_Number * 10;
            return value - (int)p.p_Color;
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM