斗地主结构算法,求高手

haluomao 2011-12-08 06:00:43
最近在做斗地主游戏,关于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个数字,能完成上面写的最终效果
...全文
1140 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
linyd_retrun 2013-01-30
  • 打赏
  • 举报
回复
我这有斗地主AI,不过是公司的,不方便公开
jj380382856 2013-01-18
  • 打赏
  • 举报
回复
引用 3 楼 superdullwolf 的回复:
你这个是客户端智能AI? 前提是不是本地不知道全部牌局,只知道自己手里的牌? 1,要记录其余别人手里的牌。 2,记录出牌明细,排除掉其他人手里的断张肯能性,还有概率。 3,要有博弈树,展开几层,然后剪支搜索。出点狠招!~ 人,牌,概率 这几个数据本地都要存放。 服务器端是否归你管?他起公平仲裁的作用?还是也作弊? 你没说清楚。 ……
版主,你怎么什么都能说到点子上啊
超级大笨狼 2013-01-16
  • 打赏
  • 举报
回复
你这个是客户端智能AI? 前提是不是本地不知道全部牌局,只知道自己手里的牌? 1,要记录其余别人手里的牌。 2,记录出牌明细,排除掉其他人手里的断张肯能性,还有概率。 3,要有博弈树,展开几层,然后剪支搜索。出点狠招!~ 人,牌,概率 这几个数据本地都要存放。 服务器端是否归你管?他起公平仲裁的作用?还是也作弊? 你没说清楚。
阿麦 2013-01-15
  • 打赏
  • 举报
回复
可以把各种牌型的关键牌排一下顺序(比如三代一,关键牌中三张的,代什么牌对值没有影响),牌大的取值也越大。比如一对,可以排3-3(0),4-4(1),5-5(2),6-6(3),7-7(4),8-8(5),9-9(6),10-10(7),11-11(8),12-12(9),13-13(10),0-0(11),2-2(12) 比大小就是转化成牌值,牌值大就OK 比如要判断对9是否比对7大。9-9分得为6,7-7得分为4,6>4,所以对9比对7大。 当然,在排顺序时,花色不必考虑。
刘彬 2013-01-15
  • 打赏
  • 举报
回复
爱莫能助 啊 ,看了 您的 思想 ,我 受到 启发了

2,408

社区成员

发帖
与我相关
我的任务
社区描述
高性能计算
社区管理员
  • 高性能计算社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