棋牌游戏2V2游戏结算算法总结
在结算总要考虑加倍、输赢上线、加倍、包赔,导致算法f非常复杂,思路如下:
托管包赔思路如下:
托管 |
自己挂机 |
队友自己挂机 |
自己、队友都挂机 |
- |
自己挂机 |
赢:自己不得金蛋, |
赢:自己不得金蛋, |
赢:自己不得金蛋, |
赢:自己不得金蛋, |
输:自己包赔, |
输:正常结算 |
输:正常结算 |
输:自己包赔, |
|
队友挂机 |
赢:自己不得金蛋, |
赢:自己正常结算, |
赢:自己不得金蛋, |
赢:自己正常结算, |
输:正常结算 |
输:自己不扣金蛋, |
输:正常结算 |
输:自己不扣金蛋, |
|
自己、队友都挂机 |
赢:自己不得金蛋, |
赢:自己不得金蛋, |
赢:自己不得金蛋, |
赢:自己不得金蛋, |
输:正常结算 |
输:正常结算 |
输:正常结算 |
输:正常结算 |
|
- |
赢:自己不得金蛋, |
赢:自己正常结算, |
赢:自己不得金蛋, |
正常结算 |
输:自己包赔, |
输:自己不扣金蛋, |
输:正常结算 |
赢取上线机制的处理思路如下:
胜利方\失败方 |
结算小于 |
结算大于 |
结算小于 |
正常结算 |
破产机制 |
结算大于 |
赢取上限机制 |
两者结算取其小 |
A、B为胜方扣除台费后金蛋数量a、b;
C、D为负方扣除台费后金蛋数量c、d;
A、B、C、D加倍数分别为Xa、Xb、Xc、Xd;
公共倍数*得分基数*底分为Y
例如1,a、b、c、d都大于等于 结算X*Y,正常结算
A=a+Y*Xa*(Xc+Xd)/2
B=b+Y*Xb*(Xc+Xd)/2
C=c-Y*Xc*(Xa+Xb)/2
D=d-Y*Xd*(Xa+Xb)/2
例如2,c、d其中之一或两者小于 结算X*Y;
a、b都大于等于 结算X*Y,破产机制
A=a+(min(c,Y*Xc*(Xa+Xb)/2)+ min(d,Y*Xd*(Xa+Xb)/2))*Xa/(Xa+Xb)
B=b+(min(c,Y*Xc*(Xa+Xb)/2)+ min(d,Y*Xd*(Xa+Xb)/2))*Xb/(Xa+Xb)
C=c-min(c,Y*Xc*(Xa+Xb)/2)
D=d-min(d,Y*Xd*(Xa+Xb)/2)
例如3,a、b其中之一或两者小于 结算X*Y;
c、d都大于等于 结算X*Y,赢取上限机制
A=a+min(a,Y*Xa*(Xc+Xd)/2)
B=b+min(b,Y*Xb*(Xc+Xd)/2)
C=c-(min(a,Y*Xa*(Xc+Xd)/2)+ min(b,Y*Xb*(Xc+Xd)/2))*Xc/(Xc+Xd)
D=d-(min(a,Y*Xa*(Xc+Xd)/2)+ min(b,Y*Xb*(Xc+Xd)/2))*Xd/(Xc+Xd)
例如4,a、b其中之一或两者小于 结算X*Y;
c、d其中之一或两者小于 结算X*Y,两者结算取其小
l 判断1,c、d的输去更少
if
min[min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2),
min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2)]
=min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2)
and
min(a,(min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2))*Xa/(Xa+Xb))=a
A=a+a
B=b+ min(c,Y*Xc*(Xa+Xb)/2)+ min(d,Y*Xd*(Xa+Xb)/2)-a
C=c- min(c,Y*Xc*(Xa+Xb)/2)
D=d- min(d,Y*Xd*(Xa+Xb)/2)
if
min[min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2),
min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2)]
=min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2)
and
min(b,(min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2))*Xb/(Xa+Xb))=b
A=a+ min(c,Y*Xc*(Xa+Xb)/2)+ min(d,Y*Xd*(Xa+Xb)/2)-b
B=b+b
C=c-min(c,Y*Xc*(Xa+Xb)/2)
D=d-min(d,Y*Xd*(Xa+Xb)/2)
if
min[min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2),
min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2)]
=min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2)
and
min(a,(min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2))*Xa/(Xa+Xb))
=(min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2))*Xa/(Xa+Xb)
and
min(b,(min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2))*Xb/(Xa+Xb))
=(min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2))*Xb/(Xa+Xb)
A=a+(min(c,Y*Xc*(Xa+Xb)/2)+ min(d,Y*Xd*(Xa+Xb)/2))*Xa/(Xa+Xb)
B=b+(min(c,Y*Xc*(Xa+Xb)/2)+ min(d,Y*Xd*(Xa+Xb)/2))*Xb/(Xa+Xb)
C=c-min(c,Y*Xc*(Xa+Xb)/2)
D=d-min(d,Y*Xd*(Xa+Xb)/2)
l 判断2,a、b的赢取更少
if
min[min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2),
min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2)]
= min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2)
and
min(c,(min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2))*Xc/(Xc+Xd))=c
A=a+ min(a,Y*Xa*(Xc+Xd)/2)
B=b+ min(b,Y*Xb*(Xc+Xd)/2)
C=c-c
D=d-(min(a,Y*Xa*(Xc+Xd)/2)+ min(b,Y*Xb*(Xc+Xd)/2)-c)
if
min[min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2),
min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2)]
= min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2)
and
min(d,(min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2))*Xd/(Xc+Xd))=d
A=a+ min(a,Y*Xa*(Xc+Xd)/2)
B=b+ min(b,Y*Xb*(Xc+Xd)/2)
C=c-(min(a,Y*Xa*(Xc+Xd)/2)+ min(b,Y*Xb*(Xc+Xd)/2)-d)
D=d-d
if
min[min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2),
min(c,Y*Xc*(Xa+Xb)/2)+min(d,Y*Xd*(Xa+Xb)/2)]
= min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2)
and
min(c,(min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2))*Xc/(Xc+Xd))
=(min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2))*Xc/(Xc+Xd)
and
min(d,(min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2))*Xd/(Xc+Xd))
=(min(a,Y*Xa*(Xc+Xd)/2)+min(b,Y*Xb*(Xc+Xd)/2))*Xd/(Xc+Xd)
A=a+ min(a,Y*Xa*(Xc+Xd)/2)
B=b+ min(b,Y*Xb*(Xc+Xd)/2)
C=c-(min(a,Y*Xa*(Xc+Xd)/2)+ min(b,Y*Xb*(Xc+Xd)/2))*Xc/(Xc+Xd)
D=d-(min(a,Y*Xa*(Xc+Xd)/2)+ min(b,Y*Xb*(Xc+Xd)/2))*Xd/(Xc+Xd)
经过仔细分析,把所有情况结合起来,进行精简,并且可以自己控制倍数、包赔等开关,
结合加倍倍数,输赢上限,是否包赔,算法精简如下,为方便理解,使用伪代码写算法。
//a\c为对家,b\d为对家
//房间基础分、倍数
base=2000;
double=1;
//玩家加倍倍数
x=[2,2,2,2];
//托管标志
t0=[0,1,0,0];
//托管倍数
if t0(1)==t0(3)
t0(1)=0;
t0(3)=0;
end
if t0(2)==t0(4)
t0(2)=0;
t0(4)=0;
end
t=[t0(1),t0(2),t0(3),t0(4)];
//玩家输赢上限,AC为赢家
A=min(a,base*double*(x(1)+(x(2)+x(4)-t(2)-t(4)-2)/2)*(1-t(1)));
B=min(b,base*double*(x(2)+t(2)+(x(1)+x(3)-2-t(1)-t(3))/2)*(1-t(4)));
C=min(c,base*double*(x(3)+(x(2)+x(4)-t(2)-t(4)-2)/2)*(1-t(3)));
D=min(b,base*double*(x(4)+t(4)+(x(1)+x(3)-2-t(1)-t(3))/2)*(1-t(2)));
L=[A,B,C,D]
//本局实际输赢总额
s=min(A+C,B+D);
//玩家实际输赢
tureA=min(A,max(s/2,s-C));
tureB=min(B,max(s/2,s-D));
tureC=min(C,max(s/2,s-A));
tureD=min(D,max(s/2,s-B));
ture=[tureA,tureB,tureC,tureD]