http://FighterQueue.h//----------------------
#pragma once //gör så att h.filen bara kan inkluderas en gång
//Includes
#include <iostream>
#include <string>
#include "Fighter.h" //Eftersom FighterQueue har en fighterpekare måste vi inkludera Fighter.h
using namespace std;
//Klassen FighterQueue blir som en "paraplyklass" eller vad man vill kalla det. Den innehåller en pekare till den som är först i kön, men även appendfunktionen och lite annat.
//Andra saker som man kan tänka sig att man skulle vilja att denna klass höll reda på, även om jag inte gör det i detta exempel, kan t.ex. vara en pekare som pekar på sista fightern i kön eller hur många fighters som finns i kön.
class FighterQueue{
private:
Fighter* firstFighter; //Ska peka på den första Fightern i kön. (Ändras när en duell är avklarad)
public:
FighterQueue(){this->firstFighter = NULL;} //Konstruktor, sätter firstFighter till NULL.. dvs.. vi har inga fighters i kön till at börja med.
void printQueue(void); //Skriver ut hela kön på skärmen
void deleteQueue(void); //Tar bort alla Fighters i kön
void append(Fighter* newFighter); //Lägg till en ny Fighter längst bak i kön
void fight(void); //Låter de två främsta Fighters duellera varandra och slåss tills en eller båda har dött.
};
//deleteQueue()
//Tar bort alla Fighters i kön.
//Eftersom vi vill kunna ta bort enstaka objekt efter en duell, vill vi inte använda den rekursiva destruktorn som vi använt tidigare. En egen metod för at ta rensa upp listan innan avslut av programmet får användas.
void FighterQueue::deleteQueue(void){
cout << "\nDeleting Queue:"
//Kontrollera att listan inte är tom
if (this->firstFighter){
//Om det finns nåt i listan: Loopa igenom listan och ta bort det.
firstFighter->deleteQ(); //Notera här att jag lagt till en deleteQ metod i Fighter-klassen
}else{
//Om det inte finns så är vi längst bak i listan.
cout << "\nQueue is empty.";
}//if
}
//append()
//Lägger till en ny Fighter längst bak i kön
void FighterQueue::append(Fighter* newFighter){
//Kontrollera ifall det finns nåt i listan eller om den är tom
if (firstFighter == NULL){
//Om listan är tom: Låt den nya, medskickade, fightern bli den första i listan.
firstFighter = newFighter;
}else{
//Annars(dvs. om listan redan innehåller något):
Fighter* marker = firstFighter; //Skapa en markör(en pekare som kan "markera" objekt i minnet)
//Loopa igenom listan
while(marker->getNext()){
marker = marker->getNext();
}
//När marker är längst bak i listan lägger vi den nya, medskickade, Fightern efter marker i kön.
marker->setNext(newFighter);
}//if
}
//printQueue()
//Skriver ut hela kön på skärmen
void FighterQueue::printQueue(void){
//Kontrollera ifall det finns nåt i listan eller om den är tom
if (firstFighter == NULL){
//Om listan är tom: tala om för användaren att så är läget.
cout << "\nNo Fighters in queue.\n";
}else{
//Annars(dvs. om listan redan innehåller något): Loopa igenom listan och skriv ut alla Fighters.
cout << "\nQueue of Fighters:\n";
int i = 1;//en liten variabel håller koll på hur många loopar som görs
//Loopa igenom listan, den här gången med en for-loop (gämför med en while-loop)
for(Fighter* marker = firstFighter ; marker != NULL ; marker = marker->getNext()){
//skriv ut den markerade Fightern
cout << "\nNr " << i << ":\n";
marker->print();
cout << endl;
i++;//öka på variabeln som håller koll på hur många loopar som görs.
}//for
}//if
}
//fight()
//Låter de två främsta Fighters duellera varandra och slåss tills en eller båda har dött.
void FighterQueue::fight(void){
//Kontrollera ifall det finns nåt i listan
if (firstFighter == NULL){
//Om listan är tom: Skriv ut felmeddelande
cout << "\nNo Fighters in queue.\n";
}else if (firstFighter->getNext() == NULL){
//Om listan bara innehåller EN Fighter: Skriv ut felmeddelande
cout << "\nNot enough Fighters in the queue. There needs to be two of them you know.\n";
}else{
//Om listan inte är tom:
//Här har jag koperat in den gammla fight-loopen från Fight-bot-uppgiften och gjort om den lite :)
//Skapa två Fighterpekare och ställ in dem på att peka på de två första Fighters i listan.
Fighter* bot1 = firstFighter;
Fighter* bot2 = firstFighter->getNext();
//Fight-loop
bool fight=1;
while(fight){
//Skriv ut bottarnas hp-värden
cout << bot1->getName() << endl << "HP: " << bot1->getHp() << "\n\n";
cout << bot2->getName() << endl << "HP: " << bot2->getHp() << "\n\n";
Sleep(1000); //Stanna upp programmet i 1 sekund
//Låt bottarna attakera varandra.
bot1->attack(bot2);
Sleep(500);
bot2->attack(bot1);
Sleep(1000);
cout << endl;
//Kontrollera ifall BÅDA har dött.
if (bot1->getHp() < 0 && bot2->getHp() < 0){
//I så fall: Nollställ hp-värdena..
bot1->death();
bot2->death();
//.. skriv ut bottarnas hp...
cout << bot1->getName() << endl << "HP: " << bot1->getHp() << "\n\n";
cout << bot2->getName() << endl << "HP: " << bot2->getHp() << "\n\n";
Sleep(4000);
//.. och rapportera resultat.
cout << "\n\nBoth fighters are dead.";
Sleep(2000);
firstFighter = bot2->getNext(); //Ställ om firtsFighter så att den pekar på rätt Fighter i listan. Den som stod efter bot2 ska nu bli först i kön.
//Ta bort båda Fighterena.
delete bot1;
delete bot2;
//Stäng till sist av loopen.
fight=0;
//Om inte båda har dött, kanske bara en av dem har dött.
//Har bot1 dött?
}else if (bot1->getHp() < 0){
bot1->death();
cout << bot1->getName() << endl << "HP: " << bot1->getHp() << "\n\n";
cout << bot2->getName() << endl << "HP: " << bot2->getHp() << "\n\n";
Sleep(2000);
cout << "\n\n" << bot1->getName() << " is dead. " << bot2->getName() << " wins the fight and is put in the back of the queue.\n";
//Ställ om firtsFighter så att den pekar på rätt Fighter i listan. Den som stod efter bot2 ska nu bli först i kön.
firstFighter = bot2->getNext();
//Ta bort bot1 som dog
delete bot1;
//Lägg bot2 längts bak i litsan igen.
bot2->setNext(NULL); //Glöm inte att den nu ska ha sin next satt till NULL. Den ska ju vara längst bak.
this->append(bot2);
Sleep(2000);
fight=0;
//Har bot2 dött?
}else if (bot2->getHp() < 0){
bot2->death();
cout << bot1->getName() << endl << "HP: " << bot1->getHp() << "\n\n";
cout << bot2->getName() << endl << "HP: " << bot2->getHp() << "\n\n";
Sleep(4000);
cout << "\n\n" << bot2->getName() << " is dead. " << bot1->getName() << " wins the fight and is put in the back of the queue.\n";
firstFighter = bot2->getNext();
delete bot2;
bot1->setNext(NULL);
this->append(bot1);
Sleep(2000);
fight=0;
}//if
}//while
}//if
}