コード例 #1
0
ファイル: gamecycle.cpp プロジェクト: Riftsk/kbang
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);
}
コード例 #2
0
ファイル: Game.cpp プロジェクト: FTWinston/Chessmaker
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);
コード例 #3
0
ファイル: board.cpp プロジェクト: pro-mole/Colonization-Chess
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);
}
コード例 #4
0
ファイル: gamecycle.cpp プロジェクト: Riftsk/kbang
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();
}
コード例 #5
0
ファイル: BridgeModel.cpp プロジェクト: ifplusor/alphabridge
bool BridgeModel::gameNext() {
    num += 1;
    if (num == 4) {//开始新一轮
        num = 0;
        turn += 1;
        //初始化轮,结算上一轮
        startTurn();
        if (turn == 13) {//牌局结束
            return false;
        }
    }
    return true;
}
コード例 #6
0
ファイル: Field.cpp プロジェクト: Elzair/nazghul
void Field::exec()
{
        startTurn();
        if (isDestroyed())
                return;
        
        if (getObjectType()->isPermanent())
                return;

        duration--;
        assert(duration >= 0);
        if (duration == 0)
                destroy();
}
コード例 #7
0
ファイル: gamecycle.cpp プロジェクト: Riftsk/kbang
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();
}
コード例 #8
0
ファイル: chessgame.cpp プロジェクト: joergoster/cutechess
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();
	}
}
コード例 #9
0
ファイル: gamecycle.cpp プロジェクト: Riftsk/kbang
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();
}
コード例 #10
0
ファイル: gamecycle.cpp プロジェクト: Riftsk/kbang
void GameCycle::skipPlayersTurn()
{
    m_contextDirty = 0;
    startTurn(mp_game->nextPlayer(mp_currentPlayer));
}