Как переопределить уже созданные значения объекта в C ++ - PullRequest
0 голосов
/ 16 января 2020

У меня есть задание на создание маленькой игры

Создание текстовой приключенческой игры, которая принимает пользовательский ввод и выполняет определенные действия.

// В начале игры пользователю предоставляется возможность выбрать тип игрока (1, 2, 3) // Каждый тип игрока начинается с следующих атрибутов -

// Игрок 1 - максимальное здоровье = 50, урон = 10, лечение = 20

// Игрок 2 - максимальное здоровье = 75, урон = 25, лечение = 10

// Игрок 3 - максимальное здоровье = 100, урон = 75, лечение = 20

проблема в том, что когда я пытаюсь переопределить объект, который он не меняет

Player player(0,0,0);
int player_no;
bool gameover=false;

 std::cout<<"choose your player !!!";
 std::cin>>player_no;
 if(player_no==1){
   Player player1(50,20,10); //value is not reflected inside while
   std::cout<<player.heal;  //50
   std::cout<<player.health; //20
   goto start;
 }else if(player_no==2){
   Player player(75,10,25);  //value is not reflcted inside while
   goto start;
 }


 char command;
  start:
 while(!gameover){
   std::cout<<"what do you want ??? ";
   std::cin>>command;
   if(command=='D'){
     std::cout<<player.health<<"\n";  //uses the default value 0
      std::cout<<player.damage<<"\n";  //uses the default value 0
     player.TakeDamage(player.damage);  //0 is passed
   }else if(command=='H') {
       player.Heal(player.heal);         // 0 is passed
   } 

Как передать измененное значение в то время как? ??

Ответы [ 2 ]

3 голосов
/ 16 января 2020

Крошечный пример для иллюстрации вашей проблемы:

    int a = 2;
    if (a == 2)
    {
        std::cout << "a is " << a << std::endl;
        int a = 3;
        std::cout << "a set to " << a << std::endl;
    }
    std::cout << "a is " << a << std::endl;

Это печатает:

a is 2
a set to 3
a is 2

Почему a не 3 во второй строке? Это связано с тем, что фигурные скобки { ... } объявляют новую область, а строка int a = 3 объявляет новую переменную a, которая является локальной только для этой области. Когда мы оставляем if-scope, вторая a переменная умирает, и у нас остается только оригинал, который все еще имеет значение 2.

Если мы изменим его на:

    int a = 2;
    if (a == 2)
    {
        std::cout << "a is " << a << std::endl;
        a = 3;
        std::cout << "a set to " << a << std::endl;
    }
    std::cout << "a is " << a << std::endl;

Тогда новый a не объявляется, и присвоение ссылается на переменную во внешней области видимости. Теперь вывод:

a is 2
a set to 3
a is 3

Исправьте ваш код, сделав что-то вроде этого:

Player player(0, 0, 0);
...
if (player_no == 1) {
    player = Player(50, 20, 10);
    ...
}
0 голосов
/ 16 января 2020

Существует много проблем: 1) Имя переменной: Вы вызываете player на 1-й строке и player1 после if (player_no == 1) {...

2) Область действия не соблюдается: когда вы создали заново Player Player (75,10,25); он не заменяет первого созданного игрока.

Я предпочту использовать указатель вот так (есть бесконечный способ сделать это!):

Player* pPlayer = NULL;
...
if(player_no==1){
pPlayer = new Player(50, 20, 10);
...
if(player_no==2){
pPlayer = new Player(75, 10, 25);
...
if (pPlayer != NULL) {
   while(!gameover) {
       if (command == 'D') {
           pPlayer->Damage();
       }
   }
delete pPlayer;
}

Надеюсь, это поможет вам!

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