棋牌游戏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]

 

posted on 2020-08-20 21:36  长岛的雪  阅读(498)  评论(0编辑  收藏  举报