Rozwiazanie problemu ekwipunku rpg

0

Witam oto kod


class postac;



class item
{
friend class postac;
public:



    string nazwa;
    int ID;
    char cel;
   
   

    int waga;
    int cena;
    int attack;
    int defensywa;
    int obrona;
    int hp;
    int mana;




    item(string nazwa1, int id, char why,int weigh, int a=0, int ob=0,int def=0, int p=0,int h=0, int m=0)
	{
	nazwa=nazwa1;
	ID=id;
    waga=weigh;
	cel=why;

	waga=weigh;
	attack=a;
	obrona=ob;
	defensywa=def;
	cena=p;
	hp=h;
	mana=m;
	}

	int return_item_waga(int id){
	    
    return (  id ).waga;

    }
  



    };

mam takie pytanie jak widac chce stworzyc funkcje return_item_weight i tam podaje id
kazdy przedmiot ma swoje id a nazwa obiektu to jego id no wiecie item 1(miecz) ;
jak zrobic zebym mogl w tej funkcji zapisac wlasnie takie id . waga tyle ze id to jest ten int co podaje w funkcji return_item_weight
i ja

0

Nie mam pojęcia co próbowałeś napisać w języku polskim, ale mam kilka zastrzeżeń do Twojego kodu:

1.Skoro jedna klasa nazywa się postac (po polsku), dlaczego druga już item? Tak samo jak masz z jednej strony waga, a z drugiej attack. Dobierasz te co ładniej brzmiące angielskie słowa czy też nie znasz polskich odpowiedników i boisz się zerknąć do słownika? ;-)
2.Nazywaj klasy po angielsku, wielką literą: Character (Entity, Hero, ...), Item. To samo dotyczy się pól, zmiennych itd.
3.Konstruktor na 10 parametrów, nieźle :D Niech przyjmuje najwyżej nazwę przedmiotu, do reszty utwórz pary getter-setter.
4.return_item_waga - oezu. getWeight jak rozumiem byłoby za mało czytelną nazwą?
5.Ustaw wszystkie pola jako prywatne/chronione; w C++ nie preferuje się tworzenia publicznych pól.
6.Po co przedmiotowi znać jego id? Co także prowadzi do drugiego pytania: po co Ci metoda do zwracania wagi innego przedmiotu (jak wnioskuję po parametrze metody return_item_waga)? Jaki sens miałoby wywołanie w stylu miecz.zwrocWage(piwo)?
7.Nie korzystaj z friend classes, to przeważnie oznaka błędnego zaprojektowania aplikacji.

... a tak najlepiej to nie zabieraj się za tworzenie gry nie znając podstaw programowania obiektowego. Każdy z nas od tego zaczynał (a przynajmniej większość, w tym także i ja), i śmiało mogę rzec, iż każdy na początku polegał ;-) Naucz się solidnie podstaw, porób prostsze aplikacje, a potem dopiero dostrzeżesz wszystko to, co teraz robisz źle.

0

wiec tak w klasie osoba mam tablice dla kazdego obiektu ktora robi mi za ekwipunek i kazde miejsce w tablicy przechowywuje id przedmiotu jesli zostal tam dodany, i jest tam tez parametr udzwig i w funkcji item_add(int id) leci sobie petla i przeszukuje kazde miejsce w tablicy ekwipunek i jak znajdzie takie kotrego wartosc to 0 to sprawdza czy aktualna masa po dodaniu masy przedmiotu o id int id nie bedzie wieksza niz ustalonu udzwig i chce jakos rozwiazac ten problem bo musze dostac mase przedmiotu dzieki za tyle rad ale nie ma w twoim komentarzu odpowiedzi na moje pytanie

0

Wiec tak, w klasie osoba mam tablice dla kazdego obiektu, ktora robi mi za ekwipunek i kazde miejsce w tablicy przechowywuje id przedmiotu, jesli zostal tam dodany, i jest tam tez parametr udzwig, i w funkcji item_add(int id) leci sobie petla, i przeszukuje kazde miejsce w tablicy ekwipunek, i jak znajdzie takie kotrego wartosc to 0 to sprawdza, czy aktualna masa po dodaniu masy przedmiotu o id int id nie bedzie wieksza niz ustalonu udzwig, i chce jakos rozwiazac ten problem, bo musze dostac mase przedmiotu. Dzieki za tyle rad ale nie ma w twoim komentarzu odpowiedzi na moje pytanie.

0

W takim razie wystarczy Ci przecież sama metoda Item::getWeight, bez zabawy w jakieś dodatkowe tablice czy inne dziwadła.

Przykład:

Załóżmy, że masz klasy:
1.CharacterBackpack zajmującą się obsługą plecaka bohatera, w której znajdują się pola size_t itemCount; oraz Item* items;.
2.Character zajmującą się obsługą bohatera, w której znajdują się pola CharacterBackpack backpack; oraz statistics (gdzie trzymane są statystyki bohatera).

Wtedy w luźnym-C++ wyglądałoby to tak:

unsigned int CharacterBackpack:getTotalWeight() {
  unsigned int totalWeight = 0;

  for (size_t i = 0; i < this->itemCount; ++i) {
    totalWeight += this->items[i].getWeight();
  }

  return totalWeight;
}

/* ... */

// może się też nazywać `checkBagpackSize`, jeśli preferujesz bardziej dosłowne nazewnictwo
bool Character::checkLiftingCapacity() {
  return this->backpack.getTotalWeight() <= this->statistics.maxLiftingCapacity;
}

