/**
* Main file for Paardenrace program
*
* @author Nami Shah
* @date 2012/01/23
*/
#include <iostream>
#include <limits>
#include "Horse.h"
#include "Player.h"
#include <list>
#include <sstream>
using std::cout;
using std::endl;
using std::cin;
namespace derby{
list<Player> players; // een lijst van alle spelers
void initialize(constint& nPlayers, constint& nHorses); // initialiseert het spel met n players en n horses
void printField(); // drukt het veld af
void race(); // start de race
void reset(); // zet de paarden naar de startpositie
void derby(); // speelt de derby
}
void derby::initialize(constint& nPlayers, constint& nHorses) {
for (int p = 0; p < nPlayers; p++) {
stringstream ss;
ss << p + 1;
string name = ss.str();
Player player(name);
derby::players.push_back(player); // Maak een lijst van de spelers
}
list<Player>::iterator it = derby::players.begin();
int index = 0;
for (int h = 0; h < nHorses; h++) {
stringstream ss;
ss << h + 1;
string name = ss.str();
Horse horse(name);
it->addHorse(horse); // voegt een paard toe aan de speler
if (index == derby::players.size() - 1) {
it = derby::players.begin();
index = 0;
continue;
}
it++;
index++;
}
}
void derby::printField() {
cout << "==================================================" << endl;
list<Player>::iterator it = derby::players.begin();
while (it != derby::players.end()) {
it->printP();
it++;
}
cout << "==================================================" << endl;
}
void derby::race() {
list<Player>::iterator it = derby::players.begin();
while (it != derby::players.end()) {
it->forwardP();
it++;
}
derby::printField();
it = derby::players.begin();
int countHorses = 0;
while (it != derby::players.end()) {
countHorses += it->count() - it->countFinished();
it++;
}
if (countHorses > 1) {
return derby::race(); // blijf racen totdat er 1 paard overblijft
}
switch (countHorses) {
case 0:
return derby::race(); // bij een gelijkspel spelen we overnieuw
case 1:
it = derby::players.begin();
while (it != derby::players.end()) {
int c = it->count() - it->countFinished();
if (c == 1) {
break;
}
it++;
}
cout << "Paard " << it->isLast().getNameH() << " valt af." << endl;
it->removeHorse(it->isLast()); // verwijdert zijn traagste paard
if (it->count() == 0) {
cout << it->getNameP() << " heeft geen paarden meer en valt dus weg." << endl;
derby::players.erase(it); // verwijder de speler als hij geen paarden meer heeft
}
}
}
void derby::reset() {
list<Player>::iterator it = derby::players.begin();
while (it != derby::players.end()) {
it->resetP();
it++;
}
}
void derby::derby() {
while (derby::players.size() > 1) {
derby::printField(); // laat eerst de beginstatus van het veld zien
derby::race(); // blijf racen totdat er 1 speler overblijft
derby::reset();
}
cout << "De winnaar is: " << derby::players.begin()->getNameP() << "!" << endl;
}
int main(int argc, char* argv[])
{
int numberOfPlayers, numberOfHorses;
bool validInput = false;
while(!validInput) {
// Read the number of players and horses
cout << "Sir, how many horse owners are there?" << endl;
cin >> numberOfPlayers;
cout << "Sir, how many horses do you want?" << endl;
cin >> numberOfHorses;
if((numberOfPlayers > 0) && (numberOfHorses >= numberOfPlayers)) {
// Everything OK, continue with game
validInput = true;
}
else {
// Invalid input
cout << "Excuse me, Sir. I believe what you said is impossible." << endl;
}
}
cout << "Thank you for your help, Sir!" << endl;
// Start the game
derby::initialize(numberOfPlayers, numberOfHorses);
derby::derby();
}