Ejemplo n.º 1
0
/*
 * 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);
    }
}
Ejemplo n.º 2
0
//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;
	}
}