Exemplo n.º 1
0
 public function actionQuit()
 {
     $id = Yii::app()->request->getParam('id');
     if (!$this->_userinfo()) {
         $this->json_return(false, 'need_login', '/?refer=' . urlencode($this->createUrl('tournament/detail', array('id' => $id))));
     }
     $tournament = Tournament::model()->findByPk($id);
     if (!$tournament || $tournament->status != 'signing') {
         $this->json_return(false, '只有尚未开始的比赛才能取消报名。');
     }
     $joined = Tournament_join::model()->find("tid={$id} and uid=" . $this->_userinfo()->id);
     if (!$joined) {
         $this->json_return(false, '您还没有报过名。');
     }
     $quit_sn = $joined->t_sn;
     $joined->delete();
     Tournament_join::model()->getDbConnection()->createCommand('update tournament_join set t_sn=t_sn-1 where t_sn>' . $quit_sn . ' and tid=' . $id)->execute();
     TournamentTool::setUpTournament($tournament);
     $this->json_return(true);
 }
Exemplo n.º 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);
     }
 }