/* * Sorgt dafuer, dass die Heap-Bedingung wieder stimmt, falls die Heap- * Bedingung bei allen Kind-Baeumen erfuellt ist. (Wenn man von unten nach * oben geht, kann man so automatisch die komplette Bedingung wieder * herstellen, da die Heap-Eigenschaft auf Blaettern immer erfuellt ist). */ void heapify(int i) { int greatest = getGreatest(i); if (greatest != i) { swap(i, greatest); heapify(greatest); } }
//Determines the result of an attack between countries based on the forces used bool Game::attack(Territory* sourceAttacking, int armiesAttacking, Territory* target, int defendingArmies, bool alreadyWonOneBattleThisTurn){ int attacking = armiesAttacking; int defending = defendingArmies; attackLogString += "Attack: Player " + std::to_string(sourceAttacking->getIndexOfControllingPlayer()+1) + " attacked "; attackLogString += "Player " + std::to_string(target->getIndexOfControllingPlayer()+1) + " from " + sourceAttacking->getName(); attackLogString += " with " + std::to_string(armiesAttacking) + " armies to " + target->getName() + " with " + std::to_string(defendingArmies) + ".\n"; std::vector<int> attRolls; std::vector<int> defRolls; srand(time(NULL)); while (attacking != 0 && defending != 0){//while there are attacking or defending armies remaining for (int i = 0; i < attacking; i++){ if (i < 3){ attRolls.push_back(rollDie()); } } for (int i = 0; i < defending; i++){ if (i < 2){ defRolls.push_back(rollDie()); } } if (defRolls.size() > 1 && attRolls.size() > 1){//for atleast 2 dice in attacker and defender if (getGreatest(defRolls) >= getGreatest(attRolls)){//if def is greater or equal to attacking attacking = attacking-1; } else{//if attacking is greater defending = defending - 1; } if (getSecondGreatest(defRolls) >= getSecondGreatest(attRolls)){//if def is greater or equal to attacking attacking = attacking - 1; } else{//if attacking is greater defending = defending-1; } } else{//for less than 2 dices in either attacking or defending if (getGreatest(defRolls) >= getGreatest(attRolls)){//if def is greater or equal to attacking attacking = attacking - 1; } else{//if attacking is greater defending = defending-1; } } attRolls.clear(); defRolls.clear(); } if (attacking == 0){ attackLogString += "The defending army was victorious!\n"; target->setArmiesInTerritory(defending); return false; } else if (defending == 0){ attackLogString += "The attacking army was victorious!\n"; int tempIndexOfDef = target->getIndexOfControllingPlayer(); target->setArmiesInTerritory(attacking); players->at(target->getIndexOfControllingPlayer())->removeTerritoryOwned(target);//removing from defender the territory target->setIndexOfControllingPlayer(sourceAttacking->getIndexOfControllingPlayer()); players->at(sourceAttacking->getIndexOfControllingPlayer())->addTerritoryOwned(target);//adding to attacker the territory if (alreadyWonOneBattleThisTurn == false){//wont allow to win more than 1 cards per turn int card = rand() % 3 + 1; if (card == 1){ players->at(sourceAttacking->getIndexOfControllingPlayer())->setArtilleryCards(players->at(sourceAttacking->getIndexOfControllingPlayer())->getArtilleryCards() + 1); } else if (card == 2){ players->at(sourceAttacking->getIndexOfControllingPlayer())->setCavalryCards(players->at(sourceAttacking->getIndexOfControllingPlayer())->getCavalryCards() + 1); } else if (card == 3){ players->at(sourceAttacking->getIndexOfControllingPlayer())->setInfantryCards(players->at(sourceAttacking->getIndexOfControllingPlayer())->getInfantryCards() + 1); } } if (players->at(tempIndexOfDef)->getNumberOfTerritories() == 0){//if player lost, transfers cards players->at(sourceAttacking->getIndexOfControllingPlayer())->setArtilleryCards(players->at(sourceAttacking->getIndexOfControllingPlayer())->getArtilleryCards() + players->at(tempIndexOfDef)->getArtilleryCards()); players->at(sourceAttacking->getIndexOfControllingPlayer())->setCavalryCards(players->at(sourceAttacking->getIndexOfControllingPlayer())->getCavalryCards() + players->at(tempIndexOfDef)->getCavalryCards()); players->at(sourceAttacking->getIndexOfControllingPlayer())->setInfantryCards(players->at(sourceAttacking->getIndexOfControllingPlayer())->getInfantryCards() + players->at(tempIndexOfDef)->getInfantryCards()); players->at(tempIndexOfDef)->setArtilleryCards(0); players->at(tempIndexOfDef)->setCavalryCards(0); players->at(tempIndexOfDef)->setInfantryCards(0); } return true; } }