Example #1
0
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;
	}
}
Example #2
0
/**
 * 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;
    }
}