允许用户在迷宫游戏中最多移动五个空间

Allow user to move up to five spaces in Maze game

本文关键字:移动 空间 五个 游戏 许用户 用户 迷宫      更新时间:2023-10-16

我试图允许用户输入"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;
}

我感谢所有的帮助!谢谢!

switch (c) { 案例"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 步。如果是两个字符,我们取第二个字符并假设它是步数。额外的复杂性只是用于验证和错误处理。