⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rltsvr.pas

📁 一般的数据库管理系统 uses Classes, SConnectEx, TltConst, ExtCtrls, MMSystem, Types, windows, TltLogic , Sy
💻 PAS
📖 第 1 页 / 共 4 页
字号:
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 + -