/*
Made in code::blocks 12.11
-randomly generated terrain mirrored to be equal for bought players
-
-
*/
#include <iostream>
#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <fstream>
#include <cstring>
#include <string>
#include <cstdlib>
#include <ctime>
#include <sstream>
#include <cctype>
using namespace std;

//Public functions
char printMap(char terraniValue);
int spawnUnit(int positionOfPiece, int unitType);
int createBoard(int xLenght, int yLenght);
string OutputCharacterWithColor(string character);
void black();
void red();
void green();
void blue();
void white();



//Pubic variables
int Gold = 300;
int rowLength, columnLenght;
string board;


int main()
{
    createBoard(10, 8);
    printf("1.Infantry(Defence=6, Attack=1)\n");
    printf("2.Sniper\n");
    printf("3.Artillery\n");
    printf("4.Tank\n");
    printf("5.General\n");
    printf("Enter pieces you want to buy or type \"end\" to finish buying pieces:\n");
    string unitSelection = "choosing";
    int unitType[99], positionOfPiece, nextPieceChoice = 0;
    for(int i=0; i<99; i++)
    {
        unitType[i] = 99;
    }
    while(unitSelection != "end")//Somewhere in this while loop is the problem!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    {
        cin >> unitSelection;
        if(unitSelection == "1" || unitSelection == "2" || unitSelection == "3" || unitSelection == "4" || unitSelection == "5")
        {
            stringstream convert;
            convert << unitSelection;//put string into stringstream
            convert >> unitType[nextPieceChoice];//give the value to integer unitType[nextPieceChoice] from stringstream
            nextPieceChoice++;
            convert.str("");
            convert.clear();
        }
    }
    positionOfPiece = (rowLength/2) - (nextPieceChoice/2);//nextPieceChoice gives number of pieces that was chosen
    int nextUnit = 0;
    while(unitType[nextUnit] != 99);
    {
        spawnUnit(positionOfPiece+nextUnit, unitType[nextUnit]);
        nextUnit++;
    }
    printf("Program not finished...\n");
    system("pause");
    return 0;
}
int spawnUnit(int positionOfPiece, int unitType)
{
    string boardWithPieces[rowLength*columnLenght];
    int counter = 1;
    switch(unitType)
    {
        case 1:
        {
            if(Gold >= 10)
            {
                for(int i=0; i<board.length()+1; i++)
                {
                    boardWithPieces[i] = board[i];
                }
                board.clear();
                boardWithPieces[positionOfPiece] = "@";//replace random piece with first unit type
                for(int i=0; i<=(rowLength*columnLenght); i++)//upper side of the board
                {
                    if((i == (rowLength*counter)) && i != (rowLength*columnLenght)-1)//if end of row and that row is not last
                    {
                        black();
                        printf("|\n");
                        counter++;
                    }
                    if(i != (rowLength*columnLenght))//not last position in last row after '|' sign
                    {
                        OutputCharacterWithColor(boardWithPieces[i]);
                        board += boardWithPieces[i];//assign boardWithPieces back to board progress
                    }
                }
                counter -= 1;
                for(int i=(rowLength*columnLenght); i>=0; i--)//lower side of the board(horizontally and vertically mirrored upper side)
                {
                    if((i == (rowLength*counter)-rowLength))//if end of row and that row is not first one
                    {
                        black();
                        printf("|\n");
                        counter--;
                    }
                    if(i != 0)//not last position in last row after '|' sign
                    {
                        OutputCharacterWithColor(boardWithPieces[i-1]);
                        board += boardWithPieces[i-1];//assign boardWithPieces back to board progress
                    }
                }
            }
            break;
        }
        case 2:
        {
            if(Gold >= 25)
            {

            }
            break;
        }
        case 3:
        {
            if(Gold >= 30)
            {

            }
            break;
        }
        case 4:
        {
            if(Gold >= 40)
            {

            }
            break;
        }
        case 5:
        {
            if(Gold >= 50)
            {

            }
            break;
        }
        case 99:
        {

            break;
        }
        default:
        {
            printf("Error:wrong unit type\n");
            system("pause");
            break;
        }
    }
    return 0;
}
int createBoard(int xLength, int yLenght)
{
    rowLength = xLength;
    columnLenght = yLenght;
    int randomNumber = 0;
    srand(time(0));
    for(int i=0; i<columnLenght; i++)
    {
        printf("%i%s", i, ".|");
        for(int j=0; j<rowLength; j++)
        {
            randomNumber = rand()%5+1;
            switch(randomNumber)
            {
                case 1:
                {
                    printMap('!');
                    break;
                }
                case 2:
                {
                    printMap('^');
                    break;
                }
                case 3:
                {
                    printMap('#');
                    break;
                }
                case 4:
                {
                    printMap('*');
                    break;
                }
                case 5:
                {
                    printMap(' ');
                    break;
                }
                default:
                {
                    printf("Error:terrain not found\n");
                    system("pause");
                }
            }
        }
        printf("|\n");
    }
    return 0;
}
char printMap(char terraniValue)
{
    board += terraniValue;
    printf("%c", terraniValue);
    return 0;
}
//start of colour related functions
string OutputCharacterWithColor(string character)
{
    if(character == "#")
    {
        white();
        cout << character;
        black();
    }
    if(character == "!")
    {
        red();
        cout << character;
        black();
    }
    else if(character == "@")
    {
        green();
        cout << character;
        black();
    }
    else if(character == "^")
    {
        blue();
        cout << character;
        black();
    }
    else
    {
        cout << character;
    }
    return "";
}
void white()
{
    HANDLE hConsole;
    hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute
    (hConsole, BACKGROUND_INTENSITY);
}
void black()
{
    HANDLE hConsole;
    hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute
    (hConsole, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN);
}
void red()
{
    HANDLE hConsole;
    hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute
    (hConsole, FOREGROUND_RED | FOREGROUND_INTENSITY);
}
void green()
{
    HANDLE hConsole;
    hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute
    (hConsole, FOREGROUND_GREEN | FOREGROUND_INTENSITY);
}
void blue()
{
    HANDLE hConsole;
    hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute
    (hConsole, FOREGROUND_BLUE | FOREGROUND_INTENSITY);
}
//end of colour related functions
111100/11000
Deleted Member

