发牌算法

前段时间,很多公司都在招聘使用Unity3D开发卡牌游戏的程序员,我身边的很多朋友也都在这类棋牌游戏公司工作,刚好最近有闲,写一下简单的发牌算法。

本片博客一共分为三部分:
1:简单的发牌算法(将52张牌发放到玩家手中)
2:通过牌的大小进行排序
3:通过牌的花色进行排序


1:发牌算法
思路整理:可以将所有的卡牌存放到一个列表中,通过循环/随机数的方式来发牌,每循环一次,就从别表中将发过的牌移除

“`
using System;
using System.Collections;
using System.Collections.Generic;

namespace DealArithmetic发牌算法
{
//枚举花色方便调用
public enum Color{

    红桃 = -1,
    黑桃 = -2,
    梅花 = -3,
    方块 = -4,

}

//枚举牌面方便调用
enum Point{

    A ,
    Two,
    Three ,
    Four,
    Five,
    Six,
    Seven,
    Eight,
    Nine,
    Ten,
    J ,
    Q ,
    K ,
}

//声明一个扑克结构体
struct Poker{
    //声明两个string类型的变量
    private string pocker_color,poker_point;
    //声明构造方法
    public Poker(string _color,string _point){
        this.pocker_color = _color;
        this.poker_point = _point;
    }

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

class MainClass
{
    public static void Main (string[] args)
    {

        //实例化一个ArrayList存储所有的扑克
        List myPokerList = new List();
        //存放每个人的牌的集合
        List person1 = new List();
        List person2 = new List ();
        List person3 = new List ();

        //循环遍历,生成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));
                //将创建的扑克放到扑克牌容器中
                myPokerList.Add (p);
            }
        }
        //打印所有的扑克牌
        Console.WriteLine ("打印所有的扑克牌");
        for (int i = 0; i < 52; i++) {
            Poker tempPoker = (Poker)myPokerList [i];
            //调用Poker结构体中打印的方法
            tempPoker.Printpoker ();
        }

        //开始发牌
        //每轮每人一张牌,每循环一次,就将发过的牌,移除,下次重新随机,得到新的牌给下一个人

        //定义一个随机数
        Random random = new Random();
        //每个人可以拿到的牌的数量
        int count =  myPokerList.Count/3;


        //外层循环控制每个人可以拿到多少张
        for (int i = 0; i < count; i++) {
            //内层训话控制一轮每个人一张牌
            for (int j = 0; j < 3; j++) {
                //随机一个牌的下标
                int temp = random.Next(0,myPokerList.Count);
                switch (j) {
                case 0:
                    person1.Add (myPokerList[temp]);
                    break;
                case 1:
                    person2.Add (myPokerList [temp]);
                    break;
                case 2:
                    person3.Add (myPokerList [temp]);
                    break;
                default:
                    break;
                }
                //添加完成之后,移除这张牌
                myPokerList.RemoveAt(temp);
            }
        }

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

//调用排序方法
/* //按照花色对扑克进行排序
List list = new List();
//♣️2♦️Q♠️K♥️6♠️4♥️7♥️8♦️2♠♥♦♣
list.Add(“♣2”);
list.Add(“♦Q”);
list.Add(“♠K”);
list.Add(“♥6”);
list.Add(“♠4”);
list.Add(“♥7”);
list.Add(“♥8”);
list.Add(“♦2”);
Console.WriteLine (“排序前:”);
foreach (var item in list) {
Console.WriteLine (item);
}
//通过花色进行排序,黑、红、方、梅
SuitSort suitObj = new SuitSort (list);
suitObj.SortSuitList ();

        //排序后的扑克
        Console.WriteLine ("排序后:");
        foreach (var item in list) {
            Console.WriteLine (item);
        }*/

    }
}

}

二:排序方法 按照花色大小进行排序

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DealArithmetic发牌算法
{
public class SuitSort
{
//表示要进行排序的集合
public List suitList{ get; set;}
//构造方法,表明了如果要调用suitSort就必须附上一个List类型的
public SuitSort (List list)
{
//表明suiList就是SuiSort的参数
suitList = list;

    }

    //排序集合的方法
    public void SortSuitList(){

        //Sort方法,需要的参数会返回一个int类型数值,如果那个方法的返回值为正,那么那个方法中的A大于B,如果返回值为负,那么B>A通过这种方式排序
        suitList.Sort (SuitComparer);
    }

    //Sort使用的方法,比较两张牌的花色大小
    private static int SuitComparer(string pokerA,string PokerB){

        //根据花色找到花色所对应的数据,方便进行排序
        int a = GetPokerNumber(pokerA);
        int b = GetPokerNumber(PokerB);
        //返回a-b的数值
        return a - b;

    }

    //获取对应的扑克牌数据
    private static int GetPokerNumber(string poker){
        //如果poker没有值,返回0
        if (string.IsNullOrEmpty(poker)) {
            return 0;
        }

        //定义一个变量,来存放花色对应的数据
        int suitValue = 0;
        //c等于poker从下标从0开始到2的字符
        string c = poker.Substring(0,2);
        //此处排序首先考虑的是花色,于是先将花色乘以设置成一个常数进行区分
        switch (c) {
        case "红桃":
            suitValue = 100;
            break;
        case "黑桃":
            suitValue = 200;
            break;
        case "方块":
            suitValue = 300;
            break;
        case "梅花":
            suitValue = 400;
            break;
        default:
            break;
        }

        //numSrt表示从下标从2开始直到结束的泛型
        var numStr = poker.Substring(2);
        //泛型numBer等于0
        var numBer = 0;
        //给几个特殊的牌面赋值一个特殊值
        switch (numStr) {
        case "A":
            numBer = 14;
            break;
        case "K":
            numBer = 13;
            break;
        case "Q":
            numBer = 12;
            break;
        case "J":
            numBer = 11;
            break;
        default:
            numBer = Convert.ToInt32(numStr);
        break;
        }
        //保证每个花色都不是在一个数字区间段
        numBer = (15-numBer)+suitValue;
        return numBer;


    }
}

}

你可能感兴趣的:(算法,Untiy3D,C#)