目前游戲行業到底怎末樣呢?
從社會人群上看:目前社會主流是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; }