我目前正在开展一个学校项目,我们必须在c ++控制台应用程序中制作游戏。我目前在AI移动方面遇到了一些问题。因此,一旦玩家移动,机器人就可以移动。但由于某种原因,该函数被多次执行。
机器人动作的功能(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';
}
我已经设置断点来查看究竟发生了什么,以及线条&#39; monsterMove();&#39;多次执行。我真的不知道自己做错了什么。
答案 0 :(得分:0)
您的代码的一个明显问题是您在playerMove()
内调用了playerMove()
,并且正如我所看到的那样,您粘贴的代码中没有任何内容可以阻止递归。另外,我在代码中根本找不到你提到的行MonsterMove();
,即使这样的行确实存在,你也错过了一个参数,它甚至不会编译。