前段时间,很多公司都在招聘使用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;
}
}
}