implement proper dice-rolling mechanic, as seen on Wikipedia

This commit is contained in:
2025-01-26 23:20:13 +01:00
parent 62d87bdc35
commit c0a4e3bdb2
2 changed files with 19 additions and 3 deletions

View File

@@ -52,11 +52,13 @@ void Engine::nextTurn() {
std::cout << "Ruch gracza " << currentPlayer.getName()
<< " (" << colorNames[currentPlayer.getColor()] << ").\n";
// Rysuj pionki
// ...
// Rzut kostką
if (dicerollLoaded) this->dicerollBuffer.play();
int diceRoll = rollDice(currentPlayer.getSeed(), currentPlayer.getRollCount());
std::cout << "Wylosowano " << diceRoll << ".\n";
currentPlayer.incrementRollCount();
this->board.smartSleep(1000);
// Wybieranie pionka
@@ -70,6 +72,7 @@ void Engine::nextTurn() {
// 0 pionków na planszy - musi wyjść pionkiem
case 0:
std::cout << currentPlayer.getName() << " wychodzi pierwszym pionkiem z bazy.\n";
currentPlayer.hasLeftBase = true;
currentPlayer.pawnsAtBase--;
currentPlayer.pawnsActive++;
this->pawnmoveBuffer.play();
@@ -190,13 +193,25 @@ void Engine::nextTurn() {
// }
if (currentPlayer.hasWon()) {
// Zostanie wykorzystane do zwiększenia liczby wygranych
this->tadaBuffer.play();
this->winnerNickname = currentPlayer.getName();
announceWinner(currentPlayer);
} else {
// Iteruj po wektorze z graczami
currentPlayerIndex = (currentPlayerIndex + 1) % players.size();
currentPlayer.incrementRollCount();
if (!currentPlayer.hasLeftBase && currentPlayer.getRollCount() % 3 != 0) {
// Jeśli gracz nie wyszedł z bazy i nie wyrzucił kostki trzy razy pod rząd,
// zaktualizuj liczbę losowań, ale pozwól mu spróbować ponownie.
} else {
// Jeśli gracz wyszedł z bazy, albo rzucił kostką trzy razy pod rząd,
// daj szansę kolejnemu graczowi... pod warunkiem, że nie wyrzucono 6.
if (diceRoll != 6) this->currentPlayerIndex = (this->currentPlayerIndex + 1) % this->players.size();
}
}
this->board.smartSleep(1000);

View File

@@ -25,6 +25,7 @@ class Player {
short pawnsAtHome = 0;
bool hasWon() const;
bool hasLeftBase = false;
private:
std::string name;