2013-06-02 1 views
0

Так что в основном я должен написать программу, которая похожа на игру RPG, где есть разные типы существ. Каждое существо является объектом класса Существо и имеет переменные-члены для hitpoints, strength и т. Д.Нужна помощь Получение классов для взаимодействия друг с другом

У меня возникают проблемы с написанием функции, которая обрабатывает и наносит урон между классами.

#include <iostream> 
#include <string> 
#include <stdlib.h> 

using std::cout; 
using std::cin; 
using std::endl; 
using std::string; 

//Creature Base Class (Type 0) 
class Creature 
{ 
    public: 
    Creature(int, int, int); 
    int gettype() {return type;} 
    int getstrength(){return strength;} 
    int gethitpoints() {return hitpoints;} 
    void sethitpoints(int); 
    string getspecies(); 
    void printstats(); 
    void dealdamage(Creature, Creature); 
    void takedamage(int); 

    private: 
    int type; 
    int strength; 
    int hitpoints; 
}; 

Creature::Creature(int t, int s, int hp) 
{ 
    type = t; 
    strength = s; 
    hitpoints = hp; 
} 

void Creature::printstats() 
{ 
    cout << "This creature has: " << endl; 
    cout << strength << " strength" << endl; 
    cout << hitpoints << " hitpoints" << endl; 
    cout << "and is of type " << type << "(" << getspecies() << ")" << endl; 
} 

void Creature::sethitpoints(int a) 
{ 
    hitpoints = a; 
} 

string Creature::getspecies() 
{ 
    switch(type) 
    { 
    case 0: return "Creature"; 
    case 1: return "Human"; 
    case 2: return "Elf"; 
    case 3: return "Demon"; 
    case 4: return "Balrog"; 
    case 5: return "Cyberdemon"; 
    } 
} 

void Creature::dealdamage(Creature dealer, Creature target) 
{ 
    srand(5); 
    int damage; 
    damage = rand() % strength+1; 
    cout << dealer.getspecies() << " inflicts " << damage; 
    cout << " damage to " << target.getspecies() << "!" << endl; 
    target.takedamage(damage); 
} 

void Creature::takedamage(int damage) 
{ 
    sethitpoints((gethitpoints()-damage)); 
} 

int main() 
{ 
    Creature monster1(0, 10, 100); 
    Creature monster2(1, 7, 90); 

    monster1.printstats(); 
    monster2.printstats(); 

    monster1.dealdamage(monster1, monster2); 
    monster2.printstats(); 

    return 0; 
} 

Прямо сейчас, на выходе программа дает мне это:

This creature has: 
10 strength 
100 hitpoints 
and is of type 0(Creature) 
This creature has: 
7 strength 
90 hitpoints 
and is of type 1(Human) 
Creature inflicts 5 damage to human! 
This creature has: 
7 strength 
90 hitpoints 
and is of type 1(Human) 

Так функция dealdamage(), кажется, работает, но функция takedamage() не правильно изменения хитпоинтов из существо, которое получает урон.

Любая помощь будет оценена по достоинству.

+2

Функция 'dealdamage' принимает' Существо 'по значению - вы изменяете хитпоинты локальной копии. Вместо этого попробуйте перейти по ссылке. – tmpearce

+0

Nevermind, я понял, что мне нужно передать целевой класс по ссылке. –

+0

Вы заметите отчетливое отсутствие случайности в номерах повреждений от 'Существо :: dealdamage'. Ваш вызов 'srand (5)' в начале функции в основном говорит генератору случайных чисел, чтобы начать сначала в одной и той же точке последовательности случайных чисел каждый раз, когда вы вызываете 'dealdamage'. Вы должны называть 'srand' ровно один раз, вероятно, в' main', чтобы засеять RNG. – Casey

ответ

1

Проблема заключается в аннулируются Существо :: dealdamage (Существо дилер, цель Существо)

Во-первых, это называется «пройти по значению». Создаются новые объекты «Существо» и копируются в них значения объектов «Существо», которые вы называете функцией. Процедура выполняется, и эти временные объекты существа EOL - исходные объекты Существа никогда не затрагиваются.

Вам нужно взять указатель или ссылку на исходный объект. Но если вы не намерены поддерживать какой-то 3-сторонний бой, вы не должны требовать оба элемента в любом случае - это нестатическая функция-член, поэтому она уже работает в контексте одного из существ, следовательно, синтаксис, с которым вы его вызывали: monster1.dealdamage (monster1, monster2);

Изменение dealdamage так:

void Creature::dealdamage(Creature& target) // takes a reference 
{ 
    //srand(5); <- this will cause rand() to always return the same value. dont do it. 
    //int damage; <- don't separate declaration and assignment when you can avoid it. 
    int damage = rand() % strength+1; 
    cout << getspecies() << " inflicts " << damage 
     << " damage to " << target.getspecies() << "!" << endl; 
    target.takedamage(damage); 
} 

Вы можете использовать this->getspecies(), если вы найдете только с помощью getspecies() нечеткие.

Вместо srand (постоянное значение) попробуйте что-то вроде «srand (time (NULL))» или, еще лучше, сделайте это один раз в начале программы.

Смежные вопросы