Крестики-нолики на c++

Пытаюсь сделать обработку ввода от пользователя, чтобы программа получала только цифры. Но немного застрял на реализации логики. Т.е. я хочу чтобы пользователь мог вводить только цифры, а если введёт не число, то его повторно попросят сделать ввод.

P.S. и если не затруднит, можете оценить качество моего кода?

const bool isWindows = true;

#include <iostream>
#include <string>
#include <cstdlib>
#include <cstdio>

#ifdef isWindows
#include <windows.h>
#else
#include <unistd.h>
#endif


using namespace std;
// переменные для игры
//длинна карты
const int length = 3;
//карта
char map[length][length] = {};
//чем заполнять карту
char mapSymbol = '#';
//иконки первого и второго игрока
char firstPlayerIcon = 'x';
char secondPlayerIcon = 'o';
int delay = 2;
int badPlace = 0;
int countEmptyCells = 0;
bool win = false;
char playerIcon;
int player = 1;
int rowInput, colInput;
int row, col;
bool checkIfWin;


void DrawBoard(){
    for(int i = 0; i < length; i++)
        {
         for(int j = 0; j < length; j++)
         {
            cout << map[i][j];
         }
         cout << endl;
        }
}
// Эта функция отрисовывать поле(для красоты)
void DrawPlaceForMenu(){
    for(int i = 0; i < length; i++)
    {
        for(int j = 0; j < length; j++)
            {
             map[i][j] = mapSymbol;
            }
    }
    
    DrawBoard();
}
///////////////////


//Я надеюсь вы ещё не повесились.
//Эта функция отслеживает в каких яцейках находится "х" и "о"
bool WinState(int player){
    if(player == 1){
        playerIcon = firstPlayerIcon;
    }
    else{
        playerIcon = secondPlayerIcon;
    }
    //Здесь происходит очень важная проверка, но как она работает долго рассказывать.
     if ((map[0][0] == playerIcon && map[0][1] == playerIcon && map[0][2] == playerIcon)
    || (map[1][0] == playerIcon && map[1][1] == playerIcon && map[1][2] == playerIcon)
    || (map[2][0] == playerIcon && map[2][1] == playerIcon && map[2][2] == playerIcon)
    || (map[0][0] == playerIcon && map[1][0] == playerIcon && map[2][0] == playerIcon)
    || (map[0][1] == playerIcon && map[1][1] == playerIcon && map[2][1] == playerIcon)
    || (map[0][2] == playerIcon && map[1][2] == playerIcon && map[2][2] == playerIcon)
    || (map[0][0] == playerIcon && map[1][1] == playerIcon && map[2][2] == playerIcon)
    || (map[0][2] == playerIcon && map[1][1] == playerIcon && map[2][0] == playerIcon)) {
    cout << "\033[31m";
    cout << "Игрок номер " << player << " закончил партию быстрее!" << endl;
    cout << "Победа игрока номер " << player << endl;
    cout << "\033[0m";
    return true;
}

return false;

}

// Эта функция уже отрисовывает игровое поле
void DrawPlace(int player,char playerIcon, int row, int col){
    // Если row, col, которые указал пользователь равны mapSymbol, то игрок может может поставить туда x или o.
    if (map[row][col] == mapSymbol){
        map[row][col] = playerIcon;
    }else{ // иначе ход не засчитывается и активному пользователю нужно сделать ход.
        if (player == 1){
            badPlace = 1;
        }else{
            badPlace = 2;
        }
        //Окрашиваем текст "Клетка занята"
        printf("\033[31mКлетка занята!\n");
        sleep(delay);
        printf("\033[0m");
}
    // считаем сколько mapSymbol осталось. Это нужно для отслеживания ничьей
    countEmptyCells++;
    //обновляем карту
    #ifdef isWindows
        system("cls");
    #else
        system("clear");
    #endif
    DrawBoard();
}

int main(int argc, char *argv[])
{
    //отрисовываем карту
    for(int i = 0; i < length; i++)
    {
        for(int j = 0; j < length; j++)
            {
             map[i][j] = mapSymbol;
            }
    }
    DrawPlaceForMenu();
    while(true){
        printf("Игрок #%i",player);
        cout << endl;
        cout << "Введите номер строки: ";
        cin >> rowInput;
        cout << "Введите номер столбца: ";
        cin >> colInput;
        if(!cin){
            //что тут надо сделать?
            break;
        }else{
            row = rowInput;
            col = colInput;
        }
    
    // Проверяем, что клетка не заполнена
    if (map[row][col] != mapSymbol){
        cout << "Клетка уже заполнена. Попробуйте еще раз." << endl;
        continue;
    }
        badPlace = 0;
        if(player == 1){
            DrawPlace(player,firstPlayerIcon, row, col);
        }
        else if(player == 2){
            DrawPlace(player, secondPlayerIcon, row, col);
        }

        // Отслеживаем победил первый или второй игрок.
        checkIfWin = WinState(player);
        if (checkIfWin){
            break;
        }
        //Если на поле остался всего лишь один mapSymbol
        if(countEmptyCells == 8){
            //окрашиваем текст ничья
            printf("\033[31m");
            cout << "Ничья!" << endl;            
            printf("\033[0m");
            break;
        }
        // Здесь контролируем очерёдность ходов
        if(badPlace == 1){
            player = 1;
        }
        else if(badPlace == 2){
            player = 2;
        }else{
            if (player == 2){
                player = 1;
        }else{
            player = 2;
            }
        }
    }
}


Ответы (0 шт):