Теперь Кью работает в режиме чтения

Мы сохранили весь контент, но добавить что-то новое уже нельзя

Как избавиться от большого количества “if else...” или “switch case” в c++?

Недавно начал изучать c++, в процесс затянуло, на второй день решил сделать крестики нолики, но всё таки подумал что рановато, тк возникли некоторые сложности:
  1. Главная проблема — очень много писать условных операторов. Допустим каждой клетке я придал значение, пример — самая верхняя левая клетка будет 11, по мере смещение вправо будет рости 2е число (макс 3), а вниз соответственно 1е (опять же макс 3). Так вот, и в этой ситуации мне нужно прописывать все 9 ситуаций (тк 9 клеток)?
  2. Каждый раз создаётся новое игровое поле, не знаю может есть «операторы замены» какие нибудь.
  3. Ну и если есть возможность дать код от игры «крестики нолики», поделитесь пожалуйста.)))
Программы делаю с помощью консольного приложения!
ЗАРАНЕЕ СПАСИБО!
ПрограммированиеC+++2
Егор Волков
  ·   · 1,4 K
Студент, погромист, сейчас изучаю низкоуровневое п...  · 20 июл 2022
Главная проблема — очень много писать условных операторов. Допустим каждой клетке я придал значение, пример — самая верхняя левая клетка будет 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;
}
Инженер путей сообщения – строитель  · 18 июл 2022
switch и существует для замены большого количества if else. На входе в оператор сразу определяется точка, куда передаётся управления, тогда как в If else происходит последовательный перебор всех значений. Что же касается... Читать далее