Я пытаюсь позволить пользователю ввести что-то вроде «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;
}

Я ценю всю помощь! Спасибо!

-3
aishere 11 Мар 2015 в 01:09

2 ответа

Переключатель (с) { case 'w':

Одиночный ' означает, что запись состоит из одного символа. Следовательно, вы не можете использовать символ 'w2'. Таким образом, вы получаете только первый введенный вами символ. Введите значения в массив символов (c[]), используя c[0] в качестве направления и c[1] в качестве количества пробелов.

Кроме того, поскольку вы читаете символ, ваш cin получает только первый символ.

1
sabbahillel 11 Мар 2015 в 01:23

Ваша проблема в том, что вы получаете ввод как символ:

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 шаг. Если это два символа, мы берем второй символ и принимаем его за количество шагов. Дополнительные сложности возникают только при проверке и обработке ошибок.

1
Chris 11 Мар 2015 в 02:26
Требование состоит в том, чтобы разрешить пользователю вводить либо «w», либо «w2», w3 и т. д. Они также могут вводить s и d с a2, s3, d5 и т. д. в качестве возможных входных данных. Так что по сути 1-5 мест за ход, максимум 5. Спасибо!
 – 
aishere
11 Мар 2015 в 01:46