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); }
/** * * 结束棋局,设置棋局状态,结算分数。 * @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); } }