コード例 #1
0
ファイル: PlayerSetupDialog.cpp プロジェクト: dtbinh/dviz
void PlayerSetupDialog::playerSelected(const QModelIndex & idx)
{
    if(!m_playerList)
        return;
    if(idx.isValid())
        setCurrentPlayer(m_playerList->at(idx.row()));
}
コード例 #2
0
ファイル: MainWindow.cpp プロジェクト: danhedron/connections
void MainWindow::resetGame()
{
	history.clear();

	delete gbw->gameBoard();
	GameBoard* gb = nullptr;
	if(startBoard.getRunSize() == boardSize) {
		gb = new GameBoard(startBoard);
	}
	else {
		gb = new GameBoard(boardSize);
	}
	gbw->setGameBoard(gb);

	if(whitePlayerAgent) {
		delete whitePlayerAgent;
	}
	if(redPlayerAgent) {
		delete redPlayerAgent;
	}

	int thinksize = 0;
	if(boardSize <= 3) thinksize = 5;
	if(boardSize >= 4) thinksize = 4;

	whitePlayerAgent = new MinMaxAgent(T_WHITE, thinksize);

	if(redai) {
		redPlayerAgent = new MinMaxAgent(T_RED, thinksize);

		queueAIMove(redPlayerAgent, T_RED);
	}

	setCurrentPlayer(T_RED);
}
コード例 #3
0
ファイル: game.cpp プロジェクト: mirekum/shashki
void Game::recieveMove() {
	GAMESTATE res_flag;
	//sleep(1);
	MOVE mv = current->getMove();
	delete thread;
	// check move
	if (!board.move(mv)) {
		// wrong move - request move again
		//qDebug() << "(!) wrong move: " << mv.from.x+1 << "," << mv.from.y+1 << " >> " << mv.to.x+1 << "," << mv.to.y+1;
		move();
		return;
	}
	emit updateBoard();
	// check finish
	if (res_flag = board.isWin()) {
		finish(res_flag);
		return;
	}
	// continue game
	if (!board.canMove()) {
		// change current player
		setCurrentPlayer(current->getColor() == WHITE ? BLACK : WHITE);
	}
	// next move, please!
	move();
}
コード例 #4
0
ファイル: MainWindow.cpp プロジェクト: danhedron/connections
void MainWindow::queueAIMove(MinMaxAgent *agent, TokenColour tc)
{
	setCurrentPlayer(tc);

	// Do a little heuristic.
	int minSearch = 4;
	int deepenDelay = 2;
	if(boardSize <= 4) {
		minSearch = 5;
		deepenDelay = 1;
	}
	int runs = gbw->gameBoard()->getRunSize();

	int positions = ((runs + 1) * (gbw->gameBoard()->getRunSize()-1))
			+ (runs * gbw->gameBoard()->getRunSize());
	int available = gbw->gameBoard()->availableMoves(tc).size();
	agent->setMaxDepth(std::max(minSearch, -deepenDelay + (positions - available)/2));

	statusBar()->showMessage(QString("Thinking… (depth: %1)")
							 .arg(agent->maxDepth()), 5000);

	// AIPlayerWorker thread should clean itself up.
	currentWorker = new AIPlayerWorker(agent);
	connect(currentWorker, SIGNAL(moveDecided(BoardIndex,BoardIndex,TokenColour)), this, SLOT(makeMove(BoardIndex,BoardIndex,TokenColour)));
	currentWorker->startMove( gbw->gameBoard() );
}
コード例 #5
0
ファイル: mainwindow.cpp プロジェクト: s-partridge/GameEngine
void MainWindow::onResetBoard()
{
#ifdef DEBUG_VIEW
    print("Resetting game board.");
#endif
    setCurrentPlayer(Elements::PLAYER_1);
    emit tellResetBoard();
}
コード例 #6
0
ファイル: game.cpp プロジェクト: mirekum/shashki
void Game::start() {
	//qDebug() << "Game::start()";
	
	setCurrentPlayer(WHITE);
	
	// first move
	move();
}
コード例 #7
0
ファイル: PlayerManager.cpp プロジェクト: citic/botNeumann
Player* PlayerManager::createPlayer(const QString& nickname)
{
	Player* player = new Player("", nickname);
	player->autogenerateId();
	setCurrentPlayer(player);
	loadPlayers();
	return player;
}
コード例 #8
0
ファイル: PlayerManager.cpp プロジェクト: citic/botNeumann
Player* PlayerManager::setCurrentPlayer(const QByteArray& playerId)
{
	Q_ASSERT(playerId.isEmpty() == false);
	Player* player = new Player(playerId);
	Q_ASSERT(player);
	player->load();
	return setCurrentPlayer(player);
}
コード例 #9
0
ファイル: PlayerSetupDialog.cpp プロジェクト: dtbinh/dviz
void PlayerSetupDialog::removePlayer()
{
    if(!m_con)
        return;
    if(!m_playerList)
        return;

    /// TODO confirm deletion

    m_playerList->removePlayer(m_con);
    m_con->deleteLater();
    m_con = 0;

    if(m_playerList->size() > 0)
        setCurrentPlayer(m_playerList->at(0));
    else
        setCurrentPlayer(0);
}
コード例 #10
0
ファイル: game.cpp プロジェクト: abertram/Invisiboga
/**
 * Setzt den aktuellen Spieler anhand des Spieler-Indexes.
 *
 * @param playerIndex Spieler-Index.
 */
