#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
не инициализируются. Вы получите непредсказуемое поведение.