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();
}
По сути, цитирую ответ с 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]();
На подробные пояснения пока что нет времени, если они понадобятся, пишите в комментарии. Если кратко, то после []()
в фигурных скобках все действия по тому слову, которое написано в кавычках перед этим.
Вы не можете использовать в операторе 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Не могу передать значение инпута datepciker, как это можно реализовать? https://cdnjscloudflare
Надо чтобы при клике на div с классом "next" ему присваивался класс "next_a", а "next" удалялсяИ соответственно при клике на "next_a" присваивался класс...
Подскажите, можно-ли как-то изменить цвет прогрессбара, если его значение становится меньше 20 (и изменить обратно, если больше), используя...