void setCurrentPlayer(int playerIndex) {
    LOGD("Game.setCurrentPlayer");
    // Spieler-Index merken
    currentPlayerIndex = playerIndex;
    // Spieler merken
    currentPlayer = &players[playerIndex];
    // erforderliche Aktionen auf der Java-Ebene anstoßen
    setCurrentPlayer(currentPlayer);
}
コード例 #11
0
ファイル: PlayerSetupDialog.cpp プロジェクト: dtbinh/dviz
void PlayerSetupDialog::newPlayer()
{
    if(!m_playerList)
        return;

    PlayerConnection *con = new PlayerConnection();
    m_playerList->addPlayer(con);
    setCurrentPlayer(con);
    ui->playerListview->setCurrentIndex(m_playerList->index(m_playerList->size()-1,0));
}
コード例 #12
0
ファイル: PlayerSetupDialog.cpp プロジェクト: dtbinh/dviz
void PlayerSetupDialog::setPlayerList(PlayerConnectionList *list)
{
    m_playerList = list;
    ui->playerListview->setModel(list);

    if(list->size() > 0)
    {
        ui->playerListview->setCurrentIndex(list->index(0,0));
        setCurrentPlayer(list->at(0));
    }
    else
        newPlayer();
}
コード例 #13
0
ファイル: MainWindow.cpp プロジェクト: danhedron/connections
void MainWindow::forfeitMove()
{
	if(currentTurn == T_RED) {
		// ask AI player to do something.
		queueAIMove(whitePlayerAgent, T_WHITE);
	}
	else if(currentTurn == T_WHITE) {
		if(redai) {
			queueAIMove(redPlayerAgent, T_RED);
		} else {
			setCurrentPlayer(T_RED);
		}
	}
}
コード例 #14
0
ファイル: MainWindow.cpp プロジェクト: danhedron/connections
MainWindow::MainWindow(QWidget* parent, Qt::WindowFlags flags)
	: QMainWindow(parent, flags), gbw(nullptr), boardSize(5), redai(false),
	  redPlayerAgent(nullptr), whitePlayerAgent(nullptr), startBoard(5),
	  currentWorker(nullptr)
{
	setMinimumSize(400, 400);

	QMenuBar *mb = menuBar();
	QMenu* game = mb->addMenu("&Game");
	QMenu* size = game->addMenu("&New");
	connect(size, SIGNAL(triggered(QAction*)), this, SLOT(resetGame()));

	size->addAction("&Tiny", this, SLOT(tinyGame()));
	size->addAction("&Small", this, SLOT(smallGame()));
	size->addAction("&Medium", this, SLOT(mediumGame()));
	size->addAction("&Normal", this, SLOT(normalGame()));
	size->addAction("&Large", this, SLOT(largeGame()));

	game->addAction("&AI Versus", this, SLOT(AIGame()));

	game->addSeparator();
	game->addAction("&Quit", QApplication::instance(), SLOT(quit()), QKeySequence::Quit);

	QMenu* state = mb->addMenu("&State");

	state->addAction("&Forfeit move", this, SLOT(forfeitMove()));
	state->addSeparator();
	state->addAction("&Print History", this, SLOT(printGameHistory()));
	state->addAction("Write &Graph", this, SLOT(writeGraphviz()));
	state->addAction("Write &Image", this, SLOT(writeStateImage()));


	QMenu* help = mb->addMenu("&Help");
	help->addAction("&About Qt", QGuiApplication::instance(), SLOT(aboutQt()));

	statusLabel = new QLabel();
	statusBar()->addWidget(statusLabel);

	gbw = new GameBoardWidget(this);
	
	setCentralWidget(gbw);

	normalGame();

	setCurrentPlayer(T_RED);

	connect(gbw, SIGNAL(boardClicked(BoardIndex,BoardIndex)), this, SLOT(playerClick(BoardIndex,BoardIndex)));
}
コード例 #15
0
void GameProfile::loadProfile()
{
    loadXml();

    // if no profile found, create default player
    if (m_players.count() == 0)
        setCurrentPlayer(tr("Player"));

    if (m_current >= 0 && m_current < m_players.count()) {
        sndEngine->setChannelVolume(currentPlayer()->soundVolume);
        sndEngine->setMusicVolume(currentPlayer()->musicVolume);
        sndEngine->enableMusic(currentPlayer()->musicEnabled);
    }

//    loadTopTen();
}
コード例 #16
0
ファイル: PlayerManager.cpp プロジェクト: citic/botNeumann
bool PlayerManager::removePlayer(const QByteArray& playerId)
{
	if ( currentPlayer && currentPlayer->getId() == playerId )
	{
		currentPlayer->remove();
		setCurrentPlayer(nullptr);
	}
	else
	{
		Player* player = findPlayerById(playerId);
		if ( player )
			player->remove();
	}
	loadPlayers();
	return true;
}
コード例 #17
0
ファイル: MainWindow.cpp プロジェクト: danhedron/connections
void MainWindow::makeMove(BoardIndex row, BoardIndex column)
{
	gbw->gameBoard()->putToken(row, column, currentTurn);
	history.push_back(*gbw->gameBoard());
	gbw->update();
	if(gbw->gameBoard()->isEndGame()) {
		auto winner = gbw->gameBoard()->getWinner();

		QMessageBox mbx;
		if(winner == T_RED) {
			mbx.setText("Red Player Wins!");
		} else if (winner == T_WHITE) {
			mbx.setText("White Player Wins!");
		}
		else {
			mbx.setText("Nobody Wins!");
		}

		mbx.exec();

		redai = false;
		resetGame();
	}
	else {
		if(currentTurn == T_RED) {
			// ask AI player to do something.
			queueAIMove(whitePlayerAgent, T_WHITE);
		}
		else if(currentTurn == T_WHITE) {
			if(redai) {
				queueAIMove(redPlayerAgent, T_RED);
			} else {
				setCurrentPlayer(T_RED);
			}
		}
	}
}
コード例 #18
0
int main(int argc, char *argv[])
{

    char **playersNameList;
    int totalPlayersNumber;
    int turn, i;
    char buffer[BUFF_SIZE];
    FILE *configFile;

    /* legge gli argomenti */
    char **name1, **name2;

    if (argc < 4) {
        fprintf(stderr,
                "ERROR: Wrong number of arguments. \n USAGE: %s\n",
                USAGE);
        exit(EXIT_FAILURE);
    }
    playersNameList = argv + 3;
    totalPlayersNumber = argc - 3;

    /* controlla se ci sono due giocatori con lo stesso nome */
    for (name1 = playersNameList; *name1; name1++)
        for (name2 = name1 + 1; *name2; name2++)
            if (strcmp(*name1, *name2) == 0) {
                fprintf(stderr, "ERROR: found two player with the"
                        "same name \"%s\"\n", *name1);
                exit(EXIT_FAILURE);
            }
    initIoInterface(argv[2]);
    /* crea e inizializza le strutture dati per i giocatori */
    initPlayersManager(totalPlayersNumber);
    for (; *playersNameList; playersNameList++)
        addPlayer(*playersNameList);

    initBoard();
    /*
     * legge il file di configurazione secondo il formato: 
     *     numero_casella:descrizione della prova\n
     * e aggiunge le descrizioni al tabellone
     */
    if ((configFile = fopen(argv[1], "r")) == NULL) {
        printErr("ERROR: error while opening configuration file\n");
        exit(EXIT_FAILURE);
    }
    while (fgets(buffer, BUFF_SIZE, configFile)) {
        char *description;
        int boxNumber;
        /* legge il numero di casella */
        if ((boxNumber = atoi(buffer)) <= 0) {
            printErr("ERROR:invalid box num(\"%s\") in"
                     " configuration file\n", buffer);
            exit(EXIT_FAILURE);
        }
        /* aggiunge una nuova casella con la relativa descrizione */
        if ((description = strchr(buffer, ':')) == NULL) {
            printErr("ERROR: missing ':' in configuration file\n");
            exit(EXIT_FAILURE);
        }
        addBox(boxNumber, description + 1);
    }
    if (getTotalBoxesNumber() == 0) {
        printErr("ERROR: invalid configuration file\n");
        exit(EXIT_FAILURE);
    }
    fclose(configFile);
    printBoard();
    showGame();
    /* avvia la simulazione del gioco */
    srand(time(NULL));
    for (turn = 0; !allPlayersDone(); turn++) {
        if (!nextStep())
            return EXIT_SUCCESS;
        printMessage("\n**************************************\n");
        printMessage("turno %d", turn + 1);
        printMessage("\n**************************************\n");
        showGame();
        /*
         * per ogni giocatore G che non ha terminato il gioco: 
         * 1. se G  e' fermo per un turno cambia il suo stato in
         *      modo che al turno successivo venga rimesso in gioco 
         * 2. altrimenti viene lanciato il dado, mosso il giocatore
         *              e visualizzata la sua prova 
         */
        while (nextPlayer()) {
            int state = getPlayerState();

            if (state == ACTIVE || state == TEST_PASSED
                || state == TO_BE_ACTIVATED) {
                if (state != ACTIVE)
                    setPlayerState(ACTIVE, 0);
                movePlayer((rand() % 6) + 1);
                if (getPlayerBox() > getTotalBoxesNumber())
                    setPlayerState(DONE, turn);
                else
                    printMessage("player %s: \"%s\"\n",
                                 getPlayerName(),
                                 getDescription(getPlayerBox()));
            } else if (state == OUT_OF_TURN)
                setPlayerState(TO_BE_ACTIVATED, 0);
        }
        showGame();
        /*
         * Legge e registra l'esito di tutte le prove sostenute nel
         * turno corrente dai giocatori 
         */
        for (i = getActivePlayersNumber(); i > 0; i--) {
            int playerNumber;
            bool result;

            do {
                result = askPlayerResult(&playerNumber);
                if (playerNumber > totalPlayersNumber)
                    printErr("WARNING: player number %d out of "
                             "bounds [1; %d]\n", playerNumber,
                             totalPlayersNumber);
                else {
                    setCurrentPlayer(playerNumber);
                    if (getPlayerState() != ACTIVE)
                        printErr("WARNING: player number %d not "
                                 "valid because player:"
                                 "\n\t-won"
                                 "\n\t-is out of turn"
                                 "\n\t-already passed the test\n",
                                 playerNumber);
                }
            }
            while (playerNumber > totalPlayersNumber
                   || getPlayerState() != ACTIVE);
            if (result)
                setPlayerState(TEST_PASSED, 0);
            else
                setPlayerState(OUT_OF_TURN, 0);
        }
    }
    printScore();
    closeIoInterface();

    return EXIT_SUCCESS;
}
コード例 #19
0
ファイル: game.cpp プロジェクト: abertram/Invisiboga
/**
 * Aktualisiert den aktuellen Spiel-Zustand.
 *
 * @param newGameState Neuer Spielzustand.
 */
