#include #include using namespace std; /* иерархия: Item |->Resource |->Modification |->Equipment не съм сигурен дали следващите ще са нужни, почти идентични са според работата си, за сега ги няма в кода | |->Weapon | |->Tool | |->Armor |->Person |->Reasearcher |->Worker Squad Наредбата на деклариране на класовете ИМА знаение! Член данна обект може да е от клас, който е описан след класа в който той (членът данна обект) е деклариран. */ class Item { private: protected: double price;//това са парите които трябва да се платят public: double basePrice;//оригинална/складна цена char type; Item () { basePrice = -1; type = 'n'; calcPrice(1, 1); } Item (int basePrice, char type) { this->basePrice = basePrice; this->type = type; calcPrice(1, 1); } virtual void calcPrice (int repIndex, int valueIndex) //модифицира price- нека не минава през този процес прекалено много { price = basePrice + valueIndex / repIndex + basePrice / repIndex;//там нещо си за пресмятане } double getPrice () { return price; } virtual void printInfo () { cout<<"Item: "; if (type == 'r') cout<<"resource\n"; else if (type == 'm') cout<<"modification\n"; else if (type == 'p') cout<<"person\n"; else cout<<"something...\n"; cout<<"Price: "<rType = rType; this->quantity = quantity; this->basePrice = basePrice; calcPrice(1, 1); calcTotalPrice(); } void calcTotalPrice () { totalPrice = price * quantity; } void printInfo () { cout<<"Quantity: "<mType = mType; this->basePrice = basePrice; equiped = false; modEfficiency = 2; } double calcEffMod (double equipmentEff) { return equipmentEff * (modEfficiency / 100); } void calcPrice (int repIndex, int valueIndex) { price = basePrice + basePrice * (modEfficiency / 100); Item::calcPrice(repIndex, valueIndex); } void printInfo () { cout<<"Item: modification\n"; cout<<"Modification for: "; if (mType == 'w') cout<<"weapon\n"; else if (mType == 'a') cout<<"armor\n"; else if (mType == 't') cout<<"tool\n"; else cout<<"something"; cout<<"Modifies by "<basePrice = basePrice; this->eType = eType; this->efficiency = efficiency; modCount = 0; equiped = false; //когато ще се работи с модификация, //ВИНАГИ трябва да се провери дали //има такава в дадения слот modification[0] = NULL; modification[1] = NULL; modification[2] = NULL; calcModEff (); calcPrice (1, 1); } ~Equipment () { delete modification[0]; delete modification[1]; delete modification[2]; } void addMod (Modification* mod, int modSlot) { modification[modSlot] = mod; modification[modSlot]->equiped = true; modCount++; } void removeMod (int modSlot) { modification[modSlot]->equiped = false;//преди указателя да започне да сочи в нищото, да кажем на модификацията, че я махаме от мястото си modification[modSlot] = NULL; modCount--; } virtual void calcModEff () //virtual? { modEfficiency = efficiency; if (modification[0] != NULL) modEfficiency += modification[0]->calcEffMod(efficiency); if (modification[1] != NULL) modEfficiency += modification[1]->calcEffMod(efficiency); if (modification[2] != NULL) modEfficiency += modification[2]->calcEffMod(efficiency); } virtual void calcPrice (int repIndex, int valueIndex) { price = basePrice + basePrice * (modEfficiency - efficiency) / 100; Item::calcPrice(repIndex, valueIndex); } void setModCount (int count)//временно ще го ползвам { modCount = count; } void printInfo () { cout<<"Item: equipment\n"; cout<<"Type: "; if (eType == 'w') cout<<"weapon\n"; else if (eType == 'a') cout<<"armor\n"; else if (eType == 't') cout<<"tool\n"; else cout<<"something...\n"; printShortInfo(); cout<<"Price: "<basePrice = basePrice; this->reasearchExp = reasearchExp; this->name = name; type = 'p'; job = 'r'; calcPrice(1, 1); } void calcPrice (int repIndex, int valueIndex) { price = basePrice + reasearchExp; Item::calcPrice(repIndex, valueIndex); } void printInfo () { cout<<"Item: "<<"person\n"; cout<<"Name: "<eType = 'w'; tool = new Equipment; tool->eType = 't'; armor = new Equipment; armor->eType = 'a'; //============ calcPrice(1, 1); } Worker (int basePrice, int combatExp, int miningExp, string name, char job) { this->basePrice = basePrice; this->combatExp = combatExp; this->miningExp = miningExp; this->name = name; this->job = job;//m - моньор, a - въоръжен (armed) type = 'p'; //екипировка== weapon = new Equipment; weapon->eType = 'w'; tool = new Equipment; tool->eType = 't'; armor = new Equipment; armor->eType = 'a'; //============ calcPrice(1, 1); } void equipWeapon (Equipment* weapon) { this->weapon = weapon; this->weapon->equiped = true; } void equipTool (Equipment* tool) { this->tool = tool; this->tool->equiped = true; } void equipArmor (Equipment* armor) { this->armor = armor; this->armor->equiped = true; } void calcPrice (int repIndex, int valueIndex) { if (job == 'm') price = basePrice + combatExp / 2 + miningExp; else price = basePrice + combatExp; Item::calcPrice(repIndex, valueIndex); price = price + weapon->getPrice(); price = price + tool->getPrice(); price = price + armor->getPrice(); } void printInfo () { cout<<"Item: "<<"person\n"; cout<<"Name: "<printShortInfo(); cout<<" tool:\n"; tool->printShortInfo(); cout<<" armor:\n"; armor->printShortInfo(); } }; class Squad //това ще трябва да го направя на два динамични масива { private: int peopleNumber; int stuffNumber; Person* person [3]; Item* item [3]; public: Squad () { peopleNumber = 0; stuffNumber = 0; person[0] = NULL; person[1] = NULL; person[2] = NULL; item[0] = NULL; item[1] = NULL; item[2] = NULL; } ~Squad () { delete person[0]; delete person[1]; delete person[2]; delete item[0]; delete item[1]; delete item[2]; } void addPerson (Person* newPerson) { person[peopleNumber] = newPerson; peopleNumber++; } void addStuff (Item* newItem) { item[stuffNumber] = newItem; stuffNumber++; } void printInfo () { for (int i = 0; i < peopleNumber; i++) { person[i]->calcPrice(1, 1); person[i]->printInfo(); cout<calcPrice(1, 1); item[i]->printInfo(); cout<(item[5]); Equipment* weaponRef = dynamic_cast(item[6]); Equipment* toolRef = dynamic_cast(item[7]); Worker* tempMinerRef = dynamic_cast(item[3]); //миньорът нарамва екипировката си: //не се случва НИКАКВО копиране на обекти! Само си играя с указателите //по-късно за екипировката и item[5 до 9] ще се изведе една и съща информация, защото ще са едни и същи неща tempMinerRef->equipWeapon(weaponRef); tempMinerRef->equipArmor(armorRef); tempMinerRef->equipTool(toolRef); //и сега ще си я подсили с малко модификации: //оръжие: tempMinerRef->weapon->addMod(mod[2], 0); tempMinerRef->weapon->addMod(mod[3], 1); tempMinerRef->weapon->calcModEff(); //инструмент: tempMinerRef->tool->addMod(mod[8], 0); tempMinerRef->tool->addMod(mod[9], 1); tempMinerRef->tool->addMod(mod[10], 2); tempMinerRef->tool->calcModEff(); //броня: tempMinerRef->armor->addMod(mod[4], 0); tempMinerRef->armor->addMod(mod[5], 1); tempMinerRef->armor->calcModEff(); //а сега да въоръжим и въоръжените сили Equipment* armorRef0 = dynamic_cast(item[9]); Equipment* weaponRef0 = dynamic_cast(item[8]); Worker* tempArmedRef = dynamic_cast(item[4]); tempArmedRef->equipWeapon(weaponRef0); tempArmedRef->equipArmor(armorRef0); //оръжие: tempArmedRef->weapon->addMod(mod[0], 0); tempArmedRef->weapon->addMod(mod[1], 1); tempArmedRef->weapon->calcModEff(); //броня: tempArmedRef->armor->addMod(mod[6], 0); tempArmedRef->armor->addMod(mod[7], 1); tempArmedRef->armor->calcModEff(); //а сега двамата да ги сложим в екип и да ги натоварим с малко неща Squad squad; squad.addPerson(tempMinerRef); squad.addPerson(tempArmedRef); Resource* resourceRef = dynamic_cast(item[0]); squad.addStuff(resourceRef); resourceRef = dynamic_cast(item[10]); squad.addStuff(resourceRef); squad.printInfo(); cout<calcPrice(1, 1); item[i]->printInfo(); cout<