177 lines
4.3 KiB
C
177 lines
4.3 KiB
C
|
#include <iostream>
|
||
|
#include <string>
|
||
|
#include <sstream>
|
||
|
#include <cstdio>
|
||
|
#include "FighterInterface.h"
|
||
|
using namespace std;
|
||
|
|
||
|
/*
|
||
|
WARNING: It is expressly forbidden to modify any part of this document, including its name
|
||
|
*/
|
||
|
//=======================================================================================
|
||
|
FighterInterface* fight(FighterInterface*, FighterInterface*, bool);
|
||
|
void takeTurn(FighterInterface*, FighterInterface*, bool);
|
||
|
void speak(string);
|
||
|
//=======================================================================================
|
||
|
/*
|
||
|
fight(FighterInterface, FighterInterface, bool)
|
||
|
|
||
|
Runs through the fighting algorithm for the two given fighters.
|
||
|
|
||
|
Each fighter takes a turn using its special ability, attacking, and regenerating. If
|
||
|
the other fighter's current hit points falls to or drops below 0, then the other
|
||
|
fighter has lost. This process repeats until one fighter has fallen or 100 rounds
|
||
|
have occurred with neither fighter falling.
|
||
|
|
||
|
If the given bool is true, this function will print a great deal of information
|
||
|
during the battle. This can be useful for testing.
|
||
|
|
||
|
Returns the winner of the fight; null if the fight ends in a draw.
|
||
|
*/
|
||
|
FighterInterface* fight(FighterInterface* c1, FighterInterface* c2, bool verbose)
|
||
|
{
|
||
|
if(verbose)
|
||
|
{
|
||
|
stringstream stream;
|
||
|
stream << "----------";
|
||
|
stream << c1->getName();
|
||
|
stream << " vs ";
|
||
|
stream << c2->getName();
|
||
|
stream << "----------";
|
||
|
speak(stream.str());
|
||
|
}
|
||
|
|
||
|
c1->reset();
|
||
|
c2->reset();
|
||
|
|
||
|
for(int i=0; i<100; i++)
|
||
|
{
|
||
|
//C1's turn
|
||
|
takeTurn(c1, c2, verbose);
|
||
|
if(c2->getCurrentHP() <= 0)
|
||
|
{
|
||
|
if(verbose)
|
||
|
{
|
||
|
stringstream stream;
|
||
|
stream << c1->getName();
|
||
|
stream << " wins! (";
|
||
|
stream << c1->getCurrentHP();
|
||
|
stream << "/";
|
||
|
stream << c1->getMaximumHP();
|
||
|
stream << " HP left)";
|
||
|
speak(stream.str());
|
||
|
}
|
||
|
return c1;
|
||
|
}
|
||
|
|
||
|
//C2's turn
|
||
|
takeTurn(c2, c1, verbose);
|
||
|
if(c1->getCurrentHP() <= 0)
|
||
|
{
|
||
|
if(verbose)
|
||
|
{
|
||
|
stringstream stream;
|
||
|
stream << c2->getName();
|
||
|
stream << " wins! (";
|
||
|
stream << c2->getCurrentHP();
|
||
|
stream << "/";
|
||
|
stream << c2->getMaximumHP();
|
||
|
stream << " HP left)";
|
||
|
speak(stream.str());
|
||
|
}
|
||
|
return c2;
|
||
|
}
|
||
|
}
|
||
|
if(verbose)
|
||
|
{
|
||
|
speak("After 100 rounds, neither fighter has fallen. It's a draw!");
|
||
|
}
|
||
|
return NULL;
|
||
|
}
|
||
|
//=======================================================================================
|
||
|
/*
|
||
|
takeTurn(FighterInterface*, FighterInterface*, bool)
|
||
|
|
||
|
Runs through a single turn for [attacker] attacking [defender]. Each turn consists of
|
||
|
[attacker] trying to use its special ability, attacking [defender], and regenerating.
|
||
|
*/
|
||
|
void takeTurn(FighterInterface* attacker, FighterInterface* defender, bool verbose)
|
||
|
{
|
||
|
//Header
|
||
|
if(verbose)
|
||
|
{
|
||
|
stringstream stream;
|
||
|
stream << "It's ";
|
||
|
stream << attacker->getName();
|
||
|
stream << "'s turn! (";
|
||
|
stream << attacker->getCurrentHP();
|
||
|
stream << "/";
|
||
|
stream << attacker->getMaximumHP();
|
||
|
stream << " HP).";
|
||
|
speak(stream.str());
|
||
|
}
|
||
|
|
||
|
//Use Ability
|
||
|
if(!attacker->isSimplified())
|
||
|
{
|
||
|
bool ability = attacker->useAbility();
|
||
|
if(ability && verbose)
|
||
|
{
|
||
|
stringstream stream;
|
||
|
stream << "\t";
|
||
|
stream << attacker->getName();
|
||
|
stream << " uses a special ability!";
|
||
|
speak(stream.str());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//Attack
|
||
|
int damage = attacker->getDamage();
|
||
|
int before_attack = defender->getCurrentHP();
|
||
|
defender->takeDamage(damage);
|
||
|
int after_attack = defender->getCurrentHP();
|
||
|
if(verbose)
|
||
|
{
|
||
|
stringstream stream;
|
||
|
stream << "\t";
|
||
|
stream << attacker->getName();
|
||
|
stream << " attacks with ";
|
||
|
stream << damage;
|
||
|
stream << " damage, and ";
|
||
|
stream << defender->getName();
|
||
|
stream << " takes ";
|
||
|
stream << (before_attack-after_attack);
|
||
|
stream << " damage.";
|
||
|
speak(stream.str());
|
||
|
}
|
||
|
|
||
|
//Regenerate
|
||
|
if(!attacker->isSimplified())
|
||
|
{
|
||
|
int before_regen = attacker->getCurrentHP();
|
||
|
attacker->regenerate();
|
||
|
int after_regen = attacker->getCurrentHP();
|
||
|
if(verbose)
|
||
|
{
|
||
|
stringstream stream;
|
||
|
stream << "\t";
|
||
|
stream << attacker->getName();
|
||
|
stream << " regenerates ";
|
||
|
stream << (after_regen-before_regen);
|
||
|
stream << " HP.";
|
||
|
speak(stream.str());
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//=======================================================================================
|
||
|
/*
|
||
|
speak(string)
|
||
|
|
||
|
Displays a given message.
|
||
|
*/
|
||
|
void speak(string message)
|
||
|
{
|
||
|
printf("%s\n", message.c_str());
|
||
|
}
|
||
|
//=======================================================================================
|