I am trying to make a text version of risk, and I need to store the population, or army count, for each country. So the only way I could think to do that, as you'll see in my code, is by making a variable for each country, and then storing those variables in an array for easy access by functions and so forth. I was wondering if there was a simpler way, not necessarily easier to understand, by required less typing. The section of code I'm talking about is the massive block of 20 unsigned int's just above the array that holds those variables...
/****************************
* ISU program (text risk) *
* created by Matthew *
* in grade 12 programming. *
****************************/
/*****************************************
Things to finish
attackFunction()
fortifyFunction()
AI?
*****************************************/
#include <iostream>
#include <list>
#include <iterator>
#include <vector>
#include <algorithm>
using namespace std;
class humanPlayer
{
public:
humanPlayer(string thePlayersName, unsigned int thePlayersTurnNum);
~humanPlayer(){};
void addToList(unsigned int countryToAdd) {countriesOwned.push_back(countryToAdd);}
void showList();
int getSpecificListEntry(unsigned int memberSpot);
int listSize() {return countriesOwned.size();}
void removeFromList(unsigned int countryToRemove) {countriesOwned.remove(countryToRemove);}
bool checkIfInList(unsigned int countryToCheck);
string getPlayerName() {return playerName;}
string getPlayerInitial() {return playerInitial;}
int getPlayerTurnNum() {return playerTurnNum;}
void setPlayerTurnNum(unsigned int newPlayerTurnNum);
private:
list<int> countriesOwned;
string playerName;
string playerInitial;
unsigned int playerTurnNum;
};
humanPlayer::humanPlayer(string thePlayersName, unsigned int thePlayersTurnNum)
{
playerName = thePlayersName;
playerTurnNum = thePlayersTurnNum;
playerInitial = thePlayersName[0];
}
bool humanPlayer::checkIfInList(unsigned int countryToCheck)
{
if(find(countriesOwned.begin(), countriesOwned.end(), countryToCheck) != countriesOwned.end())
{
return true;
}
else
{
return false;
}
}
void humanPlayer::showList()
{
copy(countriesOwned.begin(),countriesOwned.end(),ostream_iterator<int>(cout,", "));
cout << endl;
}
void humanPlayer::setPlayerTurnNum(unsigned int newPlayerTurnNum)
{
playerTurnNum = newPlayerTurnNum;
}
int humanPlayer::getSpecificListEntry(unsigned int memberSpot)
{
list<int>::iterator iter;
iter = countriesOwned.begin();
(*iter) += memberSpot;
return (*iter);
}
int getName(), attackFunction(humanPlayer &), fortifyFunction(humanPlayer &);
void countryDivider(), renderBoard(), mainTurn(), worldAffairsFunction();
unsigned int numOfPlayers;
list<humanPlayer> jailHouse;
vector<int> virginCountries;
string playerInitialList[20] = " ";
unsigned int country00 = 0;
unsigned int country01 = 0;
unsigned int country02 = 0;
unsigned int country03 = 0;
unsigned int country04 = 0;
unsigned int country05 = 0;
unsigned int country06 = 0;
unsigned int country07 = 0;
unsigned int country08 = 0;
unsigned int country09 = 0;
unsigned int country10 = 0;
unsigned int country11 = 0;
unsigned int country12 = 0;
unsigned int country13 = 0;
unsigned int country14 = 0;
unsigned int country15 = 0;
unsigned int country16 = 0;
unsigned int country17 = 0;
unsigned int country18 = 0;
unsigned int country19 = 0;
int countryPopulationArray[20] = { country00, country01, country02, country03,
country04, country05, country06, country07,
country08, country09, country10, country11,
country12, country13, country14, country15,
country16, country17, country18, country19 };
int main()
{
cout << "Welcome to text risk, the rules are the same as the board game, minus risk cards, and an altered "
<< "fortification rule set. First off ";
getName();
cout << endl << "The countries are now going to be randomly divided between the "
<< numOfPlayers << " of you:" << endl;
countryDivider();
renderBoard();
mainTurn();
cout << "\n"; system("PAUSE");
}
void mainTurn()
{
list<humanPlayer>::iterator iter;
int initialTurnChoice = 0;
while(true)
{
for(iter = jailHouse.begin(); iter != jailHouse.end(); ++iter)
{
bool turn = true;
while(turn == true)
{
cout << endl << "Do you, " << (*iter).getPlayerName() << ", wish to: " << endl
<< "(1) Attack someone." << endl
<< "(2) Fortify somewhere." << endl
<< "(3) Don't do anything to anyone." << endl
<< "(4) Display current world affairs." << endl;
cin >> initialTurnChoice;
switch(initialTurnChoice)
{
case 1: attackFunction(*iter);
break;
case 2: fortifyFunction(*iter);
break;
case 3: turn = false;
break;
case 4: worldAffairsFunction();
break;
}
}
}
}
}
int getName()
{
cout << "how many players will there be? ";
cin >> numOfPlayers;
cout << endl;
for(unsigned int i=0 ; i<numOfPlayers ; i++)
{
char name[256];
cin.ignore(255,'\n');
cout << "What is player " << (i+1) << "'s name? ";
cin.get(name,256);
jailHouse.push_back(humanPlayer(name,(i+1)));
}
}
void countryDivider()
{
list<humanPlayer>::iterator iter;
unsigned int counter = 0;
for(unsigned int i=0 ; i<20 ; i++)
{
virginCountries.push_back(i);
}
random_shuffle(virginCountries.begin(), virginCountries.end());
while(counter != 20)
{
for(iter = jailHouse.begin(); iter != jailHouse.end(); ++iter)
{
(*iter).addToList(virginCountries.at(0));
playerInitialList[virginCountries.at(0)] = (*iter).getPlayerInitial();
virginCountries.erase(virginCountries.begin());
counter += 1;
if(counter == 20)
{
break;
}
}
}
//test
for(iter = jailHouse.begin(); iter != jailHouse.end(); ++iter)
{
cout << (*iter).getPlayerName() << ": ";
(*iter).showList();
}
}
void renderBoard()
{
cout << endl
<< " __ ____" << endl
<< " N.A. | \\ / ." << endl
<< " \\__| \\ 2 | ____" << endl
<< " ____________ |" << playerInitialList[2] << " / __ Eu / | |" << endl
<< " / | 1 | \\ \\| /13\\ ___/ | |" << endl
<< "/ 0 |__" << playerInitialList[1] << "__|_/ |\\ ." << playerInitialList[13] << "_// 14 / |" << endl
<< "| " << playerInitialList[0] << " | 3 | 4|__|5\\ / " << playerInitialList[14] << " / |" << endl
<< " \\/ \\|__" << playerInitialList[3] << "_|_" << playerInitialList[4] << "__|_" << playerInitialList[5] << "_\\ __ |_/|_/| 19 /" << endl
<< " / | 6 | 7 / /15\\ __/ | " << playerInitialList[19] << " /" << endl
<< " |__" << playerInitialList[6] << "__|_" << playerInitialList[7] << "_/ ." << playerInitialList[15] << "_/ | 16 | /" << endl
<< " \\ 8 | / _" << playerInitialList[16] << " | |" << endl
<< " \\ " << playerInitialList[8] << " \\ /\\ / \\/\\ |" << endl
<< " \\ \\ /17|18/ ||" << endl
<< " _\\_ |" << playerInitialList[17] << "_/ ." << playerInitialList[18] << " \\|" << endl
<< " S.A._/ 9 \\__" << endl
<< " /___" << playerInitialList[9] << "____|" << endl
<< " | | /" << endl
<< " \\ 10|11/" << endl
<< " |" << playerInitialList[10] << " |" << playerInitialList[11] << "/" << endl
<< " |__|/" << endl
<< " |12/" << endl
<< " |" << playerInitialList[12] << "/" << endl
<< " |/" << endl;
}
int attackFunction(humanPlayer & obj)
{
cout << endl << obj.getPlayerName() << ", which country do you wish to attack from? ";
}
int fortifyFunction(humanPlayer & obj)
{
}
void worldAffairsFunction()
{
list<humanPlayer>::iterator iter;
cout << endl << "This is the current state of the game, player by player: \n";
renderBoard();
for(iter = jailHouse.begin(); iter != jailHouse.end(); ++iter)
{
cout << (*iter).getPlayerName() << " has " << (*iter).listSize() << " countries in their possesion."
<< "\nAnd those countries are as follows: ";
(*iter).showList();
}
}