Главная проблема — очень много писать условных операторов. Допустим каждой клетке я придал значение, пример — самая верхняя левая клетка будет 11, по мере смещение вправо будет рости 2е число (макс 3), а вниз соответственно 1е (опять же макс 3). Так вот, и в этой ситуации мне нужно прописывать все 9 ситуаций (тк 9 клеток)?
Не обязательно. Игровое поле можно поместить в двумерный массив, а к нужной клетке обращаться через индексы:
char field[3][3] = {
{' ', ' ', ' '},
{' ', ' ', ' '},
{' ', ' ', ' '}
}
field[0][0] = 'X'; // Поставить крестик в верхний левый угол
field[1][1] = '0'; // Поставить нолик в центр поля
field[2][0] = 'X'; // Поставить крестик в нижний левый угол
Каждый раз создаётся новое игровое поле, не знаю может есть «операторы замены» какие нибудь.
Если вы про вывод игрового поля на экран, то можно перед самим выводом экран очищать. Например, при помощи system("cls"); или system("clear");.
В качестве бонуса написал "Крестики-нолики" без единого оператора ветвления, не считая директив препроцессора. Здесь вместо операторов if/else и switch/case используется бинарная логика. Не идеал, но все же:
#include <iostream>
using namespace std;
struct STTT_statuses_bf {
signed nStatus : 2;
unsigned __unused;
};
char cellStatuses[] = {'X',' ','0'};
char possibleWinners[][5] = {"X\0\0\0","NONE","0\0\0\0"};
void printField(STTT_statuses_bf field[][3]) {
#ifdef __linux__
system("clear");
#elif _WIN32
system("cls");
#endif
for (auto i=0; i<3; i++) {
cout<<"|";
for (auto j=0; j<3; j++) {
cout<<cellStatuses[(char)field[i][j].nStatus+1];
cout<<"|";
}
cout<<"\n-------\n";
}
}
bool detectWinner(STTT_statuses_bf field[][3], short *winner) {
short wx, wy, wd1, wd2;
wd1 = wd2 = 0;
*winner = 0;
for (auto i=0; i<3; i++) {
wd1+=field[i][i].nStatus;
wd2+=field[i][2-i].nStatus;
wx=wy=0;
for (auto j=0; j<3; j++) {
wx+=field[i][j].nStatus;
wy+=field[j][i].nStatus;
}
*winner |= wx/3|wy/3;
}
wd1/=3;
wd2/=3;
*winner |= wd1|wd2;
return ((bool)*winner);
}
int main()
{
struct {
signed flagPl : 1;
unsigned __unused;
} gameParams;
STTT_statuses_bf field[3][3] = {
{0,0,0},
{0,0,0},
{0,0,0}
};
short winner = 0;
gameParams.flagPl = 1;
printField(field);
char counter = 0;
while (!detectWinner(field, &winner)&&counter<9) {
short opinion[2];
char curPlayer = gameParams.flagPl;
curPlayer<<=1;
curPlayer|=0b01;
cout << cellStatuses[!gameParams.flagPl<<1]
<< " opinion:\nx: ";
cin >> opinion[0];
cout << "y: ";
cin >> opinion[1];
STTT_statuses_bf *curCell =
&field[opinion[1]%3][opinion[0]%3];
char isNullCell =
~((curCell->nStatus^0b00)>>1|
(curCell->nStatus^0b00)|
(curCell->nStatus^0b00)<<1);
curCell->nStatus =
isNullCell&(curPlayer)|
curCell->nStatus&~isNullCell;
gameParams.flagPl = isNullCell^gameParams.flagPl;
counter+=(bool)(isNullCell&1);
printField(field);
}
cout << possibleWinners[winner+1]
<< " is winner!" << endl;
return 0;
}