Объявление случайного количества объектов в c

#c

#c

Вопрос:

Итак, у меня есть приличный опыт работы с другими языками, но я очень новичок в c . Я пытаюсь создать простую текстовую rpg, в которой есть только игрок и случайное количество врагов. Итак, проблема в том, что когда я пытаюсь перемещаться в нем, я никогда не сталкиваюсь с врагом, поэтому у меня либо возникают проблемы с созданием реальных объектов противника, либо мой код для проверки, находится ли игрок в том же месте, что и враг, не работает, или, может быть, это что-то еще. Я был бы очень признателен за некоторую помощь. Спасибо.

Кстати, извините, что мое форматирование немного перепуталось.

 #include <iostream>
#include <random>
#include <string>

using namespace std;

#define UP 1
#define RIGHT

class Character
{
public:
    int health, armour, speed, x, y, attackPower;
    Character()
    {
        health = 100;
        armour = 100;
        speed = 1;
    }

    bool isTouching(Character character)
    {
        if (x == character.x amp;amp; y == character.y)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    void move(string dir)
    {
        if (dir == "up")
        {
            y  = speed;
        }
        else if (dir == "down")
        {
            y -= speed;
        }
        else if (dir == "right")
        {
            x  = speed;
        }
        else if (dir == "left")
        {
            x -= speed;
        }
    }

    void takeDamage(int damage)
    {
        if (armour > damage)
        {
            armour -= damage;
        }
        else
        {
            if (armour > 0)
            {
                int remainingDamage = damage - armour;
                armour = 0;
                health -= remainingDamage;
            }
        }
        health -= damage;
    }

    void attack(Character* character)
    {
        character->takeDamage(attackPower);
    }

};

class Player: public Character
{
public:
    Player()
    {
        health = 100;
        armour = 100;
        speed = 1;
        x = 10;
        y = 10;
        attackPower = 50;

    }
};


class Enemy : public Character
{
public:
    Enemy()
    {
        health = 100;
        armour = 0;
        speed = 1;
        x = rand() % 100;
        y = rand() % 100;
        attackPower = 20;

    }
};

int main()
{

    Character player;


    Enemy *enemies;
    int numEnemies = rand() % 30   20;
    enemies = new Enemy[numEnemies];

    while (true)
    {
        string input;
        cout << "Enter command: ";
        cin >> input;
        if (input == "exit" || input == "quit")
        {
            break;
        }
        if (input == "move")
        {
            string direction;
            cout << "pick a direction: ";
            cin >> direction;
            player.move(direction);

            for (int i = 0; i < sizeof(enemies) / sizeof(int); i  )
            {
                if (player.isTouching(enemies[i]))
                {
                    cout << "You ran into an enemy!" << endl;
                    cout << "What would you like to do?: ";
                    string interactionInput;
                    cin >> interactionInput;
                    if (interactionInput == "attack")
                    {
                        player.attack(amp;enemies[i]);
                        enemies[i].attack(amp;player);
                        cout << "Enemy now at " << enemies[i].armour << " armour and " << enemies[i].health << " health" << endl;
                        cout << "You are now at " << player.armour << " armour and " << player.health << " health" << endl;
                    }
                }
            }

        }



    }

    system("pause");
    return 0;
}
 

Комментарии:

1. Используйте std::vector для динамического массива, а не для необработанного указателя (который вы пропускаете).

2. Вы пробовали отлаживать свою программу? Каков был результат этих усилий ?

3. Добавление к комментарию @chris: std::vector<Enemy> или std::vector<Enemy *> или std::vector< unique_ptr<Enemy> > .

4. Вы должны инвестировать в Location класс, а не x, y в персонажа. Это поможет позже, если изменится тип местоположения (например, добавится высота или страна). Вы можете перегрузить operator для управления скоростью или изменения положения.

Ответ №1:

sizeof(enemies) равно 4 или 8, в зависимости от размера адресного пространства вашей виртуальной памяти.

sizeof(int) равно 2 или 4, в зависимости от определения вашего компилятора (на основе базового HW).

So sizeof(enemies) / sizeof(int) находится где-то между 1 и 4.

Сказав это, вы можете просто использовать numEnemies вместо.


Если вы выделили enemies массив статически ( Enemy enemies[...] ), то вы могли бы использовать:

 sizeof(enemies)/sizeof(Enemy)
sizeof(enemies)/sizeof(*enemies)
sizeof(enemies)/sizeof(enemies[0]) // or any other index
 

Но поскольку вы выделяете его динамически, он обрабатывается как указатель (размером 4 или 8 байт).

Комментарии:

1. 1. Это потому sizeof(enemies) , что означает размер фактической переменной enemies , которая в данном случае является простым указателем, а не массивом.

2. @Cameron: Спасибо. Возможно, я действительно должен упомянуть, что это потому, что мы имеем дело с указателем (хотя часть «адресное пространство памяти» подразумевает это довольно хорошо).

3. О, это имеет смысл, спасибо всем за ответы.

4. @monster3: Всегда пожалуйста. Я добавил краткое объяснение того, когда и как вы можете использовать sizeof для определения размера массива. Пожалуйста, не стесняйтесь принять ответ, нажав на V рядом с ним 🙂

Ответ №2:

В дополнение к проблеме, упомянутой в ответе Барака Маноса, эта строка, вероятно, является упущением.

 Character player;
 

Я думаю, вы хотели использовать:

 Player player;
 

Если вы используете первую строку, значения x и y не инициализируются. Вы получите непредсказуемое поведение.