服務器開發- 牌和牌的基本操做

一週又過去了,今天一天差很少都是在牀上躺過去了。web

下午起牀到樓下吃了一碗炸醬麪數組

而後不知道該幹啥,因而就回家打開電腦,開始繼續寫博客服務器


 

上一篇咱們一塊兒完成了早.net core下的websocket的的中間件的開發。websocket

基本的東西算是有了,今天咱們來關注一下游戲邏輯的問題dom

開篇的時候,咱們提到過,咱們要開發的是一個炸金花的棋牌遊戲(沒玩過的同窗請傳送到百度百科https://baike.baidu.com/item/%E7%82%B8%E9%87%91%E8%8A%B1/8806924?fr=aladdinsocket

首先咱們捋一下服務器須要作的東西spa

  • 定義一副撲克牌的類型
  • 炸金花遊戲的牌型
  • 洗牌,生成N家牌

先定義好撲克牌的基本類型

/// <summary>
    ////// </summary>
    public class CardType
    {

        public static int A_A = 0;
      public static int B_A = 1;
        public static int C_A = 2;
      public static int D_A = 3;

     public static int A_2 = 4;
     public static int B_2 = 5;
    public static int C_2 = 6;
    public static int D_2 = 7;

     public static int A_3 = 8;
    public static int B_3 = 9;
    public static int C_3 = 10;
     public static int D_3 = 11;

     public static int A_4 = 12;
     public static int B_4 = 13;
    public static int C_4 = 14;
     public static int D_4 = 15;

     public static int A_5 = 16;
     public static int B_5 = 17;
     public static int C_5 = 18;
     public static int D_5 = 19;

     public static int A_6 = 20;
     public static int B_6 = 21;
    public static int C_6 = 22;
    public static int D_6 = 23;

    public static int A_7 = 24;
     public static int B_7 = 25;
    public static int C_7 = 26;
    public static int D_7 = 27;

     public static int A_8 = 28;
     public static int B_8 = 29;
    public static int C_8 = 30;
     public static int D_8 = 31;

    public static int A_9 = 32;
    public static int B_9 = 33;
    public static int C_9 = 34;
    public static int D_9 = 35;

    public static int A_10 = 36;
    public static int B_10 = 37;
    public static int C_10 = 38;
    public static int D_10 = 39;

    public static int A_J = 40;
    public static int B_J = 41;
    public static int C_J = 42;
    public static int D_J = 43;

    public static int A_Q = 44;
     public static int B_Q = 45;
    public static int C_Q = 46;
    public static int D_Q = 47;

     public static int A_K = 48;
    public static int B_K = 49;
    public static int C_K = 50;
    public static int D_K = 51;


    public static int W_XW = 52;

    public static int W_DW = 53;



    }

使用的時候靜態的int類型做爲牌的數據類型 變量名ABCD分別表明黑桃,紅心 ,梅花 ,方塊四種類型。W開頭的表明撲克牌中的大王小王用下劃線分割。.net

發牌就把int類型的數字發出去就行了,後面使用這個數字來判斷是什麼牌code

如何獲取牌型?

經過反射,獲取CardType的字段的名稱中間件

static FieldInfo[] list = typeof(CardType).GetFields(BindingFlags.Static | BindingFlags.Public);

而後經過字段類型的對比,獲取到時什麼牌

 public static string TestCardName(int cardNumber)
        {


            foreach (var item in list)
            {
                int a = (int)item.GetValue(null);
                if (a == cardNumber)
                {
                    string name = "";
                    var cardName = item.Name.Split("_");
                    switch (cardName[0])
                    {
                        case "A":
                            name = "黑桃";
                            break;
                        case "B":
                            name = "紅桃";
                            break;
                        case "C":
                            name = "梅花";
                            break;
                        case "D":
                            name = "方塊";
                            break;


                    }
                    if (name != "")
                    {
                        name += cardName[1];
                    }
                    //特殊牌型判斷
                    if (item.Name.Contains("XW"))
                    {
                        name = "小王";
                    }
                    if (item.Name.Contains("DW"))
                    {
                        name = "大王";
                    }

                    return name;
                }

            }
            return "未知牌";

        }

有了牌以後,咱們就能夠開始洗牌了

如何洗牌?

  玩牌的時候,洗牌就是把桌上的牌拿起來不停的搓啊搓啊的,而後就開始發牌。可是在程序中,咱們不可能拿着牌搓啊搓的。。。可是咱們能夠搓數組啊。。。

  因此咱們先生成一個和CardType裏面的從0到53的一個順序的數組或者集合

 List<int> list = new List<int>();
            for (int i = 0; i <= 51; i++)
            {
                list.Add(i);
            }

而後打亂這個集合的順序,這樣就算是洗好牌了。。。若是要洗屢次牌,就打亂屢次順序。。。(博主認爲這樣沒意義)

 /// <summary>
        /// 隨機排列數組元素
        /// </summary>
        /// <param name="myList"></param>
        /// <returns></returns>
        private static List<int> ListRandom(List<int> myList)
        {

            Random ran = new Random();
            int index = 0;
            int temp = 0;
            for (int i = 0; i < myList.Count; i++)
            {

                index = ran.Next(0, myList.Count - 1);
                if (index != i)
                {
                    temp = myList[i];
                    myList[i] = myList[index];
                    myList[index] = temp;
                }
            }
            return myList;
        }

而後咱們這個洗牌的方法就直接調用就能夠獲得一個亂序的int集合,集合中的每一個int值就對應CardType的一個牌類型

 /// <summary>
        /// 洗牌
        /// </summary>
        /// <returns></returns>
        public static List<int> Shuffle()
        {

            List<int> list = new List<int>();
            for (int i = 0; i <= 51; i++)
            {
                list.Add(i);
            }
            return ListRandom(list);

        }

而後在這個亂序的牌集合裏面,取出三家的牌(具體多少家,看心情吧。。。也不必定非要三家)

using System.Linq;
 var list = JinHuaUtils.Shuffle();
            list.Skip(0).Take(3);

取出第一家的牌就是跳過0條取三張,第二家就是跳過3條取三張,而後依次類推,就能夠取出N方的牌。(我想了一下,這個方法應該適用於各類牌類型的洗牌,至少鬥地主,牛牛這類的是沒問題的,其餘的我也不會QAQ)

好了,今天就到這裏了,下一節應該仍是對牌的操做,好比牌比大小啊,炸金花遊戲的牌型啊(對子,順子,金花,三筒)等等的一些操做。

原本打算一篇寫完的,可是迫於本人表達能力(其實我認爲是園友耐心問題),就分幾篇寫吧

我也是摸索着寫這個東西,若是有理解錯誤的地方,但願園友們指出


若是想請我喝瓶水,能夠掃一下二維碼 QAQ

相關文章
相關標籤/搜索