turned ifs into switches, added win chime

This commit is contained in:
2025-01-26 20:07:05 +01:00
parent 925d566177
commit 6fda4041ae
5 changed files with 99 additions and 64 deletions

View File

@@ -18,6 +18,11 @@ Engine::Engine(): currentPlayerIndex(0) {
std::cerr << "Nie udalo sie zaladowac efektu dzwiekowego ruchu pionkow.\n\n"; std::cerr << "Nie udalo sie zaladowac efektu dzwiekowego ruchu pionkow.\n\n";
this->pawnmoveLoaded = false; this->pawnmoveLoaded = false;
} }
if (!this->tadaBuffer.openFromFile("res/audio/jimhancock_tada.ogg")) {
std::cerr << "Nie udalo sie zaladowac efektu dzwiekowego wygranej.\n\n";
this->tadaLoaded = false;
}
} }
void Engine::addPlayer(const std::string& name, unsigned int seed, short color) { void Engine::addPlayer(const std::string& name, unsigned int seed, short color) {
@@ -58,89 +63,111 @@ void Engine::nextTurn() {
bool pickAPlace = false; bool pickAPlace = false;
// Wylosowanie szóstki to specjalny przypadek // Wylosowanie szóstki to specjalny przypadek
if (diceRoll == 6) { if (diceRoll == 6) {
if (currentPlayer.pawnsActive == 0) {
// Musi wyjść pionkiem
std::cout << currentPlayer.getName() << " wychodzi pierwszym pionkiem z bazy.\n";
currentPlayer.pawnsAtBase--;
currentPlayer.pawnsActive++;
this->pawnmoveBuffer.play();
this->board.smartSleep(2000);
} else if (currentPlayer.pawnsActive > 0 && currentPlayer.pawnsActive < 4) {
// Może wyjść z bazy albo ruszyć pionek std::string choice;
std::string choice; switch (currentPlayer.pawnsActive) {
std::cout << "Co chcesz zrobic?\n"; // 0 pionków na planszy - musi wyjść pionkiem
std::cout << "a) Wyjsc pionkiem z bazy\n" case 0:
<< "b) Wykonac ruch wyciagnietym wczesniej pionkiem\n" std::cout << currentPlayer.getName() << " wychodzi pierwszym pionkiem z bazy.\n";
<< "> "; currentPlayer.pawnsAtBase--;
currentPlayer.pawnsActive++;
this->pawnmoveBuffer.play();
this->board.smartSleep(2000);
break;
while (true) { // 1, 2, 3 pionki na planszy - może wyjść z bazy albo ruszyć pionek
case 1: case 2: case 3:
// Czyścimy bufor, aby zignorować cokolwiek, co pojawiło się po znaku std::cout << "Co chcesz zrobic?\n";
// białym a przed \n - aby np. żaden z użytkowników nie mógł std::cout << "a) Wyjsc pionkiem z bazy\n"
// napisać "a a" i potencjalnie zadecydować o ruchu oponenta. << "b) Wykonac ruch wyciagnietym wczesniej pionkiem\n"
// std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); << "> ";
// std::cin >> choice; while (true) {
// std::cin.sync();
choice = this->board.asyncStrGetline();
choice[0] |= 32;
if (choice[0] == 'a') { // getline() nie pozostawia nic w buforze wejściowym, dlatego nie musimy
// aż tak na niego uważać, jak w przypadku cin'a.
pickAPlace = false; choice = this->board.asyncStrGetline();
std::cout << currentPlayer.getName() << " wychodzi " choice[0] |= 32;
<< currentPlayer.pawnsActive + 1 << ". pionkiem z bazy.\n";
currentPlayer.pawnsAtBase--;
currentPlayer.pawnsActive++;
this->pawnmoveBuffer.play();
this->board.smartSleep(2000);
break;
} else if (choice[0] == 'b') { if (choice[0] == 'a') {
if (currentPlayer.pawnsActive > 1) { pickAPlace = false;
pickAPlace = true; std::cout << currentPlayer.getName() << " wychodzi "
} else { << currentPlayer.pawnsActive + 1 << ". pionkiem z bazy.\n";
std::cout << currentPlayer.getName() << " rusza jedyny pionek " currentPlayer.pawnsAtBase--;
<< diceRoll << " pol do przodu.\n"; currentPlayer.pawnsActive++;
this->pawnmoveBuffer.play(); this->pawnmoveBuffer.play();
this->board.smartSleep(2000); this->board.smartSleep(2000);
} break;
break;
} else std::cout << "Podaj jedna z wymienionych odpowiedzi!\n> "; } else if (choice[0] == 'b') {
}
if (currentPlayer.pawnsActive > 1) {
pickAPlace = true;
} else {
std::cout << currentPlayer.getName() << " rusza jedyny pionek "
<< diceRoll << " pol do przodu.\n";
this->pawnmoveBuffer.play();
this->board.smartSleep(2000);
}
break;
} else std::cout << "Podaj jedna z wymienionych odpowiedzi!\n> ";
}
break;
// 4 pionki na planszy - musi ruszyć pionek, o ile może
case 4:
// TODO
pickAPlace = true;
this->pawnmoveBuffer.play();
break;
} else if (currentPlayer.pawnsActive == 4) {
// Musi ruszyć pionek, o ile może
// TODO
pickAPlace = true;
this->pawnmoveBuffer.play();
} }
} else { } else {
// Musi ruszyć któryś z pionków // Jeśli nie wypadło 6, gracz musi ruszyć któryś z pionków
pickAPlace = true; switch (currentPlayer.pawnsActive) {
if (currentPlayer.pawnsActive == 1) {
// Jedyny pionek możemy ruszyć za niego // 0 pionków na planszy
pickAPlace = false; case 0:
std::cout << currentPlayer.getName() << " rusza jedyny pionek " // Gracz nie może ruszyć pionków, których nie ma.
<< diceRoll << " pol do przodu.\n"; pickAPlace = false;
this->pawnmoveBuffer.play(); break;
this->board.smartSleep(2000);
// 1 pionek na planszy
case 1:
// Nie potrzebujemy, aby gracz wskazał jedyny pionek na planszy,
// dlatego ruszamy go za niego.
pickAPlace = false;
// TODO: znajdź ten pionek i ustaw selectedField na niego!!!
std::cout << currentPlayer.getName() << " rusza jedyny pionek "
<< diceRoll << " pol do przodu.\n";
this->pawnmoveBuffer.play();
this->board.smartSleep(2000);
break;
// 2, 3, 4 pionki na planszy
case 2: case 3: case 4:
// Gracz musi wybrać pionek
pickAPlace = true;
break;
} }
} }
if (currentPlayer.pawnsActive > 1 && pickAPlace) { if (pickAPlace) {
std::cout << "Wybierz prosze pionek na planszy ktorym chcesz wykonac ruch.\n"; std::cout << "Wybierz prosze pionek na planszy ktorym chcesz wykonac ruch.\n";
} }
// Użytkownik wybiera pionek na planszy, którym chce się ruszyć // Użytkownik wybiera pionek na planszy, którym chce się ruszyć
short pickStatus = 0; short pickStatus = 0;
short selectedField = -1; short selectedField = -1;
if (currentPlayer.pawnsActive == 0 || !pickAPlace) pickStatus = 8; // pomiń pętlę if (!pickAPlace) pickStatus = 8; // pomiń pętlę
while (pickStatus != 8) { while (pickStatus != 8) {
this->board.selectAField(pickStatus, selectedField); this->board.selectAField(pickStatus, selectedField);
@@ -149,10 +176,13 @@ void Engine::nextTurn() {
std::cout << "(Engine.cpp) selected: " << selectedField << "\n"; std::cout << "(Engine.cpp) selected: " << selectedField << "\n";
this->pawnmoveBuffer.play(); // Jeżeli gracz się ruszył, odtwórz dźwięk ruchu
this->board.smartSleep(1000); if (selectedField != -1) {
this->pawnmoveBuffer.play();
this->board.smartSleep(1000);
}
// TEST // Debug: odkomentuj, aby wymusić wygraną:
// currentPlayer.tryMovingPawn(0, 0); // currentPlayer.tryMovingPawn(0, 0);
// if (!pickAPlace) { // if (!pickAPlace) {
@@ -161,6 +191,7 @@ void Engine::nextTurn() {
if (currentPlayer.hasWon()) { if (currentPlayer.hasWon()) {
// Zostanie wykorzystane do zwiększenia liczby wygranych // Zostanie wykorzystane do zwiększenia liczby wygranych
this->tadaBuffer.play();
this->winnerNickname = currentPlayer.getName(); this->winnerNickname = currentPlayer.getName();
announceWinner(currentPlayer); announceWinner(currentPlayer);
} else { } else {

View File

@@ -28,8 +28,10 @@ class Engine {
// Audio // Audio
bool dicerollLoaded = true; bool dicerollLoaded = true;
bool pawnmoveLoaded = true; bool pawnmoveLoaded = true;
bool tadaLoaded = true;
sf::Music dicerollBuffer; sf::Music dicerollBuffer;
sf::Music pawnmoveBuffer; sf::Music pawnmoveBuffer;
sf::Music tadaBuffer;
// Pomocnicze // Pomocnicze
std::string winnerNickname = ""; std::string winnerNickname = "";

View File

@@ -181,6 +181,8 @@ Game::Game() {
// Konstruktor klasy. Klasę Game tworzymy poprzez // Konstruktor klasy. Klasę Game tworzymy poprzez
// ustawienie domyślnych wartości i stworzenie okna. // ustawienie domyślnych wartości i stworzenie okna.
std::cout << "\033]0;" << "Chinczyk188" << "\007" << "\n";
this->initVariables(); this->initVariables();
this->board.initVariables(); this->board.initVariables();
this->board.initWindow(); this->board.initWindow();
@@ -292,7 +294,7 @@ void Game::run() {
this->dumpLeaderboards(this->leaderboardLocation); this->dumpLeaderboards(this->leaderboardLocation);
this->dumpLeaderboards("." + this->leaderboardLocation + ".old", false); this->dumpLeaderboards("." + this->leaderboardLocation + ".old", false);
this->board.smartSleep(10000); this->board.smartSleep(20000);
board.closeWindow(); board.closeWindow();

View File

@@ -28,7 +28,7 @@ short Player::getColor() const {
} }
short Player::tryMovingPawn(short pawnID, short fields) { short Player::tryMovingPawn(short pawnID, short fields) {
// this->pawnsFinished = 4; // do testowania, wymuszania zakończenia gry // this->pawnsFinished = 4; // do debugowania, wymusza zakończenia gry
return 0; return 0;
} }

Binary file not shown.