void Level::movePlayer(char input, Player &player) { int playerX; int playerY; player.getLocation(playerX, playerY); switch (input) { case 'w': case 'W': processPlayerMove(player, playerX, playerY - 1); break; case 's': case 'S': processPlayerMove(player, playerX, playerY + 1); break; case 'a': case 'A': processPlayerMove(player, playerX-1, playerY); break; case 'd': case 'D': processPlayerMove(player, playerX + 1, playerY); break; default: cout << "invalid input" << endl; system("PAUSE"); break; } }
/** * 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; } }