You have several compile errors ...

In line 81:

ISO C++ forbids variable length array 'boardWithPieces'

You could use a ...

vector < string > vecStr( size ); // calls constructor
// if you really need an 'array of strings'

You also have redundant and several C (not C++ type includes)

Edited 2 Years Ago by David W: added text

My compiler doesn't show any errors

You need to turn them on, on your compiler ... to see them.

#include <windows.h>

//#include <stdio.h> // C usage style
#include <cstdio>    // C++ usage style

//#include <string.h>
include <cstring>

#include <cstdlib>
#include <ctime>

//#include <ctype.h>
#include <cctype>


#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

using namespace std;

Edited 2 Years Ago by David W

That's a new feature of c++11 iso standards. Some compilers such as Visual Studio have not implemented it yet, while others such as g++ may need special flags.

For compiles that don't support that, just change line 81 to this:

string* boardWithPieces = new string[rowLength*columnLenght];

As for the freezing problem -- look at line 75 and see if you can figure out what's wrong with it (Note: very common error)

Edited 2 Years Ago by Ancient Dragon

Program doesn't reach line 75.After inputing '1' and 'end' as unitSelection it stops working but doesn't crash.

Program doesn't reach line 75.

That's because of the problem on line 70. Sorry, my previous post was incorrect, it should have said line 70 not line 75.

Edited 2 Years Ago by Ancient Dragon

Why is line 70 a problem?

See that semicolon at the end of line 70?
That's your problem!
Thanks to the semicolon, you've effectively set up an infinite loop at line 70.

Edited 2 Years Ago by JasonHippy

But nextUnit is incremented and eventually unitType should be equal to '99' from line 53 at which time loop should be broken

removed semicolon and it works

This question has already been answered. Start a new discussion instead.