【发布时间】:2017-12-09 09:12:53
【问题描述】:
我目前正在做一个学校项目,我们必须在 c++ 控制台应用程序中制作一个游戏。我目前在人工智能移动方面遇到了一些问题。因此,一旦玩家移动,机器人就可以移动。但由于某种原因,该函数被多次执行。
机器人移动的函数(monsterMove):
void playerMove() {
COORD playerCord = { playerX,playerY };
memset(map3, 0, sizeof(map3));
int c = 0;
switch ((c = _getch())) {
case KEY_UP:
if (map[playerY-1][playerX] == ' ')
{
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), playerCord);
cout << " ";
map[playerY][playerX] = ' ';
playerY--;
}
break;
case KEY_DOWN:
if (map[playerY + 1][playerX] == ' ')
{
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), playerCord);
cout << " ";
map[playerY][playerX] = ' ';
playerY++;
}
break;
case KEY_LEFT:
if (map[playerY][playerX-1]== ' ')
{
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), playerCord);
cout << " ";
map[playerY][playerX] = ' ';
playerX--;
}
break;
case KEY_RIGHT:
if (map[playerY][playerX + 1] == ' ')
{
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), playerCord);
cout << " ";
map[playerY][playerX] = ' ';
playerX++;
}
break;
default:
break;
}
monsterMove(1);
map[playerY][playerX] = 157;
COORD playerCord2 = { playerX,playerY };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), playerCord2);
cout << "I";
playerMove();
}
函数本身:
void monsterMove(int moves) {
map[monsterY][monsterX] = ' ';
int row[] = { -1, 0, 0, 1 };
int col[] = { 0, -1, 1, 0 };
int toMove =BFS(map, playerX, playerY, monsterX, monsterY)-moves;
COORD monsterCoord2 = { monsterX,monsterY};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), monsterCoord2);
cout << ' ';
while (map3[monsterY][monsterX] != toMove)
{
for (int k = 0; k < 4; k++)
{
if ((map3[monsterY + col[k]][monsterX + row[k]] == map3[monsterY][monsterX] -1) && !( map3[monsterY][monsterX] == toMove))
{
monsterX = monsterX+ row[k];
monsterY =monsterY+ col[k];
}
}
}
COORD monsterCoord = { monsterX,monsterY };
map[monsterY][monsterX] = 157;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), monsterCoord);
cout << 'M';
}
我已经设置了断点来看看到底发生了什么,以及'monsterMove();'这一行被执行多次。我真的不明白我做错了什么。
【问题讨论】:
-
离题(因为 fix-my-code 请求没有任何minimal reproducible example)。编译所有警告和调试信息:
g++ -Wall -Wextra -g和 GCC。改进代码以获得没有警告。 使用调试器gdb,或许可以逐步运行您的程序并了解发生了什么。 -
看
playerMove()的最后一条语句。它无条件地递归调用自己。这意味着在此之前代码中的所有其他内容(包括对monsterMove()的调用)都将被执行多次。 -
是的,这就是重点,一旦你采取行动,机器人也会采取行动。但是在你有机会采取第二步之前,机器人需要 2,因为它被执行了多次。还是我错过了什么?
-
无条件递归不是实现目标的正确方法。使用某种循环而不是无条件递归。
-
你是如何输入的?我怀疑有一些额外的字符导致
_getch()不等待并多次调用您的函数而无需在每次上/下/左/右按键之间等待?