void updateGameState(int newGameState) {
    LOGD("updateGameState");
    // nichts tun, wenn sich der Zustand nicht verändert hat
    if (newGameState == gameState) {
        return;
    }
    // Spielzustand speichern
    gameState = newGameState;
    // Buffer für Toast-Inhalte
    char text[256];
    // Spiel-Zustand auswerten und die entsprechenden Aktionen ausführen
    switch (gameState) {
        case GAME_STATE_SHOW_HINT_MARKER_NEEDED:
            // um spielen zu können, muss die Kamera auf den Marker gerichtet sein

            sprintf(text, "Halte die Kamera auf den Marker.");
            showToast(text, TOAST_DURATION_LONG);
            gameState = GAME_STATE_WAITING_FOR_MARKER;
            break;
        case GAME_STATE_WAITING_FOR_MARKER:
            // warten, bis die Handy-Kamera auf das Bild gerichtet ist

            break;
        case GAME_STATE_SHOW_HINT_CREATE_SPACES:
            // Hinweise anzeigen, wie das Spielfeld erzeugt werden kann

            sprintf(text, "Halte die Kamera weiterhin auf den Marker.");
            showToast(text, TOAST_DURATION_LONG);
            sprintf(text, "Erzeuge nun ein Spielfeld, indem du auf den Bildschirm tippst oder ...");
            showToast(text, TOAST_DURATION_LONG);
            sprintf(text, "... mit einem Finger langsam ueber den Bildschirm ziehst.");
            showToast(text, TOAST_DURATION_LONG);
            sprintf(text,
                    "Einzelne Felder koennen durch Antippen in Sonderfelder umgewandelt werden.");
            showToast(text, TOAST_DURATION_LONG);
            sprintf(text, "Bleibt ein Spieler auf einem Sonderfeld stehen, ...");
            showToast(text, TOAST_DURATION_LONG);
            sprintf(text,
                    "... darf er um ein paar Felder vorruecken oder muss ein paar Felder zurueck.");
            showToast(text, TOAST_DURATION_LONG);
            gameState = GAME_STATE_CREATING_FIELD;
            break;
        case GAME_STATE_CREATING_FIELD:
            // Spielfeld kann erzeugt werden

            break;
        case GAME_STATE_DRAWING_BEGINNING_PLAYER:
            // ersten Spieler durch Würfeln bestimmen

            LOGI("Drawing beginning player");
            // Die Felder auf denen die Spielfiguren stehen, können erst jetzt initialisiert werden,
            // weil die Positionen der Felder erst jetzt bekannt sind.
            for (int i = 0; i < PLAYER_COUNT; ++i) {
                initPawnSpaces(&players[i].pawn);
            }
            // currentPlayerTextView anzeigen
            showView("currentPlayerTextView");
            // aktuellen Spieler auswürfeln und setzen
            setCurrentPlayer(rand() % PLAYER_COUNT);
            // "Würfeln"-Buuton anzeigen, damit der menschliche Spieler würfeln kann
            if (currentPlayer->type == PLAYER_TYPE_HUMAN) {
                showView("diceButton");
            }
            updateGameState(GAME_STATE_RUNNING);
            break;
        case GAME_STATE_RUNNING:
            // Spiel läuft

            break;
        default:
            LOGE("Unknown game state: %d", gameState);
            break;
    }
}
コード例 #20
0
ファイル: game.cpp プロジェクト: abertram/Invisiboga
/**
 * Verarbeitet den Zug.
 *
 * @param timeIntervalSinceLastFrame Zeit in ms, die seit der Berechnung des letzten Bildes
 *            vergangen ist (nötig für die Animation der Spielfiguren).
 */
