C#实现 "发牌" 算法

                男人最重要的四件事:  一日三餐!

Unity摊

using System;
using System.Collections;
using System.Collections.Generic;

/// 
///  //用C#模拟实现扑克牌发牌。
/// (1)52张扑克牌,四种花色(红桃、黑桃、方块和梅花),按照每轮一人一张的方式,发牌。
/// (2)最后将3个人的扑克牌包括花色打印在控制台上。
///  分析: 可以将所有的牌存放到一个列表里, 通过循环/随机数的方式依次发票.每循环一次,从列表中把发过的牌移除.
/// 

namespace DealArithmetic
{
    //花色
    enum Color
    {
        红桃️ = -1,
        黑桃 = -2,
        梅花 = -3,
        方砖️ = -4
    }
    //点数
    enum Point
    {
        A,
        two,
        three,
        four,
        five,
        six,
        seven,
        eight,
        nine,
        ten,
        J,
        Q,
        K
    }
    //扑克
    struct Poker
    {
        //p1: 花色
        //p2: 点数
        private string p1, p2;

        public Poker (string p1, string p2)
        {
            this.p1 = p1;
            this.p2 = p2;
        }
        //打印牌的信息
        public void Printpoker ()
        {
            Console.WriteLine ("花色: {0}, 大小: {1}", this.p1, this.p2);
        }
    }


    class MainClass
    {
        public static void Main (string[] args)
        {
            //实例化一个ArrayList存放所有的扑克
            ArrayList myPoker = new ArrayList ();
            //存放每个人的牌的列表
            ArrayList person1 = new ArrayList ();
            ArrayList person2 = new ArrayList ();
            ArrayList person3 = new ArrayList ();
    

            //循环遍历, 生成52张扑克牌
            //外层循环控制扑克的花色
            for (int i = -4; i < 0; i++) {
                //内层循环控制扑克的点数
                for (int j = 0; j < 13; j++) {
                    Poker p = new Poker (Enum.GetName (typeof(Color), i), 
                                  Enum.GetName (typeof(Point), j));
                    myPoker.Add (p);
                }
            }
            Console.WriteLine ("打印所有的扑克:  ");
            for (int i = 0; i < 52; i++) {
                Poker tempPoker = (Poker)myPoker [i];
                tempPoker.Printpoker ();
            }

            //发牌开始, 每轮一人一张,
            //每循环一次,就将"发过的牌"移除.下次从新随机,得到新的牌发给下一个人.
            Random r = new Random (); 
            //每个人可以拿到的排数
            int count = myPoker.Count / 3;

            //外层循环控制每个人可以拿到多少张牌
            for (int i = 0; i < count; i++) {
                //内层循环控制 一轮每个人一张牌
                for (int j = 0; j < 3; j++) {
                    
                    int te = r.Next (0, myPoker.Count);
                    switch (j) {
                    case 0:
                        person1.Add (myPoker [te]);
                        break;
                    case 1:
                        person2.Add (myPoker [te]);
                        break;
                    default:
                        person3.Add (myPoker [te]);

                        break;
                    }
                    myPoker.RemoveAt (te);
                }
            }

            Console.WriteLine ();
            //外层循环遍历每个人
            for (int i = 0; i < 3; i++) {
                Console.WriteLine ("第{0}个人的牌是: ", i + 1);
                //内层循环遍历这个人的所有牌
                for (int j = 0; j < count; j++) {
                    Poker p;
                    switch (i) {
                    case 0:
                        p = (Poker)person1 [j];  
                        break;
                    case 1:
                        p = (Poker)person2 [j]; 
                        break;
                    default:
                        p = (Poker)person3 [j]; 
                        break;
                    }
                    p.Printpoker (); 
                }
                Console.WriteLine ();
            }
        }
    }
}

输出控制台打印信息

说明: 一次性发完每个人的牌的算法与上类似, 可以自行调试.

如有疑问请留言

你可能感兴趣的:(C#实现 "发牌" 算法)