void GameCycle::sendRequest() { if (mp_game->isFinished()) return; if (!mp_requestedPlayer->isAlive()) { Q_ASSERT(m_state != GAMEPLAYSTATE_RESPONSE); startTurn(mp_game->nextPlayer(mp_currentPlayer)); } ActionRequestType requestType; switch(m_state) { case GAMEPLAYSTATE_DRAW: requestType = REQUEST_DRAW; break; case GAMEPLAYSTATE_TURN: requestType = REQUEST_PLAY; break; case GAMEPLAYSTATE_RESPONSE: requestType = REQUEST_RESPOND; break; case GAMEPLAYSTATE_DISCARD: requestType = REQUEST_DISCARD; break; default: NOT_REACHED(); } if (m_contextDirty) { announceContextChange(); } GameEventListener* handler = mp_requestedPlayer->gameEventListener(); if (handler) handler->onActionRequest(requestType); }
bool Game::StartNextTurn() { std::list<Move*> *possibleMoves = currentState->GetPossibleMoves(); GameEnd *result = CheckStartOfTurn(currentState, !possibleMoves->empty()); startOfTurnAppendNotation = result->GetAppendNotation(); if (result->GetType() != StateLogic::None) { ProcessEndOfGame(result); return false; } ApplyUniqueNotation(possibleMoves); bool gotMessage = strlen(result->GetMessage()) != 0; bool local = currentState->GetCurrentPlayer()->GetType() == Player::Local; // capitalize first letter of player name std::string message = ""; char c = toupper(currentState->GetCurrentPlayer()->GetName()[0]); message.insert(0, 1, c); message += currentState->GetCurrentPlayer()->GetName() + 1; message += " to move"; #ifdef EMSCRIPTEN EM_ASM_ARGS({startTurn($0, $1);}, message.c_str(), local);
Board::Board(int _size) { size = _size; //std::cerr << size << "\n"; board = vector<Tile*>(size * size); for (int i=0; i<size; i++) { for (int j=0; j<size; j++) { std::cerr << "Board cell " << (i+1) << "," << (j+1) << "\n"; board[j*size + i] = new Tile(i+1, j+1, NULL, terrachess::T_TERRAIN); } } //Create Players players[terrachess::P_NEUTRAL] = NULL; players[terrachess::P_NATURE] = new PlayerNature(); players[terrachess::P_INDUSTRY] = new PlayerIndustry(); //Position players int midway = ceil(size/2.0); Tile* base; base = this->getTile(size, midway); base->setType(terrachess::T_BASE); this->getPlayer(terrachess::P_NATURE)->setBase(base); base = this->getTile(1, midway); base->setType(terrachess::T_BASE); this->getPlayer(terrachess::P_INDUSTRY)->setBase(base); startTurn(terrachess::P_NATURE); }
void GameCycle::start() { m_contextDirty = 0; Player* player; foreach (player, mp_game->playerList()) if (player->role() == ROLE_SHERIFF) break; Q_ASSERT(player->role() == ROLE_SHERIFF); m_turnNum = 0; startTurn(player); sendRequest(); }
bool BridgeModel::gameNext() { num += 1; if (num == 4) {//开始新一轮 num = 0; turn += 1; //初始化轮,结算上一轮 startTurn(); if (turn == 13) {//牌局结束 return false; } } return true; }
void Field::exec() { startTurn(); if (isDestroyed()) return; if (getObjectType()->isPermanent()) return; duration--; assert(duration >= 0); if (duration == 0) destroy(); }
void GameCycle::finishTurn(Player* player) { m_contextDirty = 0; if (player != mp_requestedPlayer) throw BadPlayerException(mp_currentPlayer->id()); if ((m_state != GAMEPLAYSTATE_TURN) && (m_state != GAMEPLAYSTATE_DISCARD)) throw BadGameStateException(); if (needDiscard(player)) throw TooManyCardsInHandException(); startTurn(mp_game->nextPlayer(mp_currentPlayer)); sendRequest(); }
void ChessGame::onMoveMade(const Chess::Move& move) { ChessPlayer* sender = qobject_cast<ChessPlayer*>(QObject::sender()); Q_ASSERT(sender != nullptr); Q_ASSERT(m_gameInProgress); Q_ASSERT(m_board->isLegalMove(move)); if (sender != playerToMove()) { qDebug("%s tried to make a move on the opponent's turn", qPrintable(sender->name())); return; } m_scores[m_moves.size()] = sender->evaluation().score(); m_moves.append(move); addPgnMove(move, evalString(sender->evaluation())); // Get the result before sending the move to the opponent m_board->makeMove(move); m_result = m_board->result(); if (m_result.isNone()) { if (m_board->reversibleMoveCount() == 0) m_adjudicator.resetDrawMoveCount(); m_adjudicator.addEval(m_board, sender->evaluation()); m_result = m_adjudicator.result(); } m_board->undoMove(); ChessPlayer* player = playerToWait(); player->makeMove(move); m_board->makeMove(move); if (m_result.isNone()) { emitLastMove(); startTurn(); } else { stop(false); emitLastMove(); } }
void GameCycle::discardCard(Player* player, PlayingCard* card) { m_contextDirty = 0; if (player != mp_requestedPlayer) throw BadPlayerException(mp_currentPlayer->id()); if (m_state != GAMEPLAYSTATE_TURN && m_state != GAMEPLAYSTATE_DISCARD) throw BadGameStateException(); if (needDiscard(player) == 0) throw BadGameStateException(); if (card->owner() != mp_requestedPlayer || card->pocket() != POCKET_HAND) throw BadCardException(); mp_game->gameTable().playerDiscardCard(card); m_state = GAMEPLAYSTATE_DISCARD; m_contextDirty = 1; if (needDiscard(player) == 0) startTurn(mp_game->nextPlayer(mp_currentPlayer)); sendRequest(); }
void GameCycle::skipPlayersTurn() { m_contextDirty = 0; startTurn(mp_game->nextPlayer(mp_currentPlayer)); }