c++ if в switch с использованием string

93
09 июня 2021, 19:00

if string обработать может, а switch не может. но использовать if, как-то не красиво.

можно ли как-то упростить код можно ли как-то это исправить? код:

#include "pch.h" //
#include <iostream> //
#include <string> //
#include <ctime> //
#include <conio.h> //
using namespace std;
bool play = false;
string languages = "en";
int graphics = 1; 
enum dir:char
{ 
    _left = 'd', 
    _right = 'a', 
    _up = 'w',
    _down = 's'
};
int yPlayer = 8, xPlayer = 0; // player:cordinats
void Menu()
{
    system("cls");
    string menu;
    _menu:
    if (languages == "en")
    {
        cout << "Play" << endl;
        cout << "Setting" << endl;
        cout << "Exit" << endl;
        cin >> menu;
        if (menu == "play")
        {
            play = true;
        }
        else if (menu == "setting")
        {
            system("cls");
            cout << "languages: " << languages << endl;
            cout << "graphics: " << graphics << endl;
            cout << endl;
            cout << "keyboard: " << endl;
            cout << "left: " << _left << endl;
            cout << "right: " << _right << endl;
            cout << "up: " << _up << endl;
            cout << "down: " << _down << endl;
            cin >> menu;
            if (menu == "lang")
            {
                cout << "English: en" << endl;
                cout << "Russia: ru" << endl;
                cin >> menu;
                if (menu == "en")
                {
                    languages = "en";
                }
                else if (menu == "ru")
                {
                    languages = "ru";
                }
                goto _menu;
            }
            else if (menu == "graphics")
            {
                cout << "1" << endl;
                cout << "2" << endl;
                cout << "3" << endl;
                cin >> menu;
                if (menu == "1") graphics = 1;
                else if (menu == "2") graphics = 2;
                else if (menu == "3") graphics = 3;
                goto _menu;
            }
            else if (menu == "keyboard")
            {
                cout << "left: " << endl;
                cout << "right: " << endl;
                cout << "up: " << endl;
                cin >> menu;
                if (menu == "left")
                {
                    cout << "left" << endl;
                    //cin >> _left;
                }
                else if (menu == "right")
                {
                    cout << "right" << endl;
                    //cin >> _right;
                }
                else if (menu == "up")
                {
                    cout << "up" << endl;
                    //cin >> _up;
                }
                cout << "Временно не доступно" << endl;
                system("pause");
            }
            goto _menu;
        }
        else if (menu == "Exit")
        {
            return;
        }
        else
        {
            goto _menu;
        }
    }
    else if (languages == "ru")
    {
        setlocale(LC_ALL, "ru");
        cout << "Играть" << endl;
        cout << "Настройки" << endl;
        cout << "Выход" << endl;
        cin >> menu;
        if (menu == "play")
        {
            play = true;
        }
        else if (menu == "setting")
        {
            system("cls");
            cout << "Языки: " << languages << endl;
            cout << "Графика: " << graphics << endl;
            cout << endl;
            cout << "Клавиатура: " << endl;
            cout << "лево: " << _left << endl;
            cout << "право: " << _right << endl;
            cout << "вверх: " << _up << endl;
            cin >> menu;
            if (menu == "lang")
            {
                cout << "Англиский: en" << endl;
                cout << "Русский: ru" << endl;
                cin >> menu;
                if (menu == "en")
                {
                    languages = "en";
                }
                else if (menu == "ru")
                {
                    languages = "ru";
                }
                goto _menu;
            }
            else if (menu == "graphics")
            {
                cout << "1" << endl;
                cout << "2" << endl;
                cout << "3" << endl;
                cin >> menu;
                if (menu == "1") graphics = 1;
                else if (menu == "2") graphics = 2;
                else if (menu == "3") graphics = 3;
                goto _menu;
            }
            else if (menu == "keyboard")
            {
                cout << "лево: " << endl;
                cout << "право: " << endl;
                cout << "вверх: " << endl;
                cin >> menu;
                if (menu == "left")
                {
                    cout << "лево" << endl;
                    //cin >> _left;
                }
                else if (menu == "right")
                {
                    cout << "право" << endl;
                    //cin >> _right;
                }
                else if (menu == "up")
                {
                    cout << "вверх" << endl;
                    //cin >> _up;
                }
                cout << "Временно не доступно" << endl;
                system("pause");
            }
            goto _menu;
        }
        else if (menu == "exit")
        {
            return;
        }
        else
        {
            goto _menu;
        }
    }
}
void Game()
{
    system("cls");
    for (int y = -1; y <= 9; y++)
    {
        for (int x = 0; x <= 167; x++)
        {
            // y : x
            if (   y == 9 && x == x // 167 x 1
                || y == 7 && x == 5
                || y == 7 && x == 6
                || y == 7 && x == 7 // 1 x 5
                || y == 7 && x == 8
                || y == 7 && x == 9
                || y == 6 && x == 10 // 1 x 1
                || y == 7 && x == 11
                || y == 7 && x == 12
                || y == 7 && x == 13 // 1 x 5
                || y == 7 && x == 14
                || y == 7 && x == 15
                || y == 8 && x == 15 // 1 x 1
                || y == 8 && x == 25 // 2 x 1
                || y == 7 && x == 25
                ) 
            { 
                cout << "+"; // render world
                if (yPlayer == y && xPlayer == x)
                {
                    if (_kbhit()) // player:keyboard
                    {
                        switch (_getch())
                        {
                        case _left:
                            xPlayer -= 1;
                            break;
                        case _right:
                            xPlayer += 1;
                            break;
                        case _up:
                            yPlayer += 2;
                            break;
                        case _down:
                            yPlayer -= 2;
                            break;
                        }
                    }
                }
            }
            else if (yPlayer == y && xPlayer == x) { cout << "#"; } // render player
            else                                   { cout << " "; } // render world
            //cheak: y
            if (yPlayer < -2)       { yPlayer += 2; }
            else if (yPlayer > 9)   { yPlayer -= 2; }
            //cheak: x
            else if (xPlayer < 0)  { xPlayer += 1; }
            else if (xPlayer > 167) { xPlayer -= 1; }
        }
    }
    if (_kbhit()) // player:keyboard
    {
        switch (_getch())
        {
        case _left:
            xPlayer += 1;
            break;
        case _right:
            xPlayer -= 1;
            break;
        case _up:
            yPlayer -= 2;
            break;
        case _down:
            yPlayer += 2;
            break;
        }
    }
}
int main()
{
    Menu();
    while (play) Game();
}
Answer 1

