C#斗地主洗牌分牌练习

using System;
public class initCard { //初始化牌
    private string[] suit = { "\x0001", "\x0002", "\x0003", "\x0004", "\x0005", "\x0006" }; //大小王和四种花色
    private string[] rank = { "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", };
    public string[,] cards = new string[4, 14]; //从j从1算起,好记。
    public initCard() {
        for (int i = 0; i < 4; i++) {
            for (int j = 1; j < 14; j++) {
                cards[i, j] = suit[i + 2] + rank[j - 1];
            }
        }
        cards[0, 0] = "\x0001";
        cards[1, 0] = "\x0002";  //大小王单独赋
        cards[2, 0] = "NotUsed"; //还多出两个空,后面每次要判断
        cards[3, 0] = "NotUsed";
    }
}
public class shuffle { //洗牌
    public shuffle(ref string[,] cards) {
        Random random = new Random();
        string[] tmpCards = new string[54];
        for (int count = 0; count < 10; count++) { //洗牌10*56次,每次随机调换1张牌
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 14; j++) {
                    string tmpCard = "";
                    int ranCardi = random.Next(0, 4);
                    int ranCardj = random.Next(0, 14);
                    if (cards[i, j] != "NotUsed" && cards[ranCardi, ranCardj] != "NotUsed") { //要判断是否为多出的两张废牌
                        tmpCard = cards[i, j];
                        cards[i, j] = cards[ranCardi, ranCardj];
                        cards[ranCardi, ranCardj] = tmpCard;
                    }
                }
            }
        }
    }
}
public class deal { //分牌
    public string lastCard = "";
    public string[] tmpCards = new string[51];
    public string[] player = new string[3];
    public deal(string[,] cards) {
        Random random = new Random();
        int tmp = 0;
        for (int i = 0; i < 3; i++) { //分3张底牌
            int ranCardi = random.Next(0, 4);
            int ranCardj = random.Next(0, 14);
            if (cards[ranCardi, ranCardj] != "NotUsed" && cards[ranCardi, ranCardj] != "lastCard") { //判断是否废牌或底牌
                lastCard += cards[ranCardi, ranCardj];
                cards[ranCardi, ranCardj] = "lastCard"; //分过的底牌做标记
            }
            else
                i--; //如果随机到空或是已经为底牌,就再来一次,概率较小
        }
        for (int i = 0; i < 4; i++) { //剩下的51张牌转成普通数组方便处理
            for (int j = 0; j < 14; j++) {
                if (cards[i, j] != "NotUsed" && cards[i, j] != "lastCard") { //判断是否废牌或底牌
                    tmpCards[tmp] = cards[i, j];
                    tmp++;
                }
            }
        }
        for (int x = 0; x < 3; x++) { //3个人,每人17张
            for (int i = 0; i < 17; i++) {
                player[x] += tmpCards[i + x * 17];
            }
        }
        player[random.Next(0, 3)] += lastCard+"(地主)"; //随机地主拿底牌
    }
}
class ChinesePoker {
    public static void Main() {
        initCard myCards = new initCard();
        shuffle shuffleCard = new shuffle(ref myCards.cards);
        deal dealCard = new deal(myCards.cards);
        Console.WriteLine("底牌是:"+dealCard.lastCard);
        for (int i = 0; i < 3; i++) {
            Console.WriteLine("玩家{0}的牌是:{1}", i + 1, dealCard.player[i]);
        }
        Console.ReadKey();
    }
}


没排序,先这样了,感觉还不错,多练习

你可能感兴趣的:(C#斗地主洗牌分牌练习)