Пример #1
0
 public function actionScorelog()
 {
     $id = intval(Yii::app()->request->getParam('id'));
     $player = Player::model()->findByPk($id);
     if (!$id || !$player) {
         throw new CHttpException(404);
     }
     $history = Score_log::model()->findAll("player_id={$id} order by id desc");
     //TODO 分页
     $this->pageTitle = '用户等级分历史记录:' . $player->nickname . '  ' . Yii::app()->params['title'];
     $this->render('scorelog', array('player' => $player, 'history' => $history));
 }
Пример #2
0
 /**
  * 
  * 结束棋局,设置棋局状态,结算分数。
  * @param Games $game
  * @param int $result  1黑胜  0.5和棋   0 白胜
  */
 public static function do_over($game, $result)
 {
     if ($game->status != '进行中') {
         return false;
     }
     $moves = strlen($game->game_record) / 2;
     switch ($result) {
         case 1:
             $game->bplayer->b_win++;
             $game->wplayer->w_lose++;
             $game->status = '黑胜';
             break;
         case 0:
             $game->bplayer->b_lose++;
             $game->wplayer->w_win++;
             $game->status = '白胜';
             break;
         case 0.5:
             $game->bplayer->draw++;
             $game->wplayer->draw++;
             $game->status = '和棋';
             break;
     }
     $game->bplayer->games++;
     $game->wplayer->games++;
     $game->movetime = date('Y-m-d H:i:s');
     $game->save();
     //对局量前50局,K值取30,然后,一般取20-15之间,等级分达到2400后K值取10 TODO
     //惩罚性规则:如果手数小于16,则变动系数K降为5,如果手数小于5,则降为1。
     $k_black = 30;
     $k_white = 30;
     if ($game->bplayer->games >= 50) {
         $k_black = 16;
     }
     if ($game->wplayer->games >= 50) {
         $k_white = 16;
     }
     if ($game->bplayer->score >= 2400) {
         $k_black = 10;
     }
     if ($game->wplayer->score >= 2400) {
         $k_white = 10;
     }
     if ($moves < 5) {
         $k_black = 1;
         $k_white = 1;
     }
     $before_black_score = $game->bplayer->score;
     $before_white_score = $game->wplayer->score;
     $we = 1 / (1 + pow(10, ($before_white_score - $before_black_score) / 400));
     $delta_black = $k_black * ($result - $we);
     /*记录积分变动log*/
     $log = new Score_log();
     $log->game_id = $game->id;
     $log->player_id = $game->black_id;
     $log->op_id = $game->white_id;
     $log->before_score = $before_black_score;
     $log->op_score = $before_white_score;
     $log->k_val = $k_black;
     $log->delta_score = $delta_black;
     $log->after_score = $before_black_score + $delta_black;
     $log->save();
     /*记录积分变动log end */
     $game->bplayer->score = $log->after_score;
     //$game->bplayer->score + $delta_black;
     $game->bplayer->save();
     $delta_white = -1 * $k_white * ($result - $we);
     /*记录积分变动log*/
     $log = new Score_log();
     $log->game_id = $game->id;
     $log->player_id = $game->white_id;
     $log->op_id = $game->black_id;
     $log->before_score = $before_white_score;
     $log->op_score = $before_black_score;
     $log->k_val = $k_white;
     $log->delta_score = $delta_white;
     $log->after_score = $before_white_score + $delta_white;
     $log->save();
     /*记录积分变动log end */
     $game->wplayer->score = $log->after_score;
     //$game->wplayer->score + $delta_white;
     $game->wplayer->save();
     //如果是比赛,调用一下比赛结束
     if ($game->tid) {
         TournamentTool::end_tournament($game->tid);
     }
 }