棋牌游戏通用牌型数值化方案

棋牌游戏通用牌型数值化方案

1. 数值化方案背景:

游戏中,要对各个玩家的牌进行比较,排序.通常情况下,我们会这样组织数据:
BYTE cbCardData[PlayerCount][CardCount];
每次进行比较的时候,类似于:
GameLogic.CompareCard(PlayerOneCard,PlayerTwoCard)
函数返回true或者false等等.
这样的方式,如果要进行牌型排序,经常会

for(i = 1,PlayerCount-1)
for(j =i+1,PlayerCount)
{
GameLogic.Compare(...)
}

GameLogic.CompareCard中,经常会是
type1 = getCardType(PlayerOneCard)
type2 = getCardType(PlayerTwoCard)
if type1 >= type2
return true
else
return false

在getCardType中,我们经常要对数据进行一些循环遍历来分辨牌型.
比如牛牛游戏, type经常是 无牛,牛1,…牛牛.可是大部分情况下,这样还是不能直接知道结果的.我们还需要知道它的最大牌,最大牌的颜色进行相同牌型的比较.
在德州扑克中, type经常是 单牌(高牌),对子,两对,…,皇家同花顺等,如果同样牌型,还要知道附加的最大牌的数据,最糟糕的情况,你要比较所有牌的大小.

每一次比牌,都要计算2个玩家的对应数据的牌型,和附加信息,尤其是进行多个玩家的牌的排序时候….

2. 数值化方案:

所谓数值化方案,就是把玩家的牌型,附加信息等用一个数值来表示,所有的数据都包含在这个数值内.这样当我们进行比较,排序的时候,直接对比这个数值就好了.
公式:
牌型权值 = 牌型*牌型基础值+附加值.

牛牛数值化方案:

牛牛规则:
牛牛类型共分十一种,无牛,牛1,…,牛牛.
类型相同情况下,比较最大牌,最大牌相同,比较花色.
牛牛如何数值化:
1.首先要考虑的就是比较顺序:
1).类型,类型越大,玩家的牌越大.
2).最大牌.牌型相同,最大牌大的玩家赢.
3).花色.牌型相同,最大牌相同,比较花色.
2.其次考虑每一种牌型的最大可能数量
1) 牌型11种.
1).扑克牌2,3,..A大小排序,共13张
2).花色共四种.
3.计算出一个牌型基础值.
区分扑克牌的大小,要13种数值,那么牌型间的数值应该大于13倍.花色4种,那么每种数值间的差值就应当大于4倍.
花色:0-3 这里按10算
牌逻辑值:2-14 这里向上取20
基础值 = 10*20 = 200
4.套用公式:
数据: 3,4,5,6,7 无牛,最大牌7,取7的花色
权值 = 0*200+7*10+花色基础值
数据: 3,5,7,10,K 牛无. 最大牌K,取K的花色
权值 = 5*200+13*10+花色基础值
这样计算,我们进行排的比较,牌型的排序都只需要对数据所对应的权值进行比较就好了.

德州数值化方案:

先比较牌型,单牌(高牌),对子,两对,…,皇家同花顺,如果牌型相同,比较附带的牌的大小.
共10种牌型,附加数据最多有四种(单牌,同花,..),每种附加值都有13种(2-A)
二进制4位最大数值16,而我们需要的数只有 0-12 或 2-14 ,附加值采用位与,即最高为0xFFFF(WORD,unsigned short)
附加值采用WORD类型,最大值65,535.每种类型中13种,那么基础值就选择200,000.

其他游戏也都是可以使用这样的方式的,只要你想,而且有必要!

原创文章,作者:棋牌游戏,如若转载,请注明出处:https://www.qp49.com/2018/03/15/36.html

发表评论

邮箱地址不会被公开。 必填项已用*标注

评论列表(1条)

  • 卡车
    卡车 2018年3月23日 下午3:45

    学习了