C++ 允许用户在迷宫游戏中最多移动五个空格
我试图允许用户输入类似“w2”或“w5”的内容,并在迷宫中向上移动那么多空间。目前的问题是,每当控制台看到输入了“w”字符时,它都会向上移动一个空格,不管后面是什么。它还将显示无效移动,正如您将看到的默认情况 我认为这是一件相当容易实现的事情,但我只是做错了。我试着简单地做moved=floor->move_to_x_y*这个,-2,0,但这不起作用 以下是我正在使用的函数:C++ 允许用户在迷宫游戏中最多移动五个空格,c++,maze,C++,Maze,我试图允许用户输入类似“w2”或“w5”的内容,并在迷宫中向上移动那么多空间。目前的问题是,每当控制台看到输入了“w”字符时,它都会向上移动一个空格,不管后面是什么。它还将显示无效移动,正如您将看到的默认情况 我认为这是一件相当容易实现的事情,但我只是做错了。我试着简单地做moved=floor->move_to_x_y*这个,-2,0,但这不起作用 以下是我正在使用的函数: void Player::move (Game & game) { char c; Floor * flo
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;
}
我感谢所有的帮助!谢谢 开关c
{
案例“w”:
“single”表示条目是单个字符。因此,您不能有“w2”字符,因此只能获取您输入的第一个字符。将值输入字符数组c[]使用c[0]作为方向,使用c[1]作为空格数
此外,由于您正在读取一个字符,您的cin只会获取第一个字符。您的问题是您将输入作为字符获取:
char c;
...
...
cin >> c;
...
...
这只允许存储单个字符。要表示多个字符,您必须将chat更改为std::string,这将需要按enter键,或者您或您需要记住上一次按键并在下一次按键时处理它…例如:如果最后一次按键='d'和当前按键='2',则mov两个步骤都不太理想。你对用户界面的实际要求是什么?也许有一种更简单/更好的用户交互方法可以帮助解决这个问题
根据反馈,如下所示:
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步。如果字符串的长度为两个字符,我们假定其为第二个字符,并假定其为步骤数。额外的复杂性仅限于验证和错误处理。要求允许用户输入“w”或“w2”、w3等。他们可以n也输入s和d,a2、s3、d5等作为可能的输入。因此基本上每转1-5个空格,最多5个。谢谢!