| Uppg4 – Arv | |
|
|
Författare | Meddelande |
---|
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Uppg4 – Arv ons sep 24, 2008 2:27 am | |
| Förlåt att det tagit så lång tid att läga upp detta exempel. Det enda jag kan säga är att mycket har rört sig i mitt huvud på sista tiden. Som vanligt vill jag inte att ni bara kopierar min kod rakt upp och ned. Försök sätta er in i koden och förstå hur den är uppbyggd. Inlämningar som ser ruskigt likt min kod ut kommer att behöva extra genomgång muntligt. Jag tipsar även igen om att plocka in min kod i ett annat program som kan highlighta koden bättre. (tex. notepad++ eller CodeBlocks) Lycka till! ... oh ... btw. Jag har lagt in ett litet fel. Den som hittar det först vinner! .. err.. bara äran är jag rädd.
Senast ändrad av Johan den ons sep 24, 2008 2:43 am, ändrad totalt 2 gånger | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 2:28 am | |
| - Kod:
-
http://Character.h//----------------- #pragma once //Underlättar kompileringen //Includes #include <iostream> #include <conio.h> #include <windows.h> #include <string> using namespace std; //Basklassen Character //Klasserna Mob,Player och NPC ärver från Character. //Man kan säga att Mob,Player och NPC är barnklasser och att Character är dess Förälderklass. //Man kan också säga att Mob,Player och NPC "är" Characters. class Character{ protected: string name; //Alla characters har ett namn public: Character(){name = "Unnamed";} //Förälderklasser kan ha konstruktorer. Men ifall barnklasserna också har det kommer den att bli överskriven. void setName(string n){name=n;} //Typisk set-metod string getName(void){return name;} //Typisk get-metod }; | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 2:29 am | |
| - Kod:
-
http://Fighter.h//----------- #pragma once //Underlättar kompileringen //Includes #include <iostream> #include <conio.h> #include <windows.h> #include <string> //Egna includes #include "Character.h" #include "globals.h" using namespace std; //Basklassen Figher //Klasserna Mob och Player ärver från Fighter. //Man kan säga att Mob och Player är barnklasser att Fighter är dess Förälderklass. //Man kan också säga att Mob och Player "är" Fighters. class Fighter{ protected: int hp; //health points public: //Alla barnklasser använder redan konstruktor från föräldern Character. //Fighter(void){} //(bortkommenterat).. Alltså, ingen konstruktor här. void setHp(int p){hp=p;} //Typisk set-metod int getHp(void){return hp;} //Typisk get-metod //Låter Fightern attackera en annan specifierad Fighter void attack(Fighter* enemy){ int damage = dice(1,500); //Slumpa fram skada int newHp = enemy->getHp()-damage; //Räkna ut fiendens nya hp enemy->setHp(newHp); //Sätt fiendens nya hp. } }; | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 2:30 am | |
| - Kod:
-
http://Mob.h//--------- #pragma once //Underlättar kompileringen //Includes #include <iostream> #include <conio.h> #include <windows.h> #include <string> //Egna includes #include "Character.h" #include "Fighter.h" #include "globals.h" using namespace std; //Klassen Mob ärver från både Character OCH Fighter. //Man kan säga att Mob är en barnklass och Character och Fighter är dess Förälderklasser. //Man kan också säga att Mob "är" en Character och "är" samtidigt en Fighter. class Mob : public Character, public Fighter{ public: Mob(void){hp = dice(100,2000);} //Har en egen konstruktor som skriver över Characters konstruktor. } | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 2:35 am | |
| - Kod:
-
http://NPC.h//-------- #pragma once //Underlättar kompileringen //Includes #include <iostream> #include <string> #include <conio.h> #include <windows.h> //Egna includes #include "Character.h" using namespace std; //Klassen NPC ärver från Character. //Man kan säga att NPC är en barnklass och Character Förälderklass. //Man kan också säga att NPC "är" en Character. class NPC : public Character{ private: string quest; public: NPC(void){name = "Unnamed NPC"; quest = "No quest";} //Har en egen konstruktor som skriver över Characters konstruktor. string getQuest(void){return quest;} //Typisk get-metod void setQuest(string q){quest=q;} //Typisk set-metod }; | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 2:36 am | |
| - Kod:
-
http://Player.h//---------- #pragma once //Underlättar kompileringen. //Includes #include <iostream> #include <conio.h> #include <windows.h> #include <string> //Egna includes #include "Character.h" #include "Fighter.h" #include "globals.h" #include "NPC.h" using namespace std; //Klassen Player ärver från både Character OCH Fighter. //Man kan säga att Player är en barnklass och Character och Fighter är dess Förälderklasser. //Man kan också säga att Player "är" en Character och "är" samtidigt en Fighter. class Player : public Character, public Fighter{ private: static const int maxQuests = 3; //staic const int är går inte att ändra. //Håller reda på hur många quests man kan ha. string questLog[maxQuests]; //Qustloggen är lika stor som maxQuests. public: Player(void); //Har en egen konstruktor som skriver över Characters konstruktor. string getQuest(int questNr); //Vanlig Get-metod void receiveQuest(NPC* questGiver); //Ta emot ett quest från en npc void deleteQuest(int questNr); //Tar bort ett specifierat quest void printQuestList(void); //Skriver ut questloggen på skärmen }; | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 2:38 am | |
| Jag återanvänder globals.h från förra uppgiften .. den var behändig. - Kod:
-
http://globals.h//----------- //ifndef och define gör det lättare att kompilera projektet om man har fler includes av denna fil #ifndef GLOBALS_H_INCLUDED #define GLOBALS_H_INCLUDED //Includes #include <time.h> //Om man skapar en onämnd namespace såhär, så kan man använda globala funktioner i alla andra filer som inkluderar "globals.h" namespace{ //Tärningsfunktionen. Returnerar en framslumpad siffra mellan min- och max-värdet. int dice(int min, int max){ int diceVal = rand() % (max - min +1) + min; return diceVal; } } #endif //#ifndef GLOBALS_H_INCLUDED | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 2:39 am | |
| - Kod:
-
http://Player.cpp//------------- //Includes #include <iostream> #include <conio.h> #include <windows.h> #include <string> //Egna includes #include "Player.h" #include "NPC.h" using namespace std; //Konstruktor Player::Player(void){ name= "Unnamed one"; hp = dice(1000,4000); //Nollställ questlog for (int i=0;i<maxQuests;i++){ questLog[i]=""; } } //GET-metod string Player::getQuest(int questNr){ return questLog[questNr]; } //Ta emot ett quest från en npc void Player::receiveQuest(NPC* questGiver){ int j=0; //Loopa igenom questLog for (int i=0;i<maxQuests;i++){ //Om en plats finns ledigt: Lägg dit npc's quest if (questLog[i]=="" || questLog[i]!=questGiver->getQuest()){ cout << "\nReceiving quest from " << questGiver->getName() <<endl; questLog[i]=questGiver->getQuest(); break; }else{ j++; } } //Om j==maxQuests har inget quest blivit ditlagt: Logen är redan full. if (j==maxQuests){ cout << "Quest log is full.\n"; } } //Tar bort ett specifierat quest void Player::deleteQuest(int questNr){ questLog[questNr]=""; } //Skriver ut questloggen på skärmen void Player::printQuestList(void){ cout << "\nQuest Log:\n"; for (int i=0;i<maxQuests;i++){ cout << "Quest " << i << ": " << questLog[i] <<endl; } } | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 2:42 am | |
| Sist men inte minst... - Kod:
-
http://main.h//---------- //Includes #include <iostream> #include <conio.h> #include <windows.h> #include <string> #include <time.h> //Egna includes #include "globals.h" #include "Character.h" #include "Fighter.h" #include "Player.h" #include "Mob.h" #include "NPC.h" using namespace std; //MAIN //------------- int main(){ srand((unsigned)time(NULL)); //Hämta en seed från klockan så att dice() funkar som den ska. //Skapa alla objekt Player me; Mob mob[3]; NPC npc[3]; //Sätt värdena på alla me.setName("Me: Apanpapan"); mob[0].setName("Mob1: Stinking Zombie"); mob[1].setName("Mob2: Rusty Robot"); mob[2].setName("Mob3: Random Critter"); npc[0].setName("NPC1: Agatha"); npc[0].setQuest("Go buy some milk."); npc[1].setName("NPC2: Gustaf"); npc[1].setQuest("Compile and debug a house code."); npc[2].setName("NPC3: Sara"); npc[2].setQuest("Save me from the monsters."); //Skriv ut dem på skärmen cout << me.getName() <<" (hp: "<<me.getHp()<<")"<< "\n\n"; for(int i=0 ; i<3; i++){ cout << mob[i].getName()<<" (hp: "<<mob[i].getHp()<<")"<<endl; } cout << endl; for(int i=0 ; i<3 ; i++){ cout << npc[i].getName()<<" (quest: "<<npc[i].getQuest()<<")"<<endl; } //Få ett quest från en NPC. int randNr= dice(0,2); //Slumpa fram ett tal 0-2 me.receiveQuest(&npc[randNr]); //skickar med den utvalda NPC's minnesadress som argument. me.printQuestList(); //Skriver ut questLog på skärm //Attackera en Mob randNr= dice(0,2); cout << "\nAttacking "<<mob[randNr].getName()<<".\n"; me.attack(&mob[randNr]); //skickar med den utvalda Mobens minnesadress som argument. cout << mob[randNr].getName()<<"'s hp: "<<mob[randNr].getHp()<<endl; //Bli attackerad av en Mob. randNr= dice(0,2); cout << "\nGetting attacked by "<<mob[randNr].getName()<<".\n"; mob[randNr].attack(&me); //skickar med Playerns minnesadress som argument. cout << "My hp: "<<me.getHp()<<endl; getch(); return 0; } | |
|
| |
eliasandersen
Antal inlägg : 5 Registreringsdatum : 08-09-01 Ålder : 33
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 1:25 pm | |
| du har missat ett semikolon i slutet av mob klassen | |
|
| |
Cloudia
Antal inlägg : 93 Registreringsdatum : 08-08-29 Ålder : 35 Ort : Tyresö -> Evigheten!
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 3:07 pm | |
| Someone did their homework... | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons sep 24, 2008 11:11 pm | |
| eliasandersen vinner äran! | |
|
| |
mjaoo
Antal inlägg : 27 Registreringsdatum : 08-09-06 Ort : Mjau?
| Rubrik: Sv: Uppg4 – Arv sön sep 28, 2008 6:29 pm | |
| NOTERA MÄNNISKOR. Du kan inte använda ett pekarobjekt som kallar på en pekarfunktion, te x void kaka(npc * ätfisk) ngt whatevah. findus->kaka(&misse) = FEL findus.kaka(&misse) = RÄTT Om du kör med en pekare(din gubbe som e pekare elr ngt) så pekar den dubbelt och du får ett felmeddelande! så kör utan pekare helst om du har pekarfunktioner. Det lärde jag mej idag iaf ^^ | |
|
| |
HenkaN
Antal inlägg : 42 Registreringsdatum : 08-09-03 Ålder : 33 Ort : Mälarhöjden
| Rubrik: Sv: Uppg4 – Arv mån sep 29, 2008 11:40 am | |
| Tror nog att det ska vara main.cpp istället för main.h | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons okt 01, 2008 1:24 am | |
| Stämmer HenkaN. Det ska vara main.cpp. Inte main.h. Du har hittat ett fel som jag inte lagt dit med flit .. äran går även till dig. | |
|
| |
Becca
Antal inlägg : 10 Registreringsdatum : 08-09-01
| Rubrik: Sv: Uppg4 – Arv mån okt 06, 2008 12:40 pm | |
| BUGG! i recieveQuest-funktionen i Player.cpp finns den här if satsen: for (int i=0;i<maxQuests;i++){ if (questLog[i] == "" || questLog[i] != questGiver->getQuest()){ (...) } } Ta ett exempel att du först får en quest från npc[0]. i =0 questLog[0] = "" Då kommer platsen questLog[0] = npc[0]->getQuest() När du sedan får en quest av npc[1]: kommer questlog[0] fortfarande vara questen du fick från npc[0], och eftersom questlog[0] != den nya questgiverns quest kommer den första questen skrivas över av den andra questen. Så här har jag skrivit istället: - Kod:
-
void Player::recieveQuest(NPC* questGiver){ int j = 0 //loopar igenom questloggen for (int i=0;i<maxQuests;i++){ //om det finns plats i plats 1 i questloggen eller questen på den platsen inte är if (questLog[i] == ""){ cout << "\n Recieving quest from " << questGiver->getName() << endl; questLog[i] = questGiver->getQuest(); break; }//if-satsen else if(questLog[i] == questGiver->getQuest()){ cout << "\n You already have this quest." << endl; break; } else{//om platsen var full, ökas j(antalet quests i questloggen) med 1 j++; }//else-satsen }//forloopen }//recievequest | |
|
| |
Becca
Antal inlägg : 10 Registreringsdatum : 08-09-01
| Rubrik: Compile Error mån okt 06, 2008 9:21 pm | |
| Jag får ett väldigt konstigt kompileringsfel i min arvskod, det står så här:
Fil(som den skapade själv):C:\Program\CodeBlocks\MinGW\bin\..\lib\gcc\mingw32\3.4.5\..\..\..\..\include\c++\3.4.5\bits\basic_string.h
Line: 2313
Message: note: candidates are: std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>]|
Någon som kan komma på vad det kan vara? | |
|
| |
Becca
Antal inlägg : 10 Registreringsdatum : 08-09-01
| Rubrik: Sv: Uppg4 – Arv ons okt 08, 2008 10:45 am | |
| Felet var att jag inte hade skrivit getline funktioner korrekt.
P.s. om du har blandat getline och vanliga cin när du vill ha in en string, så kommer den att loopa två gånger. Använd endast getline istället, då du kan ta in hela meningar.
getline(cin, variabel); | |
|
| |
Johan
Antal inlägg : 47 Registreringsdatum : 08-09-03
| Rubrik: Sv: Uppg4 – Arv ons okt 08, 2008 3:23 pm | |
| Bra jobbat! Detta här är en typisk bugg. Min recieveQuest –funktion är inte riktigt bra. Ifall man får ett quest från samma questgivare fler gånger så kommer questet ändå att skrivas dit till loggen i alla fall. Din kod fungerar bättre. Äran går även till Becca! | |
|
| |
Sponsored content
| Rubrik: Sv: Uppg4 – Arv | |
| |
|
| |
| Uppg4 – Arv | |
|