adding cs142 code
This commit is contained in:
@@ -0,0 +1,176 @@
|
||||
#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());
|
||||
}
|
||||
//=======================================================================================
|
||||
Reference in New Issue
Block a user