From 77df743de5b5f81a2222f056e49d9dfd7397da8d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 9 Oct 2025 21:52:39 +0000 Subject: [PATCH] Refactor War game logic and improve card handling Co-authored-by: hailer --- dogclass-main.cpp | 85 ++++++++++++++++++++++++++++++++++++++++++---- war | Bin 0 -> 39656 bytes 2 files changed, 78 insertions(+), 7 deletions(-) create mode 100755 war diff --git a/dogclass-main.cpp b/dogclass-main.cpp index d98633c..3abccaf 100644 --- a/dogclass-main.cpp +++ b/dogclass-main.cpp @@ -16,6 +16,7 @@ Overloading the << Operator for Your Own Classes (https://learn.microsoft.com/en #include #include #include +#include // for std::shuffle using namespace std; @@ -23,6 +24,7 @@ class War { private: int myCurrent; int otherCurrent; + static constexpr int NO_CARD = -1; // Sentinel that cannot be a real card vector newdecks; stack myPlayingPile; queue myStoragePile; @@ -97,7 +99,7 @@ class War { if (myPlayingPile.empty()) { move_my_storage(); if (myPlayingPile.empty()) - return 0; // Return 0 to indicate no cards left + return NO_CARD; // Explicit sentinel distinct from real cards (0-9) } int card = myPlayingPile.top(); myPlayingPile.pop(); @@ -108,7 +110,7 @@ class War { if (otherPlayingPile.empty()) { move_other_storage(); if (otherPlayingPile.empty()) - return 0; // Return 0 to indicate no cards left + return NO_CARD; // Explicit sentinel distinct from real cards (0-9) } int card = otherPlayingPile.top(); otherPlayingPile.pop(); @@ -155,7 +157,36 @@ class War { // Check again after moving storage cards if (myPlayingPile.size() < 2 || otherPlayingPile.size() < 2) { - cout << "Not enough cards, Game Over!" << endl; + // If either player can't continue the war, award the pot to the player who can. + bool myCanContinue = myPlayingPile.size() >= 2; + bool otherCanContinue = otherPlayingPile.size() >= 2; + + if (myCanContinue && !otherCanContinue) { + // Other player loses: award everything to me + myStoragePile.push(myCurrent); + myStoragePile.push(otherCurrent); + while (!lootPile.empty()) { myStoragePile.push(lootPile.front()); lootPile.pop(); } + // Move all remaining other cards to me so game ends next turn + while (!otherPlayingPile.empty()) { myStoragePile.push(otherPlayingPile.top()); otherPlayingPile.pop(); } + while (!otherStoragePile.empty()) { myStoragePile.push(otherStoragePile.front()); otherStoragePile.pop(); } + cout << "Opponent lacks cards for war. I collect the pot and remaining cards." << endl; + } else if (!myCanContinue && otherCanContinue) { + // I lose: award everything to opponent + otherStoragePile.push(myCurrent); + otherStoragePile.push(otherCurrent); + while (!lootPile.empty()) { otherStoragePile.push(lootPile.front()); lootPile.pop(); } + while (!myPlayingPile.empty()) { otherStoragePile.push(myPlayingPile.top()); myPlayingPile.pop(); } + while (!myStoragePile.empty()) { otherStoragePile.push(myStoragePile.front()); myStoragePile.pop(); } + cout << "I lack cards for war. Opponent collects the pot and my remaining cards." << endl; + } else { + // Neither can continue: clear both players so the game ends promptly + while (!lootPile.empty()) lootPile.pop(); + while (!myPlayingPile.empty()) myPlayingPile.pop(); + while (!otherPlayingPile.empty()) otherPlayingPile.pop(); + while (!myStoragePile.empty()) myStoragePile.pop(); + while (!otherStoragePile.empty()) otherStoragePile.pop(); + cout << "Neither player has enough cards for war. Clearing piles; game will end." << endl; + } return; } @@ -163,12 +194,53 @@ class War { lootPile.push(otherCurrent); // Add one hidden card from each player - lootPile.push(remove_my_card()); - lootPile.push(remove_other_card()); + int hiddenMy = remove_my_card(); + int hiddenOther = remove_other_card(); + if (hiddenMy == NO_CARD || hiddenOther == NO_CARD) { + // If a player runs out while drawing hidden cards, resolve as above + if (hiddenMy != NO_CARD) myStoragePile.push(hiddenMy); + if (hiddenOther != NO_CARD) otherStoragePile.push(hiddenOther); + cout << "A player ran out of cards during war draw. Resolving." << endl; + if (hiddenMy == NO_CARD && hiddenOther != NO_CARD) { + otherStoragePile.push(myCurrent); + otherStoragePile.push(otherCurrent); + while (!lootPile.empty()) { otherStoragePile.push(lootPile.front()); lootPile.pop(); } + while (!myPlayingPile.empty()) { otherStoragePile.push(myPlayingPile.top()); myPlayingPile.pop(); } + while (!myStoragePile.empty()) { otherStoragePile.push(myStoragePile.front()); myStoragePile.pop(); } + } else if (hiddenOther == NO_CARD && hiddenMy != NO_CARD) { + myStoragePile.push(myCurrent); + myStoragePile.push(otherCurrent); + while (!lootPile.empty()) { myStoragePile.push(lootPile.front()); lootPile.pop(); } + while (!otherPlayingPile.empty()) { myStoragePile.push(otherPlayingPile.top()); otherPlayingPile.pop(); } + while (!otherStoragePile.empty()) { myStoragePile.push(otherStoragePile.front()); otherStoragePile.pop(); } + } else { + while (!lootPile.empty()) lootPile.pop(); + } + return; + } + lootPile.push(hiddenMy); + lootPile.push(hiddenOther); // Face-up war card myCurrent = remove_my_card(); otherCurrent = remove_other_card(); + if (myCurrent == NO_CARD || otherCurrent == NO_CARD) { + cout << "A player ran out of cards during war face-up draw. Resolving." << endl; + if (myCurrent == NO_CARD && otherCurrent != NO_CARD) { + otherStoragePile.push(otherCurrent); + while (!lootPile.empty()) { otherStoragePile.push(lootPile.front()); lootPile.pop(); } + while (!myPlayingPile.empty()) { otherStoragePile.push(myPlayingPile.top()); myPlayingPile.pop(); } + while (!myStoragePile.empty()) { otherStoragePile.push(myStoragePile.front()); myStoragePile.pop(); } + } else if (otherCurrent == NO_CARD && myCurrent != NO_CARD) { + myStoragePile.push(myCurrent); + while (!lootPile.empty()) { myStoragePile.push(lootPile.front()); lootPile.pop(); } + while (!otherPlayingPile.empty()) { myStoragePile.push(otherPlayingPile.top()); otherPlayingPile.pop(); } + while (!otherStoragePile.empty()) { myStoragePile.push(otherStoragePile.front()); otherStoragePile.pop(); } + } else { + while (!lootPile.empty()) lootPile.pop(); + } + return; + } cout << "My card: " << display_card(myCurrent) << " Opponent's card: " << display_card(otherCurrent) << endl; @@ -220,8 +292,7 @@ int main() { game.deal(); while (game.make_move()) { - game.move_my_storage(); - game.move_other_storage(); + // No explicit moves needed here; make_move handles refills as needed } return 0; diff --git a/war b/war new file mode 100755 index 0000000000000000000000000000000000000000..7afad1bd2ea4586c5c82dd7cc31178e02f13143e GIT binary patch literal 39656 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