允许用户在迷宫游戏中最多移动五个空间
Allow user to move up to five spaces in Maze game
我试图允许用户输入"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 步。如果是两个字符,我们取第二个字符并假设它是步数。额外的复杂性只是用于验证和错误处理。
相关文章:
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- 将对象移动到std::shared_ptr
- 何时在引用或唯一指针上使用移动语义
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 如何从具有移动语义的类对象中生成共享指针
- 将shared_ptr移动到<StructA>shared_ptr<变体<结构A、结构 B>>
- 通过继承类使用来自不同命名空间的运算符
- 在项目中移动了文件,现在我找不到命名空间
- 为什么在boost ::交换中将swap_impl移动到单独的名称空间
- 如何在 3D 空间中正确移动相机
- 允许用户在迷宫游戏中最多移动五个空间
- 如何在 directx11 中将相机移动到窗口的 1 个像素单位,而不是世界空间中的 1 个单位
- 删除数组中的对象,并通过让其他数组对象相应地向左移动来摆脱空数组空间
- SFINAE:当重载移动到其他命名空间时,检查函数是否存在会中断
- 在窗口中移动或指定线程堆栈空间
- 如何将 Qt 表单类移动到另一个命名空间