HiveBrain v1.2.0
Get Started
← Back to all entries
patterncppMinor

Array data-handling with NPC class

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
handlingclassarraywithnpcdata

Problem

I am wondering about the best way to save on RAM/memory when there are many required arrays (I plan to have many more NPCs and various other arrays with text and items). And I am wondering what I can improve on so far.

```
#include
#include

#define NUM_NPC 10 // Number of NPC players

#define DETAILS_HEARTS 0 // Heart Position
#define DETAILS_BDMON 1 // Birthday Month Position
#define DETAILS_BDDAY 2 // Birthday Day Position
#define DETAILS_GENDER 3 // NPC Gender

using namespace std;

class npcPlayers {
public:
int getHearts(int playerID);
int getItem(int playerID, int itemID);
int getBirthdayMonth(int playerID);
int getBirthdayDay(int playerID);
char *getName(int playerID);
npcPlayers();
private:
int npcDetails[NUM_NPC][10];
char npcNames[NUM_NPC][20];
int updateHearts(int PlayerID,int value);
};

npcPlayers::npcPlayers() {
npcNames = {"Ace","Amber","Benny","Ethan","Michael","Jay","William","Mia","Chloe","Emily"};
npcDetails = {
{0,3,5,0}, // Ace
{0,9,20,1}, // Amber
{0,1,10,0}, // Bennny
{0,12,30,0}, // Ethan
{0,2,17,0}, // Michael
{0,6,10,0}, // Jay
{0,8,9,0}, // William
{0,4,1,1}, // Mia
{0,5,13,1}, // Chloe
{0,8,5,1} // Emily
};
}

int npcPlayers::getHearts(int playerID) {
return npcDetails[playerID][DETAILS_HEARTS];
}
int npcPlayers::getItem(int playerID, int itemID) {

}
int npcPlayers::getBirthdayDay(int playerID) {
return npcDetails[playerID][DETAILS_BDDAY];
}
int npcPlayers::getBirthdayMonth(int playerID) {
return npcDetails[playerID][DETAILS_BDMON];
}
char *npcPlayers::getName(int playerID) {
return npcNames[playerID];
}

int main() {
npcPlayers npc;
cout << "Player 1 Details:" << endl;
cout << "Name: " << npc.getName(1) << endl;
cout << "Hearts: " << npc.getHear

Solution

-
C++ is statically typed programming language. Due to this overhead for allocation of class members is very small.

-
Using of global variables is not a good idea. Such vars like NUM_NPC makes your application non-scalable.

-
Each domain object (like a player or an item) must be described by a same-named class.

#include 
#include 
#include 

typedef int Hearts;
typedef bool Gender;

struct Date
{
      Date(int month,int day) : month(month), day(day) {}
      int month;
      int day;
};

class Item
{
    // TODO: implement
};

class Player
{
public:
      Player(std::string name, Hearts hearts, Date birthday, Gender gender)
            : name(name), hearts(hearts), birthday(birthday), gender(gender) {}

      Hearts getHearts() const
      {
            return hearts;
      }

      const std::vector& getItems()
      {
            return items;
      }

      Date getBirthday() const
      {
            return birthday;
      }

      std::string getName() const
      {
            return name;
      }
private:
      std::vector items;
      Hearts hearts;
      Date birthday;
      std::string name;
      Gender gender;
};

int main()
{
      using namespace std;

      vector players;
      players.push_back(Player("Ace", 0, Date(3,5), 0));
      players.push_back(Player("Amber", 0, Date(9,20), 1));
      players.push_back(Player("Benny", 0, Date(1,10), 0));
      players.push_back(Player("Ethan", 0, Date(12,30), 0));

      Player& p = players[1];
      cout << "Player 1 Details:" << endl;
      cout << "Name: " << p.getName() << endl;
      cout << "Hearts: " << p.getHearts() << endl;
      cout << "Birthday: " << p.getBirthday().month << "/" << p.getBirthday().day << endl;
      cout << "Item count: " << p.getItems().size() << endl;
}

Code Snippets

#include <iostream>
#include <string>
#include <vector>

typedef int Hearts;
typedef bool Gender;

struct Date
{
      Date(int month,int day) : month(month), day(day) {}
      int month;
      int day;
};

class Item
{
    // TODO: implement
};

class Player
{
public:
      Player(std::string name, Hearts hearts, Date birthday, Gender gender)
            : name(name), hearts(hearts), birthday(birthday), gender(gender) {}

      Hearts getHearts() const
      {
            return hearts;
      }

      const std::vector<Item>& getItems()
      {
            return items;
      }

      Date getBirthday() const
      {
            return birthday;
      }

      std::string getName() const
      {
            return name;
      }
private:
      std::vector<Item> items;
      Hearts hearts;
      Date birthday;
      std::string name;
      Gender gender;
};

int main()
{
      using namespace std;

      vector<Player> players;
      players.push_back(Player("Ace", 0, Date(3,5), 0));
      players.push_back(Player("Amber", 0, Date(9,20), 1));
      players.push_back(Player("Benny", 0, Date(1,10), 0));
      players.push_back(Player("Ethan", 0, Date(12,30), 0));

      Player& p = players[1];
      cout << "Player 1 Details:" << endl;
      cout << "Name: " << p.getName() << endl;
      cout << "Hearts: " << p.getHearts() << endl;
      cout << "Birthday: " << p.getBirthday().month << "/" << p.getBirthday().day << endl;
      cout << "Item count: " << p.getItems().size() << endl;
}

Context

StackExchange Code Review Q#10460, answer score: 6

Revisions (0)

No revisions yet.