создание изменения в перечислении в C ++ - PullRequest
0 голосов
/ 29 марта 2020

Я создаю игру, когда игрок приземляется на «F», нумерация в классе игрока должна меняться от good до bad.

Например, если у игрока уже есть good и приземляется на «F», оно изменится на bad, а если игроки вернутся на «F», это будет снова good и т. Д.

player.h

class Player {
public:
  int health = 100;
  int weapon = 1;
  int lvl = 0;

  Player(bool hero) {
    if (hero) {
      health;
      weapon;
    } else {
      health = 1;
    }
  }

  enum Alignment { good, bad };

  void attack(Enemy &e);

  friend class Enemy;
};

основной. cpp

if (gameBoard[positionX][positionY] == gameBoard[0][4]) {
  cout << "\nWell Of Reflection\n" << endl;
  cout << "You increases your XP by 2" << endl;
  p.lvl += 2;
  cout << "Total XP: " << p.lvl << endl;
  Alignment = // HERE
}

Ответы [ 2 ]

3 голосов
/ 29 марта 2020
enum Alignment { good, bad };

Объявляет тип с именем Alignment, а не переменную. Ваша строка

Alignment = // HERE

будет пытаться присвоить значение типу, что не имеет смысла.

Вам понадобится что-то вроде этого:

enum Alignment { good, bad };
Alignment myAlignment = good; 

Я действительно предпочитаю использовать перечисления с областью видимости вот так:

enum class Alignment { good, bad }; 
Aligmnent myAlignment = Alignment::good;

Они ' функционально эквивалентен, но последний дает компилятору некоторые подсказки, которые могут отлавливать ошибки кодирования во время компиляции.

Примечание: обратите внимание, что в вашем сообщении слово Alignment отображается в сине-зеленом цвете, зарезервированном для типов.

Применение этого к определению вашего класса:

class Player {
public:
  int health = 100;
  int weapon = 1;
  int lvl = 0;

  Player(bool hero) {
    if (hero) {
//      health;  THESE LINES DO NOTHING BUT GENERATE A WARNING.
  //    weapon;
    } else {
      health = 1;
    }
  }
  // Alignment is a nested type that can be referred to as Player::Alignment.
  enum class Alignment { good, bad };
  Alignment playerAlignment = Alignment::good;

  void attack(Enemy &e);

  friend class Enemy;
};

И позже ...

if (gameBoard[positionX][positionY] == gameBoard[0][4]) {
  cout << "\nWell Of Reflection\n" << endl;
  cout << "You increases your XP by 2" << endl;
  p.lvl += 2;
  cout << "Total XP: " << p.lvl << endl;
  p.playerAlignment = Player::Alignment::bad;
}

Или, если вы хотите отобразить выравнивание игрока:

std::string to_string(Player::Alignment alignment)
{    
    switch(alignment)
    {
      case Player::Alignment::good:
        return "good";
      case Player::Alignment::bad:
        return "bad";
    }
    return "Unknown alignment";    
}

И в других местах, когда вы хотите использовать это:

cout << "Alignment: " << to_string(p.playerAlignment) << endl;
0 голосов
/ 29 марта 2020

player.h

class Player {
public:
  int health = 100;
  int weapon = 1;
  int lvl = 0;

  Player(bool hero) {
    if (!hero) {
      health = 1;
    }
  }

  enum Alignment { good, bad };

  Alignment al = Alignment::good; // creates the new field in the class to store the aligment

  void attack(Enemy &e);

  friend class Enemy;
};

main. cpp

if (gameBoard[positionX][positionY] == gameBoard[0][4]) {
  cout << "\nWell Of Reflection\n" << endl;
  cout << "You increases your XP by 2" << endl;
  p.lvl += 2;
  cout << "Total XP: " << p.lvl << endl;

  // to switch value do something like that
  if (p.al == Aligment::good) {
       p.al = Aligment::bad;
    } else {
       p.al = Aligment::good;
    }

}

Но ваш подход очень базовый c. Не рекомендуется изменять поля в классе напрямую и только установщиками и получателями. Для сохранения некоторого состояния вы можете использовать переменную flag и двоичные операции (например, byte flags = 0b00000000 и flags = flags & 0b00000010 для сохранения какого-либо состояния во втором бите переменной flags (если у него два состояния)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...