#include <iostream>
#include <vector>
#include <algorithm>
#include <stdio.h>
#include <math.h>
using namespace std;

class MapFrames{
public:
	char frame[11];
	vector<short> cols;
	vector<short> rows;
	MapFrames (short a, short b);
};

MapFrames::MapFrames (short a, short b){
	// Construct a vector "rows" of a certain user defined size
	rows.resize(a);
	// Construct a vector "cols" of a certain user defined size
	cols.resize(b);
	//Construct Frames
	frame[0]=201; // Top LC
	frame[1]=205; // Horizontal
	frame[2]=187; // Top RC
	frame[3]=186; // Vertical
	frame[4]=200; // Bottom LC
	frame[5]=188; // Bottom RC

	//Construct Icons
	frame[6]=219;  // ICON: Hidden Locations 
	frame[7]=177;  // ICON: Spy Location: Nothing Found
	frame[8]=2;    // ICON: Spy Location: City Found
	frame[9]=127;  // ICON: Miss
	frame[10]=15;  // ICON: Destroyed City
}

class Cities : public MapFrames{
public:
	//Cords Holds map data. 0 = Unknown, 1 = City Location, 2 = Hit, 3 = Miss, 4 = Spy: Hit Nothing, 5 = Spy: Hit City
	vector<short>P1cords;
	vector<short>P2cords;
	Cities (short a, short b);
};

Cities::Cities (short a, short b) : MapFrames (a,b){
//Player 1 (LEFT)
	//Resize Vector to number of elements in map
	P1cords.resize(a*b);
	//set 1st 33% of elements (rounded up) to 1.
	for (int i=0; i<ceil((33/100.f)*(a*b)); i++){
		P1cords[i] = 1;
	}
	//Shuffle cords for random city locations.
	random_shuffle ( P1cords.begin(), P1cords.end() );

//Player 2 (RIGHT)
	//Resize Vector to number of elements in map
	P2cords.resize(a*b);
	//set 1st 33% of elements (rounded up) to 1.
	for (int i=0; i<ceil((33/100.f)*(a*b)); i++){
		P2cords[i] = 1;
	}
	//Shuffle cords for random city locations.
	random_shuffle ( P2cords.begin(), P2cords.end() );
}

class PrintFuncs : public Cities{
public:
	PrintFuncs(short a, short b);
	void PrintTop();
	void PrintMid();
	void PrintBot();
	void PrintCords();
	void PrintGrid();
};
PrintFuncs::PrintFuncs(short a, short b) : Cities (a,b){
}
void PrintFuncs::PrintTop(){
	cout<<frame[0]<<frame[1]<<frame[1]<<frame[1]<<frame[2];
}
void PrintFuncs::PrintMid(){
	cout<<frame[3]<<" "<<frame[6]<<" "<<frame[3];
}
void PrintFuncs::PrintBot(){
	cout<<frame[4]<<frame[1]<<frame[1]<<frame[1]<<frame[5];
}
void PrintFuncs::PrintCords(){
	cout<<"    ";
	for (int i=0; i<cols.size(); ++i){
		cout<<"  "<<i<<"  ";
	}
	cout<<"   ";
	for (int i=0; i<cols.size(); ++i){
		if (i+cols.size()<10){
			cout<<"  "<<i+cols.size()<<"  ";}
		if (i+cols.size()>9){
			cout<<"  "<<i+cols.size()<<" ";}
	}
	cout<<"\n";
}

void PrintFuncs::PrintGrid(){
	for (int j=0; j<rows.size(); ++j){
		//Print TopRow	
		cout<<"    ";
		for (int i=0; i<cols.size(); ++i){
			PrintTop();
		}
		cout<<"   ";
		for (int i=0; i<cols.size(); ++i){
			PrintTop();
		}
		cout<<"\n";
		//Print Middle Row
		cout<<"  "<<j<<" ";
		for (int i=0; i<cols.size(); ++i){
			PrintMid();
		}
		cout<<"   ";
		for (int i=0; i<cols.size(); ++i){
			PrintMid();
		}
		cout<<"\n";
		//Print Bottom Row
		cout<<"    ";
		for (int i=0; i<cols.size(); ++i){
			PrintBot();
		}
		cout<<"   ";
		for (int i=0; i<cols.size(); ++i){
			PrintBot();
		}
		cout<<"\n";
	}
}

class GameBoard : PrintFuncs{
public:
	GameBoard (short a, short b);
	void display();
};
GameBoard::GameBoard(short a, short b) : PrintFuncs (a,b){}
void GameBoard::display(){
	PrintCords();
	PrintGrid();
}

int main (){

	short rows = 0;short cols = 0;
	cout<<"Enter a value for ROWS - between 2-6: ";cin>>rows;
	cout<<"Enter a value for COLS - between 2-7: ";cin>>cols;
	cout<<endl<<endl;

//	short rows = 5;short cols = 5;
	GameBoard map(rows, cols);
	map.display();

	// End	
	std::cout<<std::endl<<std::endl<<std::endl<<"Please Close Console Window"<<std::endl;
	std::cin.ignore('\n', 1024);
	return(0);
}