Пример #1
0
 /**
  * 
  * 落子提交。
  * str_split 分割坐标
  */
 public function actionMove()
 {
     if (!$this->_userinfo()) {
         $this->redirect('/?refer=' . urlencode(Yii::app()->request->getRequestUri()));
     }
     //如果没有参数,跳回play界面。
     $id = intval(Yii::app()->request->getParam('id'));
     $swap = intval(Yii::app()->request->getParam('swap'));
     $move = trim(Yii::app()->request->getParam('move'));
     $a5pos = trim(Yii::app()->request->getParam('a5pos'));
     $a5number = intval(Yii::app()->request->getParam('a5number'));
     $game = Games::model()->findByPk($id);
     if (!$id || !$game) {
         $this->redirect('/games.html');
     }
     $turn = $this->turn($game);
     $game_addr = '/game_' . $id . '.html?_rnd=' . time();
     if ($game->status == '进行中' && $this->refresh_time($game) && $this->_userinfo()->id == ($turn ? $game->black_id : $game->white_id)) {
         $stones = strlen($game->game_record) / 2;
         if ($turn) {
             if ($game->game_record == '') {
                 if (strlen($move) != 6) {
                     $this->page_msg('请下开局前3手。', $game_addr);
                 }
                 if (!BoardTool::board_correct($move)) {
                     $this->page_msg('您提交的数据不正确,请刷新页面重试。', $game_addr);
                 }
                 if ($game->free_opening == 0) {
                     if (substr($move, 0, 2) != '88' || !in_array(substr($move, 2, 1), array('7', '8', '9')) || !in_array(substr($move, 3, 1), array('7', '8', '9')) || !in_array(substr($move, 4, 1), array('6', '7', '8', '9', 'a')) || !in_array(substr($move, 5, 1), array('6', '7', '8', '9', 'a'))) {
                         $this->page_msg('非标准的开局,请重新开局。', $game_addr);
                     }
                 }
                 if ($game->rule == 'Yamaguchi') {
                     if (!$a5number) {
                         $this->page_msg('请输入打点数量。', $game_addr);
                     }
                     $game->a5_numbers = $a5number > 20 ? 20 : $a5number;
                 }
                 $game->game_record = $move;
             } elseif ($stones == 4 && $game->a5_pos == '') {
                 if (strlen($a5pos) / 2 != $game->a5_numbers) {
                     $this->page_msg('请下' . $game->a5_numbers . '个打点。', $game_addr);
                 }
                 if (!BoardTool::board_correct($game->game_record . $a5pos)) {
                     $this->page_msg('您提交的数据不正确,请刷新页面重试。', $game_addr);
                 }
                 if (BoardTool::a5_symmetry($game->game_record, $a5pos)) {
                     $this->page_msg('五手打点不可以对称,请重新选择。', $game_addr);
                 }
                 $game->a5_pos = $a5pos;
             } else {
                 $game->game_record .= $move;
                 if (strlen($move) != 2 || !BoardTool::board_correct($game->game_record)) {
                     $this->page_msg('您提交的数据不正确,请刷新页面重试。', $game_addr);
                 }
                 // 判断胜负
                 $this->checkwin($game);
             }
         } else {
             if ($stones == 3 && $swap && !$game->swap) {
                 $temp = $game->black_id;
                 $game->black_id = $game->white_id;
                 $game->white_id = $temp;
                 $temp = $game->black_time;
                 $game->black_time = $game->white_time;
                 $game->white_time = $temp;
                 $game->swap = 1;
             } else {
                 if ($stones == 4) {
                     if (!in_array($a5pos, str_split($game->a5_pos, 2))) {
                         $this->page_msg('请选择黑方的打点。', $game_addr);
                     }
                     $game->game_record .= $a5pos;
                 }
                 $game->game_record .= $move;
                 if (strlen($move) != 2 || !BoardTool::board_correct($game->game_record)) {
                     $this->page_msg('您提交的数据不正确,请刷新页面重试。', $game_addr);
                 }
                 // 判断胜负
                 $this->checkwin($game);
             }
         }
         $game->offer_draw = 0;
         $game->movetime = date('Y-m-d H:i:s');
         $game->save();
     }
     $this->redirect($game_addr);
 }