По сути, цитирую ответ с cyberforum.ru:

std::map<std::string,std::function<void()>> dict{
        {"one",[](){std::cout<<"one";}},
        {"two",[](){std::cout<<"two";}},
        {"three",[](){std::cout<<"three";}}};
    std::string word;
    std::cin>>word;
    dict[word]();

На подробные пояснения пока что нет времени, если они понадобятся, пишите в комментарии. Если кратко, то после []() в фигурных скобках все действия по тому слову, которое написано в кавычках перед этим.

Answer 2

Вы не можете использовать в операторе switch condition-выражение, имеющее тип std::string, так как на данный тип налагаются некоторые ограничения, описанные в пункте 8.4.2.2 стандарта C++:

The condition shall be of integral type, enumeration type, or class type. If of class type, the condition is contextually implicitly converted to an integral or enumeration type. If the (possibly converted) type is subject to integral promotions, the condition is converted to the promoted type

READ ALSO
Как передать значение datepicker?

Как передать значение datepicker?

Не могу передать значение инпута datepciker, как это можно реализовать? https://cdnjscloudflare

116
Не работает jquery код

Не работает jquery код

Надо чтобы при клике на div с классом "next" ему присваивался класс "next_a", а "next" удалялсяИ соответственно при клике на "next_a" присваивался класс...

110
Динамические точки в строчке

Динамические точки в строчке

Есть вот такой макет:

132
Изменение значения прогрессбара в XAML с условный оператором

Изменение значения прогрессбара в XAML с условный оператором

Подскажите, можно-ли как-то изменить цвет прогрессбара, если его значение становится меньше 20 (и изменить обратно, если больше), используя...

109