C#模拟洗牌小程序
初学C#,昨天刚刚学了C#的基础语法。其实这就是一个数组和枚举的简单应用,设计一些计数、遍历、交换简单算法。
背景:一共54张扑克牌,每一张扑克看成一个结构体,包含花色和点数两个数据成员。还要有一个构造函数,设置点数和花色。
public struct Poke
{
public Poke(PokeType type, int pokeNum):this()
{
PokeNum = pokeNum;
PokeType = type;
}
public int PokeNum;
public PokeType PokeType;
}
对于花色 ,只有4中所以使用枚举类型就很方便了
public enum PokeType
{
Club,//黑桃
Heart,//红桃
Flower,//梅花
Square,//方块
King
}
下面介绍程序的主体:
static void Main(string[] args)
{
Poke[] pokes = new Poke[54];
//初始化顺序的扑克牌 for (int pokeTypeLoop=0; pokeTypeLoop < 4;++pokeTypeLoop )
{
for (int pokeNumLoop = 1; pokeNumLoop <= 13;++pokeNumLoop )
{
pokes[pokeTypeLoop * 13 + pokeNumLoop - 1] = new Poke((PokeType)pokeTypeLoop, pokeNumLoop);
}
}
pokes[52] = new Poke(PokeType.King, 0);
pokes[53]=new Poke(PokeType.King,1);
//洗牌
int moveStart = 0;
int moveNum = 0;
int moveEnd = 0;
int washTime = 100000;//洗牌次数
Random rnd = new Random();
while (washTime > 0)
{
moveStart = rnd.Next() % 54;
moveNum = rnd.Next() % 20;
moveEnd = moveStart + moveNum - 1;
if (moveEnd > 53)
{
moveEnd = 53;
moveNum = moveEnd - moveStart + 1;
}
if (moveStart > 0 && moveNum > 0)
{
//拿牌
Poke[] tempPoke = new Poke[moveNum];
for (int moveLoop = 0; moveLoop < moveNum; ++moveLoop)
{
tempPoke[moveLoop] = pokes[moveStart + moveLoop];
}
//移牌
for (int moveTargetLoop = moveStart - 1; moveTargetLoop >= 0; --moveTargetLoop)
{
pokes[moveTargetLoop + moveNum] = pokes[moveTargetLoop];
}
//放牌
for (int locationLoop = 0; locationLoop < moveNum; ++locationLoop)
{
pokes[locationLoop] = tempPoke[locationLoop];
}
}
washTime--;
}
//输出扑克
for (int loop = 0; loop < 54;++loop )
{
Console.WriteLine("花色:{0},大小:{1}", pokes[loop].PokeType.ToString(), ConvertPokeNumToString(pokes[loop].PokeType,pokes[loop].PokeNum));
}
//校验洗牌结果
Console.WriteLine("\n经校验结果如下:");
//1.校验花色
int[] check = new int[5];
for (int k = 0; k < 54; ++k)
{
switch (pokes[k].PokeType)
{
case PokeType.Club:
++check[0];
break;
case PokeType.Flower:
++check[1];
break;
case PokeType.Heart:
++check[2];
break;
case PokeType.Square:
++check[3];
break;
case PokeType.King:
++check[4];
break;
}
}
if (check[0] == 13 && check[1] == 13 && check[2] == 13 && check[3] == 13 && check[4] == 2)
Console.WriteLine("花色无误!");
else
{
Console.WriteLine("花色发生了错误!");
Console.WriteLine("黑桃:{0}张 梅花:{1}张 红心:{2}张 方片:{3}张 王牌:{4}张", check[0], check[1], check[2], check[3], check[4]);
}//校验花色完毕
//2.校验点数
int[] checkNum = new int[14];
for (int j = 0; j < 54; ++j)
{
if (pokes[j].PokeType == PokeType.King)
checkNum[13]++;
else
checkNum[pokes[j].PokeNum - 1]++;
}
int n = 0;
for (n = 0; n < 13; ++n)
{
if (checkNum[n] != 4)
{
Console.WriteLine("扑克点数发生错误!");
break;
}
}
if (n == 13)
{
if (checkNum[n] != 2)
Console.WriteLine("扑克点数:王牌发生错误!");
else
Console.WriteLine("点数无误!");
}//校验点数完毕
Console.ReadKey();
}
public static string convertToString(PokerType type)
{
switch (type)
{
case PokerType.Club:
return "黑桃";
case PokerType.Block:
return "方片";
case PokerType.Flower:
return "梅花";
case PokerType.Heart:
return "红心";
case PokerType.King:
return "王牌";
default:
throw new ArgumentException("扑克类型参数无效");
}
}
public static string ConvertPokeNumToString(PokeType type,int num)
{
if (num == 0 && type == PokeType.King)
return "小王";
if (num == 1 && type == PokeType.King)
return "大王";
if (num == 1)
return "A";
else if (num == 11)
return "J";
else if (num == 12)
return "Q";
else if (num == 13)
return "K";
else if (num >= 2 && num <= 10)
return num.ToString();
//抛出异常
throw new ArgumentException("扑克大小参数无效");
} }
下面3张图片具体介绍每一次洗牌的过程: