Крестики-нолики на 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;
}
}
}
}