I jeśli po dodaniu przedmiotu Twoje checkLiftingCapacity zwróci false bądź też (podejście nr 2) backpack.getTotalWeight() + currentItemWeight będzie większe od statistics.maxLiftingCapacity, oznaczać to będzie, iż danego przedmiotu nie możesz ze sobą nieść.

0

Dziękuję za pomoc i przepraszam jednocześnie za kłopot.


class item
{
    static int tab[100];
    int item_ID;
    string item_name;
    int item_weight;
    friend class backack;

    item(int item_ID,int item_weight,string item_name)
    {
        this->item_ID = item_ID;
        this->item_weight = item_weight;
        this->item_name = item_name;
        tab[item_ID] = item_weight;



    }


    int get_weight()
    {
        return item_weight;
    }

    string get_item_name()
    {
        return item_name;

    }
    
    int get_weight(int id)
    {
        return tab[id];
        
    }

Przepraszam, a czy ta propozycja dzialalaby?

0

Calosc klasy plecak i item

#include <iostream>
#include <cmath>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <string>
#include <cstdio>
#include<conio.h>

using namespace std;



int losowanie(int a){
    srand(time(NULL));
    return rand()%a;
}





void tekst(string a, int b){
for(int i=0;i<a.length();i++){
    cout<<a[i];_sleep(b);
}
}

class item
{
    static int tab[100];
    int item_ID;
    string item_name;
    int item_weight;
    friend class backack;
    public :

    item(int item_ID,int item_weight,string item_name)
    {
        this->item_ID = item_ID;
        this->item_weight = item_weight;
        this->item_name = item_name;
        tab[item_ID] = item_weight;



    }


    int get_weight()
    {
        return item_weight;
    }

    string get_item_name()
    {
        return item_name;

    }

    int get_weight(int id)
    {
        return tab[id];

    }

};



class backpack
{
    item it;
    int slot[100];
    int max_weight;
    int current_weight;

    public :

    backpack(): it(0,0,"tester"){}

    int item_add(int id)
    {
        int *marker;
        marker = &slot[0];

        int loop=1;

        while (loop==1)

        {
            if (*marker==0)
            {
                if ((current_weight+it.get_weight(id))>max_weight)
                {
                string imie; //ten string jest definiowany w mainie i tylko podmieniana jest zawartosc;
                cout<<endl;
                cout<<imie<<endl;
                string talk;
                talk = "Nie dam rady tyle podniesc";
                tekst(talk,60);
                loop=0;
                }
                else
                {
                    *marker = id;
                    loop=0;
                }

            }
            else
                marker++;
            }


        }









};

0

ok teraz wersja chyba ostateczna

#include <iostream>
#include <cmath>
#include <windows.h>
#include <cstdlib>
#include <ctime>
#include <string>
#include <cstdio>
#include<conio.h>

using namespace std;



int losowanie(int a){
    srand(time(NULL));
    return rand()%a;
}





void tekst(string a, int b){
for(int i=0;i<a.length();i++){
    cout<<a[i];_sleep(b);
}
}

class item
{

    int item_ID;
    string item_name;
    int item_weight;
    friend class backack;
    public :

    item(int item_weight,string item_name,int item_ID=0)
    {
        this->item_ID = item_ID;
        this->item_weight = item_weight;
        this->item_name = item_name;




    }


    int get_weight()
    {
        return item_weight;
    }

    string get_item_name()
    {
        return item_name;

    }
    int get_id()
    {
        return item_ID;
    }

    void set_id(int id)
    {
        item_ID=id;
    }


};



class backpack
{
    item it;
    item slot[100];
    int max_weight;
    int current_weight;


    int item_add(item)
    {
        item *marker;
        marker = &slot[0];

        int loop=1;

        while (loop==1)

        {
            if ((*marker).get_id()==NULL)
            {
                if ((current_weight+(*marker).get_weight())>max_weight)
                {
                string imie; //ten string jest definiowany w mainie i tylko podmieniana jest zawartosc;
                cout<<endl;
                cout<<imie<<endl;
                string talk;
                talk = "Nie dam rady tyle podniesc";
                tekst(talk,60);
                loop=0;
                }
                else
                {
                    (*marker).set_id((*marker).get_id());
                    loop=0;
                }

            }
            else
                marker++;
            }


        }









};

0

O, o coś takiego mi mniej-więcej chodziło.

To teraz tak:
1.Zapoznaj się z formatowaniem kodu w C++.
2.Zapoznaj się z poprawnym nazewnictwem w C++.
3.Nie operuj na gołych wskaźnikach (zwłaszcza że w Twoim przypadku powinno to być zwyczajnym iterowaniem po tablicy, a zrobiłeś tu jakąś maskaradę nie wiadomo po co).
4.Zapoznaj się z typem bool.
5.Nazywaj funkcje, zmienne etc. sensowniej. Twoja funkcja tekst to tak naprawdę jakieś spellText (chociaż można by pomyśleć nad jeszcze lepszą nazwą) z argumentami text oraz charDelay, a nie a i b.
6.srand powinieneś wywoływać tylko raz - na początku działania aplikacji (w mainie), a nie co losowanie. Zapoznaj się z tym, jak w ogóle działa ten PRNG.

1 użytkowników online, w tym zalogowanych: 0, gości: 1