From 3e67b127a05922e08e923274714e556681015418 Mon Sep 17 00:00:00 2001 From: sherl Date: Tue, 28 Jan 2025 06:03:04 +0100 Subject: [PATCH] add an fps limit, implement logic to not take pawns in protected fields --- Chinczyk188/Board.cpp | 3 +++ Chinczyk188/Engine.cpp | 22 ++++++++++++++++++++-- Chinczyk188/Game.cpp | 2 +- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/Chinczyk188/Board.cpp b/Chinczyk188/Board.cpp index 1fbab46..3035c62 100644 --- a/Chinczyk188/Board.cpp +++ b/Chinczyk188/Board.cpp @@ -57,6 +57,9 @@ void Board::initWindow() { "Okno planszy - Chinczyk188", sf::Style::Default); + // Ustaw rozsądny limit FPS + this->window->setFramerateLimit(120); + } void Board::initBoard() { diff --git a/Chinczyk188/Engine.cpp b/Chinczyk188/Engine.cpp index 38b1a97..1f9743f 100644 --- a/Chinczyk188/Engine.cpp +++ b/Chinczyk188/Engine.cpp @@ -78,7 +78,8 @@ void Engine::nextTurn() { // Wybieranie pionka 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 if (diceRoll == 6) { @@ -353,6 +354,12 @@ short Engine::fieldToFirstPawnId(short color, short field) { bool Engine::isMoveLegal(short color, short pawnId, short steps) { // kopia tego, co jest w Engine::movePawn() 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++) { if (field == getPawnInitialPosition(color, i)) 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 + // 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 for (int i = 0; i < 4; 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ć - 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 this->board.fields[newField][i] = color + 4; this->players[this->currentPlayerIndex].unsafeMovePiece(i, steps); diff --git a/Chinczyk188/Game.cpp b/Chinczyk188/Game.cpp index af831be..13aca76 100644 --- a/Chinczyk188/Game.cpp +++ b/Chinczyk188/Game.cpp @@ -279,7 +279,7 @@ void Game::run() { // Zapisz do pliku CSV this->dumpLeaderboards(this->leaderboardLocation); - this->dumpLeaderboards("." + this->leaderboardLocation + ".old", false); + // this->dumpLeaderboards("." + this->leaderboardLocation + ".old", false); this->board.smartSleep(20000);