📄 rltsvr.pas
字号:
end;
procedure TTltManager.UpdateLogic;
begin
end;
procedure TTltManager.UpdateTimeSetting;
begin
with TimeSetting do
begin
BetTimeSet := FBetTimeSetting;
BeforeWheelTimeSet := BetTimeSet + FBeforeWheelTimeSetting;
WheelingTimeSet := BeforeWheelTimeSet + FWheelingTimeSetting;
ScoreTimeSet := WheelingTimeSet + FScoreTimeSetting;
WheelEndSet := ScoreTimeSet;
end;
end;
procedure TTltManager.Log;
begin
if SocketForm = nil then Exit;
SocketForm.Label8.Caption := Format('r:%d b:%d g:%d r:%d',[BetCount[btRed], BetCount[btBlack], BetCount[btGreen], Round.WheelResult]);
SocketForm.Label9.Caption := Format('值:%d 期望:%d ',[FTotalValue, FObjectValue]);
SocketForm.Label10.Caption := Format('User:%d ',[FPlayerList.Count]);
end;
function TTltManager.GetResult: integer;
var
BetTotle : longint;
DT : longint;
NewObjectValue : longint;
ColorIndex : integer;
ExpectedValue :array[TBetType] of longint;
Power : array[TBetType] of longint;
TotalPower : longint;
// Mul : int64;
function GetPowerRandom(v1,v2,v3 : integer):integer;//0..2
var
tt : integer;
v : integer;
// dt : integer;
begin
if v1<0 then v1 :=0;
if v2<0 then v2 :=0;
if v3<0 then v3 :=0;
tt := v1 + v2 + v3;
if tt <>0 then
begin//带权随机
v := Random(tt);
if v< v1 then Result := 0;
if (v>=v1) and(v<v1+v2) then Result := 1;
if (v>=v1+v2) then Result :=2;
end else
begin
v := Random(37); //正常随机
Result := GetColorIndex(v);
end;
end;
begin
//计算结果
//1下注量
FillChar(Power, sizeOf(Power), #0);
BetTotle := BetCount[btRed] + BetCount[btBlack] + BetCount[btGreen];
//利润期望
NewObjectValue := (BetTotle) * FRate div 100 + FObjectValue;
//(理想利润)
DT := NewObjectValue - FTotalValue ;
//DT 差额;
;
//单次可能利润;
ExpectedValue[btRed] := - BetCount[btRed] + BetCount[btBlack] + BetCount[btGreen];
ExpectedValue[btBlack] := BetCount[btRed] - BetCount[btBlack] + BetCount[btGreen];
ExpectedValue[btGreen] := BetCount[btRed] + BetCount[btBlack] - BetCount[btGreen] * 35;
//与预期利润的差距,
//
if (ExpectedValue[btRed]>=0) or (ExpectedValue[btRed] - DT>0) then
Power[btRed] := 18;
if (ExpectedValue[btBlack]>=0) or (ExpectedValue[btBlack] - DT>=0) then
Power[btBlack] := 18;
if (ExpectedValue[btGreen]>=0) or (ExpectedValue[btGreen] - DT>=0) then
Power[btGreen] := 1;
//越接近预期利润差,概率越大
ExpectedValue[btRed] := ExpectedValue[btRed] - DT; //0 10
ExpectedValue[btBlack] := ExpectedValue[btBlack] - DT; //-10 10
ExpectedValue[btGreen] := ExpectedValue[btGreen] - DT; //1000 350
if (abs(ExpectedValue[btRed])<abs(ExpectedValue[btBlack])) then
begin
if (abs(ExpectedValue[btRed])>abs(ExpectedValue[btGreen])) then
Power[btGreen] := Power[btGreen] * 2 //如果绿色最小
else if (abs(ExpectedValue[btRed])<abs(ExpectedValue[btGreen])) then
Power[btRed] := Power[btRed] * 2; //如果红色最小
end
else if(abs(ExpectedValue[btRed])>abs(ExpectedValue[btBlack])) then
begin
if (abs(ExpectedValue[btBlack])>abs(ExpectedValue[btGreen])) then
Power[btGreen] := Power[btGreen] * 2 //如果绿色最小
else if(abs(ExpectedValue[btBlack])<abs(ExpectedValue[btGreen])) then
Power[btBlack] := Power[btBlack] * 2;//如果黑色最小
end;
//如果为正,表示可以参与随机,差距小的可能性大,差距大的可能性小
//结果校正:如果差距为负,重新随机;
if ExpectedValue[btRed] <0 then Power[btRed] := 0;
if ExpectedValue[btBlack] <0 then Power[btBlack] := 0;
if ExpectedValue[btGreen] <0 then Power[btGreen] := 0;
ColorIndex := GetPowerRandom(Power[btRed], Power[btBlack], Power[btGreen]);
Result := GetRandomNumByColor(ColorIndex);
end;
function TTltManager.GetWheelParams(State: TRoundState): TWheelParams;
var
i : integer;
DT : integer;
begin
DT := GetTickCount - FLastWheelParamGetTime;
Result := WheelParams;
Result.ParamsCount := 2;
case State of
rsBeting:
begin
with Result.Params[0] do
begin
FrameTime := 0;
TimeDuration := FBetTimeSetting ;
WheelTheta := FWheelTheta ;
WheelA := 0;
WheelV :=0;//.1;
BallV := 0;//.1;
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 0;
BallA := 0;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
with Result.Params[1] do
begin
FrameTime := FBetTimeSetting;
TimeDuration := 100000 ;
WheelTheta := FWheelTheta ;
WheelA := 0;
WheelV :=0;
BallV := 0;
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 0;
BallA := 0;
end;
end;
rsBeforeWheel:
begin
//在改变结果时存在变迁
if GetTickCount - GetTickCount>= TimeSetting.BeforeWheelTimeSet*1000 then
begin
with Result.Params[0] do
begin
FrameTime := TimeSetting.BetTimeSet ;
TimeDuration := 1;
WheelTheta := FWheelTheta;
WheelA := 0;
BallA := 0;
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 0;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
with Result.Params[1] do
begin
FrameTime := Result.Params[0].FrameTime + Result.Params[0].TimeDuration;
TimeDuration := TimeSetting.BeforeWheelTimeSet-FrameTime;
WheelTheta := FWheelTheta;
WheelA := 0;
BallA := 0;
WheelV := 0;
BallV := 0;
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 0;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
FLastWheelParamGetTime := GetTickCount;
end;
end;
rsWheeling:
begin
//初期加速,ball fly out
Result.ParamsCount := 5;
with Result.Params[0] do
begin
FrameTime := TimeSetting.BeforeWheelTimeSet;
TimeDuration := 1;
WheelTheta := FWheelTheta;
WheelA := -1;
BallA := 0.5;
WheelV :=6;//no change
BallV := -6.000;
BallTheta := FBallTheta;
// BallHeight := 1.5;
BallR := 11;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
//+速 culute to win;
with Result.Params[1] do
begin
FrameTime := Result.Params[0].FrameTime + Result.Params[0].TimeDuration;
TimeDuration := 1;
WheelTheta := FWheelTheta;
WheelA := -1;
BallA := 0.5;
WheelV := Result.Params[0].WheelV + Result.Params[0].WheelA
* Result.Params[0].TimeDuration;
BallV := Result.Params[0].BallV + Result.Params[0].BallA
* Result.Params[0].TimeDuration;
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 11;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
//--
with Result.Params[2] do
begin
FrameTime := Result.Params[1].FrameTime + Result.Params[1].TimeDuration;
TimeDuration := 4;
WheelTheta := FWheelTheta;
WheelA := -0.5;
BallA := 0.75;
WheelV := Result.Params[1].WheelV + Result.Params[1].WheelA
* Result.Params[1].TimeDuration;
BallV := Result.Params[1].BallV + Result.Params[1].BallA
* Result.Params[1].TimeDuration;
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 11;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
//基本匀速
with Result.Params[3] do
begin
FrameTime := Result.Params[2].FrameTime + Result.Params[2].TimeDuration;
TimeDuration := 6;
WheelTheta := FWheelTheta;
WheelV := Result.Params[2].WheelV + Result.Params[2].WheelA
* Result.Params[2].TimeDuration;
BallV := Result.Params[2].BallV + Result.Params[2].BallA
* Result.Params[2].TimeDuration;
WheelA := (4*PI/10-2)/6;
i := -100;
repeat
{ WheelA := (-NumOfAngle[Round.WheelResult]+2* pi*i - (FWheelTheta- FBallTheta)-(WheelV-BallV)*Result.Params[3].TimeDuration)
/ Result.Params[3].TimeDuration / Result.Params[3].TimeDuration*2 + BallA;
dec(i);}
BallA := (NumOfAngle[Round.WheelResult]+2* pi*i + (FWheelTheta- FBallTheta)+(WheelV-BallV)*Result.Params[3].TimeDuration)
/ Result.Params[3].TimeDuration / Result.Params[3].TimeDuration*2 + WheelA;
inc(i);
until BallA>0.01;
// until (WheelV+WheelA * TimeDuration<1.8);
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 11;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
//结果 ball to stop
with Result.Params[4] do
begin
FrameTime := Result.Params[3].FrameTime + Result.Params[3].TimeDuration;
TimeDuration := 10;
WheelTheta := FWheelTheta;
WheelV := Result.Params[3].WheelV + Result.Params[3].WheelA
* Result.Params[3].TimeDuration;
BallV := WheelV;
WheelA := -4*pi/(TimeDuration* TimeDuration);
BallA := WheelA;
BallTheta := FWheelTheta + NumOfAngle[Round.WheelResult];
BallHeight := 0;
BallR := 0;
FWheelTheta :=FWheelTheta ;{+ TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;}
FBallTheta := FWheelTheta + NumOfAngle[Round.WheelResult];
end;
end;
rsScore:
begin
Result.ParamsCount := 1;
with Result.Params[0] do
begin
FrameTime := TimeSetting.WheelingTimeSet;
TimeDuration := FScoreTimeSetting ;
WheelTheta := FWheelTheta;
WheelA := 0;
WheelV :=0;//0.1;//no change
BallV := 0;//0.1;
BallTheta := WheelTheta + NumOfAngle[Round.WheelResult];
BallHeight := 0;
BallR := 0;
BallA := 0;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FWheelTheta + NumOfAngle[Round.WheelResult];
end;
end;
rsPaused:
begin
Result.ParamsCount := 1;
with Result.Params[0] do
begin
FrameTime := 0;
TimeDuration := 0;
WheelTheta := FWheelTheta;
WheelA := 0;
WheelV :=0.00;
BallV := 0.00;
BallTheta := FBallTheta;
BallHeight := 0;
BallR := 0;
BallA := 0;
FWheelTheta :=FWheelTheta + TimeDuration * WheelV
+ WheelA * TimeDuration * TimeDuration /2;
FBallTheta := FBallTheta + BallV * TimeDuration
+ BallA * TimeDuration * TimeDuration /2;
end;
end;
end;
end;
procedure TTltManager.UpDateWheelParams;
begin
WheelParams.WheelStartTickCount :=GetTickCount - FWheelStartTickCount;
end;
function TTltManager.DoPlayerEdit(APlayerEditInfo : TPlayerEditInfo): TPlayerEditInfo;
var
CPlayer, DPlayer : TPlayer;
I : integer;
APlayerBetInfo : TPlayerBetInfo;
begin
Result := APlayerEditInfo;
case APlayerEditInfo.EditFlag of
efNewID:Result.PlayerInfo.ID := DAGetNewPlayerID;
efCreatePlayer:
begin
CPlayer := TPlayer.Create;
CPlayer.SetPlayerInfo(APlayerEditInfo.PlayerInfo);
CPlayer.Password := APlayerEditInfo.PlayerInfo.Password;
CPlayer.LastActiveTime := Now;
DACreatePlayer(CPlayer);
CPlayer.Free;
end;
efAddMoney:
begin
APlayerEditInfo.PlayerInfo.money := DAReadPlayer(APlayerEditInfo.PlayerInfo.ID).money
+ APlayerEditInfo.PlayerInfo.money;
APlayerEditInfo.EditFlag := efEditPlayer;
DoPlayerEdit(APlayerEditInfo);
end;
efEditPlayer:
begin
CPlayer := TPlayer.Create;
CPlayer.SetPlayerInfo(APlayerEditInfo.PlayerInfo);
CPlayer.Password := APlayerEditInfo.PlayerInfo.Password;
CPlayer.LastActiveTime := Now;
//有金钱设置变动
//记录日志,并发布变动
FillChar(APlayerBetInfo, Sizeof(APlayerBetInfo), #0);
APlayerBetInfo.PreMoney := DAReadPlayer(CPlayer.ID).money;
if APlayerBetInfo.PreMoney <> CPlayer.Money then
begin
APlayerBetInfo.PlayerID := APlayerEditInfo.PlayerInfo.ID;
APlayerBetInfo.Settlement := APlayerEditInfo.PlayerInfo.money;
APlayerBetInfo.RoundNo := Round.No;
APlayerBetInfo.WheelNo := Round.WheelNo;
APlayerBetInfo.Result := -1;
APlayerBetInfo.ResultColor := 0;
APlayerBetInfo.RoundMain := Round.Main;
DASavePlayerBetInfo(APlayerBetInfo);
end;
DAEditPlayer(CPlayer);
CPlayer.Free;
for I := 0 to FPlayerList.Count -1 do
begin
if TPlayer(FPlayerList[i]).ID = APlayerEditInfo.PlayerInfo.ID then
begin
CPlayer := TPlayer(FPlayerList[i]);
DALoadPlayer(CPlayer);
if (CPlayer.Client<>nil) and
(CPlayer.Client.Interpreter<>nil) then
begin
try
CPlayer.Client.Interpreter.CallSetPlayerInfo(CPlayer);
except
end;
end;
end;
end;
end;
efDeletePlayer:
begin
CPlayer := TPlayer.Create;
CPlayer.SetPlayerInfo(APlayerEditInfo.PlayerInfo);
DADeletePlayer(CPlayer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -