add an fps limit, implement logic to not take pawns in protected fields

This commit is contained in:
2025-01-28 06:03:04 +01:00
parent 2469c6e504
commit 3e67b127a0
3 changed files with 24 additions and 3 deletions

View File

@@ -57,6 +57,9 @@ void Board::initWindow() {
"Okno planszy - Chinczyk188", "Okno planszy - Chinczyk188",
sf::Style::Default); sf::Style::Default);
// Ustaw rozsądny limit FPS
this->window->setFramerateLimit(120);
} }
void Board::initBoard() { void Board::initBoard() {

View File

@@ -78,7 +78,8 @@ void Engine::nextTurn() {
// Wybieranie pionka // Wybieranie pionka
bool pickAPlace = false; bool pickAPlace = false;
bool isMovePossible = checkPossibleMoves(currentPlayer.getColor(), 6) > 0; /*bool isMovePossible = checkPossibleMoves(currentPlayer.getColor(), 6) > 0;*/
bool isMovePossible = checkPossibleMoves(currentPlayer.getColor(), diceRoll) > 0;
// Wylosowanie szóstki to specjalny przypadek // Wylosowanie szóstki to specjalny przypadek
if (diceRoll == 6) { if (diceRoll == 6) {
@@ -353,6 +354,12 @@ short Engine::fieldToFirstPawnId(short color, short field) {
bool Engine::isMoveLegal(short color, short pawnId, short steps) { bool Engine::isMoveLegal(short color, short pawnId, short steps) {
// kopia tego, co jest w Engine::movePawn() // kopia tego, co jest w Engine::movePawn()
short field = relPosToField(color, this->players[color].getRelativePawns()[pawnId]); short field = relPosToField(color, this->players[color].getRelativePawns()[pawnId]);
// Jeśli ruch, który chcemy wykonać zbiłby pionki w chronionym polu, zwróć false.
if (this->players[color].getRelativePawns()[pawnId] + steps < 44) {
short newField = relPosToField(color, this->players[color].getRelativePawns()[pawnId] + steps);
short occupyingColor = fieldToColor(newField);
if (occupyingColor != -1 && relPosToField(occupyingColor, 0) == newField) return false;
}
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
if (field == getPawnInitialPosition(color, i)) if (field == getPawnInitialPosition(color, i))
return false; return false;
@@ -497,6 +504,13 @@ short Engine::takePawns(short color, short field) {
*/ */
bool Engine::movePiece(short color, short field, short steps) { // podajemy color dla sanity-checku, czy użytkownik nie chce ruszyć nie swojego pionka bool Engine::movePiece(short color, short field, short steps) { // podajemy color dla sanity-checku, czy użytkownik nie chce ruszyć nie swojego pionka
// Jeśli ruch, który chcemy wykonać zbiłby pionki w chronionym polu, zwróć false.
if (fieldToRelPos(color, field) + steps < 44) {
short newField = relPosToField(color, fieldToRelPos(color, field) + steps);
short occupyingColor = fieldToColor(newField);
if (occupyingColor != -1 && relPosToField(occupyingColor, 0) == newField) return false;
}
// Nie pozwól użytkownikowi wybrać (i w konsekwencji ruszyć) pionków w bazie // Nie pozwól użytkownikowi wybrać (i w konsekwencji ruszyć) pionków w bazie
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
if (field == getPawnInitialPosition(color, i)) if (field == getPawnInitialPosition(color, i))
@@ -522,7 +536,11 @@ bool Engine::movePiece(short color, short field, short steps) { // podajemy colo
} }
} }
// - jeśli ma, musimy go (/je) zbić // - jeśli ma, musimy go (/je) zbić
if (isNewFieldOccupied && color != occupyingColor) takePawns(occupyingColor, newField); short takenPawns = -1;
if (isNewFieldOccupied && color != occupyingColor) takenPawns = takePawns(occupyingColor, newField);
// - uwaga! jeśli nie zbiliśmy żadnego pionka, to dlatego, ponieważ pionki są w chronionym polu!!!
// musimy to uszanować, dlatego kończymy metodę zwracając false
if (isNewFieldOccupied && takenPawns == -1) return false;
// - w końcu, dopisujemy pionek bieżącego gracza // - w końcu, dopisujemy pionek bieżącego gracza
this->board.fields[newField][i] = color + 4; this->board.fields[newField][i] = color + 4;
this->players[this->currentPlayerIndex].unsafeMovePiece(i, steps); this->players[this->currentPlayerIndex].unsafeMovePiece(i, steps);

View File

@@ -279,7 +279,7 @@ void Game::run() {
// Zapisz do pliku CSV // Zapisz do pliku CSV
this->dumpLeaderboards(this->leaderboardLocation); this->dumpLeaderboards(this->leaderboardLocation);
this->dumpLeaderboards("." + this->leaderboardLocation + ".old", false); // this->dumpLeaderboards("." + this->leaderboardLocation + ".old", false);
this->board.smartSleep(20000); this->board.smartSleep(20000);