Я пытаюсь позволить пользователю ввести что-то вроде «w2» или «w5» и переместить столько пробелов в направлении вверх в лабиринте. В настоящее время проблема заключается в том, что всякий раз, когда консоль видит, что введен символ «w», он перемещается на один пробел вверх, независимо от того, что следует за ним. Он также скажет «Недопустимый ход», как вы увидите, это случай по умолчанию.
Я думаю, что это было бы довольно легко реализовать, но я просто делаю это неправильно. Я пытался просто сделать moved = floor->move_to_x_y (*this, -2, 0)
, но это не работает.
Вот функция, с которой я работаю:
void Player::move (Game & game)
{
char c;
Floor * floor;
bool moved = false;
floor = game.get_curr_floor();
do
{ cout << "Enter move: ";
cin >> c;
switch (c)
{
case 'w':
moved = floor->move_to_x_y (*this, -1, 0);
break;
case 'a':
moved = floor->move_to_x_y (*this, 0, -1);
break;
case 's':
moved = floor->move_to_x_y(*this, 1, 0);
break;
case 'd':
moved = floor->move_to_x_y(*this, 0, 1);
break;
case 'w2':
moved = floor->move_to_x_y (*this, -2, 0); //testing moving 2
case 'w3':
moved = floor->move_to_x_y (*this, -3, 0); //testing moving 3
default:
cout << "Not a valid move" << endl;
}
}
while (! moved);
}
Вот функция move_to_x_y:
bool Floor::move_to_x_y (Character & character, int x_adj, int y_adj)
{
char save_next;
int x, y;
x = character.get_x();
y = character.get_y();
if (! legal_move(x + x_adj, y + y_adj))
return false;
save_next = tiles[x+x_adj][y+y_adj];
tiles[x+x_adj][y+y_adj] = character.get_sym();
tiles[x][y] = ' ';
character.set_position (x+x_adj, y+y_adj);
cout << "Moved " << character.get_sym() << " to " << x+x_adj << "," << y+y_adj << endl;
return true;
}
Я ценю всю помощь! Спасибо!
2 ответа
Переключатель (с) { case 'w':
Одиночный ' означает, что запись состоит из одного символа. Следовательно, вы не можете использовать символ 'w2'. Таким образом, вы получаете только первый введенный вами символ. Введите значения в массив символов (c[]), используя c[0] в качестве направления и c[1] в качестве количества пробелов.
Кроме того, поскольку вы читаете символ, ваш cin получает только первый символ.
Ваша проблема в том, что вы получаете ввод как символ:
char c;
...
...
cin >> c;
...
...
Это позволяет хранить только один символ. Чтобы представить несколько символов, вам нужно либо изменить чат на std::string, что потребует нажатия клавиши ввода, либо вам или вам нужно запомнить предыдущее нажатие клавиши и обработать его при следующем нажатии клавиши... например : если последнее нажатие клавиши == 'd', а текущее нажатие клавиши = '2', то спуститесь на 2 шага вниз ... Оба на самом деле не идеальны. Каковы ваши фактические требования к пользовательскому интерфейсу? возможно, есть более простой/лучший метод взаимодействия с пользователем, который поможет решить проблему.
Судя по обратной связи, примерно следующее:
int main()
{
std::string cmd;
do
{
// Input a string
std::cin >> cmd;
// Number of moves to make
int moves = 1;
int xDir = 0;
int yDir = 0;
// Behavoir based on length of input is different
switch (cmd.size())
{
case 2:
// Number of moves present, override default moves
if (cmd[1] < '1' || cmd[1] > '5')
continue;
// Valid, update moves and fall thu to get direction
moves = cmd[1] - '0';
case 1:
// Deal with the direction
switch (cmd[0])
{
case 'a':
xDir = -1;
break;
case 'd':
xDir = 1;
break;
case 'w':
yDir = -1;
break;
case 's':
yDir = 1;
break;
default:
// Invalid input
continue;
}
// If we are here we have a valid move count and direction
std::cout << "xdir = " << xDir*moves << ", ydir = " << yDir*moves << std::endl;
}
}
while (cmd != "q");
}
Теперь мы вводим строку. Если длина строки составляет один символ, мы принимаем по умолчанию 1 шаг. Если это два символа, мы берем второй символ и принимаем его за количество шагов. Дополнительные сложности возникают только при проверке и обработке ошибок.
Похожие вопросы
Новые вопросы
c++
C++ — это язык программирования общего назначения. Изначально он разрабатывался как расширение C и имел аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде, который будет скомпилирован с помощью компилятора C++. Используйте тег версии для вопросов, связанных с конкретной стандартной версией [C++11], [C++14], [C++17], [C++20] или [C++23]. и т.д.