斗地主结构算法,求高手
最近在做斗地主游戏,关于54张扑克的数据结构和算法,一直不知道别人怎么做,所以想请教下各位高手,首先感谢大家抽出时间看我的帖子
最开始我把扑克定义成长度为2的字符,第一字符代表值,第二个字符代表花色
比如我是这么对应值的:
3 4 5 6 7 8 9 a b c d e f g h
3 4 5 6 7 8 9 10 J Q K A 2 小王 大王
花色可以是 0:红桃 1黑桃 2:方片 3草花
(小王和大王的花色是4和5,)
红桃A:e0 方片10:a2
黑桃2: f1
之所以把值放在前面,因为有个自动整理牌的功能,从小到大,可以用自带的sort()方法来实现排序
要求实现的基本功能:1.自动整理牌(从小到大)
2.比较大小 比较两组牌的大小,比如别人出了3,4,5,6,7 必须出4,5,6,7,8以上的,一条龙只能到A为止
3.自动出牌(托管功能) 从已有的牌中找到可以出的牌(并尽量不破坏更好地牌走法,这个功能正在考虑,什么样算破坏或不破坏,什么时候必须要破坏,真的很难说)
为了实现功能2,我定义了一个Cards类,有type属性,value属性,longCount属性
type属性对应的枚举值
public enum CardType : int //牌的类型
{
Error = 0, //错误
Dan = 1, //单
Dui = 2, //对
San = 3, //三
DanLong = 4, //单龙
DuiLong = 5, //对龙
SanLong = 6, //三龙
San1 = 7, //三代1
San2 = 8, //三代2
Si1 = 9, //四代1
SiDui = 10, //四代对
Bomb = 11, //炸弹
DoubleKing = 12 //双王
}
value属性 比如:对3,value=3 比如对8,value=8, 比如4,5,6,7,8 value=4 比如单牌4 value=4 三个6 value=6
longCount属性,如果Cards.Type == 单龙或双龙或三龙,则longCount代表了不同牌的连续个数 比如4,5,6,7,8 longCount=5
比如:对4,对5,对6,对7,对8 longCount=5 比如:对5 longCount=0
比较牌大小的代码,前提是已经按上述生成Cards
public static CardCompareType Compare(Cards c1, Cards c2) //c1当前玩家的牌,c2上次出的牌
{
if (c1.Type == CardType.Error) return CardCompareType.Error;
if (c1.Type == c2.Type) //类型相同时比较大小
{
if (c1.Value > c2.Value && c1.LongCount == c2.LongCount)
return CardCompareType.Win;
else
return CardCompareType.Lose;
}
else //如果牌的类型不同,除非是炸弹或双王才能赢对方
{
if (c1.Type == CardType.DoubleKing)
return CardCompareType.SupperWin; //玩家不需等待其他玩家出牌,可以直接出牌
else if (c1.Type == CardType.Bomb)
return CardCompareType.Win;
else
return CardCompareType.Lose;
}
}
以上是我开始做斗地主用到的算法,可以说这个算法的效率不高,而且在socket传输时占位也多
后来我考虑到,byte数值范围是0-255,如果一个牌只占一个字节,那么从网络流量来说我已经做到最小了。现在我想从0-255中找到54个数字代替54张牌
最终效果:
1.随便拿出其中一个数字,通过简单算法可以知道它的值和花色
2.能迅速算出一组数字是什么类型,是单牌,是对,是3带2,是炸弹,还是双王
3.能迅速比较两组数字的大小,判断用户是否可以用这样的牌打压对手
对此,我想到两种方法 一种是高4位放牌值,低4位放花色 一种是按十进制来算,高位代表值,个位代表花色
这两种方法其实大同小异,我想找一种更好地算法来找出新的54个数字,能完成上面写的最终效果