void processMove(float timeIntervalSinceLastFrame) {
    // aktuellen Spiel-Zustand auswerten und die entsprechenden Aktionen ausführen
    switch (gameState) {
        case GAME_STATE_RUNNING: {
            // Spiel läuft

            // Prüfung, ob der aktuelle Spieler senen Zug beeendet hat
            if (currentPlayer->state == PLAYER_STATE_POST_MOVING) {
                // Prüfung, ob der Spieler auf einem Sonderfeld gelandet ist
                if (field.spaces[currentPlayer->targetSpaceIndex].type == SPECIAL_SPACE) {
                    // Spieler ist auf einem Sonderfeld gelandet. Es wird per Zufall bestimmt, ob er
                    // vor oder zurück darf und wie weit.

                    // Vorzeichen bestimmen, 0: Spieler darf vor, 1: Spieler muss zurück
                    int sign = rand() % 2;
                    // Betrag bestimmen
                    int value = rand() % MAX_DIE_PIP_COUNT + 1;
                    // Betrag evtl. negieren
                    value *= sign == 0 ? +1 : -1;
                    // neues Ziel setzen
                    setPlayerTargetSpace(currentPlayer, currentPlayer->targetSpaceIndex + value);
                    // Hinweis anzeigen
                    char text[256];
                    sprintf(text, "%s ist auf einem Sonderfeld gelandet und %s %d %s %s",
                            currentPlayer->name, value >= 0 ? "darf um" : "muss", abs(value),
                            abs(value) == 1 ? "Feld" : "Felder",
                            value >= 0 ? "vorruecken" : "zurueck");
                    showToast(text, TOAST_DURATION_LONG);
                    // Zug vorbereiten
                    prepareMove(currentPlayer);
                } else if (currentPlayer->targetSpaceIndex < field.length - 1) {
                    // Aktueller Spieler hat das Zielfeld noch nicht erreicht. Es wird der nächste
                    // Spieler bestimmt und die dafür nötigen Aktionen ausgeführt.

                    // aktuellen Spieler schon mal für seinen nächsten Zug vorbereiten
                    if (currentPlayer->type == PLAYER_TYPE_HUMAN) {
                        // menschlicher Spieler muss warten, bis der "Würfeln"-Button gedrückt wird
                        currentPlayer->state = PLAYER_STATE_WAITING;
                    } else {
                        // Computer-Spieler kann gleich würfeln und ziehen
                        currentPlayer->state = PLAYER_STATE_PRE_MOVING;
                    }
                    // aktuellen Spieler aktualisieren
                    setCurrentPlayer((currentPlayerIndex + 1) % PLAYER_COUNT);
                    // evtl. den "Würfeln"-Button anzeigen
                    if (currentPlayer->type == PLAYER_TYPE_HUMAN) {
                        showView("diceButton");
                    }
                } else {
                    // Der aktuelle Spieler hat das Ziel erreicht und gewinnt.

                    // Hinweis anzeigen
                    char text[256];
                    sprintf(text, "%s erreicht als erster das Ziel und gewinnt",
                            currentPlayer->name);
                    showToast(text, TOAST_DURATION_LONG);
                    // Spiel-Zustand aktualisieren
                    gameState = GAME_STATE_GAME_OVER;
                }
            }
            // den Zug vom aktuellen Spieler weiterverarbeiten lassen
            processPlayerMove(currentPlayer, timeIntervalSinceLastFrame);
            break;
        }
        case GAME_STATE_GAME_OVER: {
            // Spiel ist zu Ende

            LOGD("Game state is GAME_STATE_GAME_OVER");
            break;
        }
        default:
            break;
    }
}
コード例 #21
0
void GameProfile::setPlayerNames(const QStringList &sl)
{
    m_players.clear();
    for (int i = 0; i < sl.count(); i++)
        setCurrentPlayer(sl.at(i));
}