0

我在编译时遇到这两个错误,但我不明白我做错了什么。

main.cpp|107|错误:未在此范围内声明“sqrt”|

main.cpp|107|错误:未在此范围内声明“pow”|

#include <iostream>
#include <Windows.h>
using namespace std;

struct Player
{
    int x, y;
    Player()
    {
        x = -1;
        y = -1;
    }
};

struct Ghost
{
    int x, y, direction;
    Ghost()
    {
        x = -1;
        y = -1;
        direction = 1;
    }
};

const char SYMBOL_EMPTY = ' ';
const char SYMBOL_PLAYER = '@';
const char SYMBOL_GHOST = 'G';
const char SYMBOL_WALL = '#';
const int MapDx = 10;
const int MapDy = 20;
const int GameSpeed = 100;
const int LEFT = 1;
const int RIGHT = 2;
const int UP = 3;
const int DOWN = 4;
int direction = RIGHT;

char map[10][20] =
{
    "###################",
    "#                 #",
    "#                 #",
    "#                 #",
    "#                 #",
    "#                 #",
    "#                 #",
    "#                 #",
    "###################"
};

bool isValidPos(int x, int y)
{
    return (x >= 0 && x < MapDx && y >= 0 && y < MapDy);
}

bool movePlayer(Player &player, int x, int y)
{
    if (!isValidPos(x, y))
    {
        return false;
    }

    char ch = map[x][y];

    if(ch != SYMBOL_EMPTY)
    {
        return false;
    }

    if (isValidPos(player.x, player.y))
    {
        map[player.x][player.y] = SYMBOL_EMPTY;
    }
    player.x = x;
    player.y = y;
    map[player.x][player.y] = SYMBOL_PLAYER;
    return true;
}

bool moveGhost(Ghost &ghost, int x, int y)
{
    if (!isValidPos(x, y))
    {
        return false;
    }

    char ch = map[x][y];

    if (ch != SYMBOL_EMPTY)
    {
        return false;
    }

    if (isValidPos(ghost.x, ghost.y))
    {
        map[ghost.x][ghost.y] = SYMBOL_EMPTY;
    }
    ghost.x = x;
    ghost.y = y;
    map[ghost.x][ghost.y] = SYMBOL_GHOST;
    return true;
}

void GhostAI(Ghost &ghost, Player &player)
{
    double a = sqrt((pow((double) (ghost.x - 1) - player.x, 2)) + pow((double) ghost.y - player.y, 2)); //UP
    double b = sqrt((pow((double) (ghost.x + 1) - player.x, 2)) + pow((double) ghost.y - player.y, 2)); //DOWN
    double c = sqrt((pow((double) (ghost.y - 1) - player.x, 2)) + pow((double) ghost.x - player.y, 2)); //RIGHT
    double d = sqrt((pow((double) (ghost.y + 1) - player.x, 2)) + pow((double) ghost.x - player.y, 2)); //LEFT
    if(a < b && a <= c && a <= d && ghost.direction != DOWN) ghost.direction = UP;
    else if(b <= c && b <= d && ghost.direction != UP) ghost.direction = DOWN;
    else if(c < d && ghost.direction != LEFT) ghost.direction = RIGHT;
    else if(ghost.direction != RIGHT) ghost.direction = LEFT;
}

void showMap()
{
    for (int x = 0; x < MapDx; x++)
    {
        cout << map[x] << endl;
    }
}

void showPlayer(Player &player)
{
    cout << "\nPlayerX: " << player.x << endl;
    cout << "PlayerY: " << player.y << endl;
}

void gameLoop()
{
    Player player;
    Ghost ghosts[3];
    movePlayer(player, 1, 2);
    moveGhost(ghosts[0], 5, 2);
    moveGhost(ghosts[1], 5, 5);
    moveGhost(ghosts[2], 5, 8);
    while (true)
    {
        system("cls");
        showMap();
        showPlayer(player);
        if (GetAsyncKeyState(VK_UP))
        {
            direction = UP;
        }
        else if (GetAsyncKeyState(VK_DOWN))
        {
            direction = DOWN;
        }
        else if (GetAsyncKeyState(VK_LEFT))
        {
            direction = LEFT;
        }
        else if (GetAsyncKeyState(VK_RIGHT))
        {
            direction = RIGHT;
        }
        switch (direction)
        {
        case UP:
            movePlayer(player, player.x-1, player.y);
            break;
        case DOWN:
            movePlayer(player, player.x+1, player.y);
            break;
        case LEFT:
            movePlayer(player, player.x, player.y-1);
            break;
        case RIGHT:
            movePlayer(player, player.x, player.y+1);
            break;
        }
        for (int ghost = 0; ghost < 3; ghost++)
        {
            GhostAI(ghosts[ghost], player);
            switch (ghosts[ghost].direction)
            {
            case UP:
                moveGhost(ghosts[ghost], ghosts[ghost].x-1, ghosts[ghost].y);
                break;
            case DOWN:
                moveGhost(ghosts[ghost], ghosts[ghost].x+1, ghosts[ghost].y);
                break;
            case LEFT:
                moveGhost(ghosts[ghost], ghosts[ghost].x, ghosts[ghost].y-1);
                break;
            case RIGHT:
                moveGhost(ghosts[ghost], ghosts[ghost].x, ghosts[ghost].y+1);
                break;
            }
        }
        Sleep(GameSpeed);
    }
}


int main()
{
    gameLoop();
    return 0;
}
4

2 回答 2

8

你需要

#include <cmath>

它是声明这些函数的标头。

于 2012-11-26T02:19:32.310 回答
1

sqrtpow函数在数学库中声明。确保像这样在全球范围内将它们包括在您的程序中。

#include <cmath>
于 2012-11-26T02:20:36.397 回答