/// Geoff Hagopian - A shot at life.

#include "..\std_lib_facilities.h"
#include <windows.h>  ///for colors
#include <ctime>
const int bsize = 10;

//const unsigned char BLACK = 219;

void show_Board(vector<char> brd) {
    for(int i = 0; i < bsize*bsize; ++i) {
        if(brd[i]=='*')
            SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 3);
        else SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 4);
        cout << brd[i];
        if((i+1)%bsize==0) cout << endl;
    }
}

void setup_Board(vector<char>& brd) {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 2);
    int row, col, choice, sparsity;
    cout << "\nWould you like a"
         << "\n0. Random board?"
         << "\n1. Manual entry?"
         << "\n2. R Pentomino?"
         << "\n3. Latin Cross?"
         << "\n4. Swastika?"
         << "\n5. Letter H?"
         << "\n6. Beacon?"
         << "\n7. Clock?"
         << "\n8. Toad?"
         << "\n9. Pinwheel?";
    cin >> choice;
    switch(choice) {
    case(0) :
        cout << "\nWhat percentage sparsity would you like? (100=all live, 0=all dead): ";
        cin >> sparsity;
		for(int i = 0; i < bsize*bsize; ++i) {
			if(rand()%100<sparsity) brd[i]='*';
			else brd[i]='0';
		}
		break;
	case(1) :
		///manual entry
		break;
    case(2) :  /// R Pentomino
        unsigned middle = bsize*bsize/2+bsize/2;
        brd[middle] = '*';
        brd[middle-bsize] = '*';
        brd[middle-bsize+1] = '*';
        brd[middle+bsize] = '*';
        brd[middle-1] = '*';
        break;
	///more cases
	//default :
		//break;
    }
}

int neighbors(vector<char> brd, int pos) {
    int cntr = 0;
    /// check corners first
    if(pos==0) {  ///upper left corner
        if(brd[pos+1]=='*') ++cntr; ///look right
        if(brd[pos+bsize]=='*') ++cntr; ///look down
        if(brd[pos+bsize+1]=='*') ++cntr;
    }
    else if(pos==bsize-1) {  ///upper right corner
        if(brd[pos-1]=='*') ++cntr; ///look left
        if(brd[pos+bsize]=='*') ++cntr; ///look down
        if(brd[pos+bsize-1]=='*') ++cntr; ///down and left
    }
    else if(pos==bsize*(bsize-1)) {  ///lower left corner
        if(brd[pos+1]=='*') ++cntr; ///look right
        if(brd[pos+bsize]=='*') ++cntr; ///look up
        if(brd[pos+bsize+1]=='*') ++cntr;
    }
    /// look at lower right
    /// look at edges
    /// count below
    return count;
}

void evolve_Board(vector<char> brd0, vector<char>& brd1) {
    //for each element of the brd0 decide if it should survive, die or be born
    //and record the result in brd1
    /*for(int i = 0; i < bsize*bsize; ++i) {
        cout << neighbors(brd0,i);
        if(i%bsize==0) cout << endl;
    }
    cout << endl;
    cin.clear();
    cin.get();*/
    /// use brd0 to update brd1;
}

int main() {
    srand(unsigned(time(0)));
    vector<char> board0(bsize*bsize,'0'), board1(bsize*bsize,'0'); //the 80 by 80 array for life

    while(1) {
        setup_Board(board0);
        system("cls");  ///In general, avoid system calls
        show_Board(board0);
        //evolve_Board(board0,board1);
        cin.clear();
        cin.get();
        //system("cls");
        //show_Board(board1);
        //evolve_Board(board1,board0);
        //cin.get();
    }
}

