Die HP des ersten Spielers gibt es übrigens auch erst nach dessen Instanzierung, die hast du auch nicht davor.
Forum
Off Topic Pommes GamesDie HP des ersten Spielers gibt es übrigens auch erst nach dessen Instanzierung, die hast du auch nicht davor.
1
minigun(int HP);
1
minigun(int HP, int KP);
ICH BIN DUMM!! Die HP und KP Werte werden ja dann in der Funktion main() erst übergeben!!
(Wer ist dümmer als PDF??? ICH!! )
Muss das gleich mal ausprobieren (unter Linux => Neustart )
Soll so ausgucke:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class player { ... public: int GetHP() {return itsHP; }; void SetHP(int newHP) {itsHP = newHP; }; private: minigun(int oldHP, int oldKP) { int temp = GetHP() - 232323; SetHP(temp); temp = GetKP() - 12121232; SetKP(temp); } int itsHP; ...} main() { player.player1; player.player2; minigun(player1.GetHP(), player2.GetHP); ...}
Nein, mach die Waffen als Funktionen ohne Klassen oder als eigene Klassen, etwa so:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Weapon { private: int damage = 0; public void Shoot(Player *p) { int hp = p->getHP(); hp-=this->damage; p->setHP(hp); } } class Minigun : public Weapon { public: Minigun() { this->damage=50; } }
Entsprechende Erweiterungen sind machbar.
Das ist zwar alles etwas overheap, aber so lernt man OOP am besten...
Außerdem versteh ichs net . So wie´s für mich aussieht machst du class Minigun als Unterklasse von weapon? Ist das nicht irgendiwie was mit Vererbung ?? Das weiß ich noc nicht, wei man das macht.
Java sähe etwas anders aus.
Und ja, das ist vererbung (Minigun ist eine Kindklasse von Weapon)
Mach dich mal drüber schlau, das hier ist noch ein recht einfaches Beispiel
Vererbung ist eine wichtige Sache in OOP...
Pommes has written
So wie´s für mich aussieht machst du class Minigun als Unterklasse von weapon? Ist das nicht irgendiwie was mit Vererbung cheeky tongue ?? Das weiß ich noc nicht, wei man das macht.
Ja, die Minigun ist eine vererbte Klasse von Weapon. Und dass du nicht weißt, wie man sowas macht, ist kein Argument.
Hab jetzt vor, das Prog komplett von vorne zu machen. Bei dem gewurschtel, dass ich in der letzten Stunde fabriziert hab blickt keine Sau mehr durch .
Wie ich vermute sind auch Zeiger drinnen?? "this -> ". Kann ich auch noch nicht . Ich glaube, das projekt leg ich dich lieber mal auf Eis und fang dann später nochmal an .
Pommes has written
Wie ich vermute sind auch Zeiger drinnen?? "this -> ". Kann ich auch noch nicht wink . Ich glaube, das projekt leg ich dich lieber mal auf Eis und fang dann später nochmal an wink .
Öhm...das ist wirklich Grundwissen
Ohne das wirst du nicht viel Erfolg haben, OOP hin oder her. Kümmer dich erstmal um Zeiger und Speicherverwaltung und das ganze Gedöhns, bevor du irgendwas anderes machst. Da fehlt dir wirklich ein wichtiges Stück Verständnis zum Lowlevelprogrammieren.
@Pommes: Entgegen der Obigen Zeile gebe ich HW aber vollkommen recht. Geh erstmal eine Stufe runter und schreib reines C .
Allein die ganze Zeigerarithmetik ist stoff für ein ganzes Schuljahr
EDIT: Das grundlegene über Zeiger hab ich jetzt . Ich wollt nur fragen, weil man mit Zeigern ja im Speicher alles mögliche anstellen kann (z.B. mit Zeigern mit zufälliger Adressse (vergessen, ne explizite Adresse zuzuweisen ) irgendwo was rumschreiben...), ob man damit auch sein Betriebsystem schrotten kann. Und damit mein ich, dass nichts mehr zu retten ist !!! Ich frag aus reinem Interesse versteht sich .
edited 1×, last 19.05.07 08:41:48 pm
Zweitens: Du bearbeitest ja nur den RAM, allerdings kann ich keine Garantie dafür geben, dass man tatsächlich irgendwie ausführbaren Code erzeugt und dann ausführt
Keine Ahnung, ob das geht, ist aber sehr unwahrscheinlich.
"Möglich ist immer alles" .
Ich will´s aber jetzt nicht ausprobieren
Dicker has written
Keine Ahnung, ob das geht, ist aber sehr unwahrscheinlich.
Bei speicherschutzlosen Betriebssystemen geht das; aber dass man etwas gescheites/gefährliches damit anstellt, ist unwahrscheinlich, solange man nicht gezielt irgendwas verändert. Da wird man aber wohl eher andere Programme manipulieren wollen, inwieweit man das Betriebssystem beeinflussen kann, weiß ich nicht und es hängt wohl auch vom jeweiligen OS ab.
Bei modernen Betriebssystemen braucht man sich da jedenfalls keine Sorgen machen, wenn man da irgendwas zerschießt, dann höchstens das eigene Programm. Unter Linux/Unix kriegt man bei einer Speicherzugriffsverletzung einen Segmantation fault und das Prog wird abgekillt; was unter Windows passiert weiß ich nicht (ich tippe mal auf Bluescreen bei älteren Windowsversionen), ebenso bei MacOS.
Dann muss ich mir da mal keine Sorgen machen .
EDIT: Wenn ich ner Funktion eine Variable (lokal, also in main() erstellt) übergebe, dann macht die Funktion ja ne kopie von dieser. Wie ist das bei Zeigern? Wird da auch ne kopie von dem gemacht?
edited 1×, last 20.05.07 10:29:46 am
Bei Funktionsaufrufen werden grundsätzlich immer alle Parameter kopiert. Das ist auch einer der Gründe warum es Zeiger gibt. Erstens um die Parameter auch außerhalb der aufgerufenen Funktion verändern zu können, und zweitens um die übergebenen Parameter klein zu halten (ein Zeiger ist für gewöhnlich so groß wie ein Int [also 4 Byte bei einem 32 Bit System], die Größe einer Klasse oder Struktur kann dagegen ein Vielfaches davon betragen, je nach Inhalt. Mit einem Zeiger auf eine Struktur/Klasse kann man sich also einiges an Geschwindigkeit ersparen)
Hier der ausschnitt (die cout teile waren nur zur Kontrolle, ob das Teil überhaupt funzt):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream> using namespace std; void minigun(int &KP, int &HP); main() { 	int player1HP = 100, player1KP = 35; 	int player2HP = 100, player2KP = 35; 	cout << "Vor minigun():\n" 	<< "Player1 HP: " << player1HP << "\tPlayer1 KP: " << player1KP << endl 	<< "player2 HP: " << player2HP << "\tPlayer2 KP: " << player1KP << endl; 	minigun(player1KP, player2HP); 	cout << "Nach minigun():\n" 	<< "Player1 HP: " << player1HP << "\tPlayer1 KP: " << player1KP << endl 	<< "player2 HP: " << player2HP << "\tPlayer2 KP: " << player2KP << endl; } void minigun(int &KP, int &HP) { 	cout << "In minigun():\n"; 	KP -= 3; 	HP -= 12; 	cout << "Player1 KP: " << KP << endl 	<< "player2 HP: " << HP << endl; }
Aber wenn C ein Subset von C++ ist müsste das so gehen:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream> using namespace std; void minigun(int [b]*[/b]KP, int [b]*[/b]HP); main() { 	int player1HP = 100, player1KP = 35; 	int player2HP = 100, player2KP = 35; 	cout << "Vor minigun():\n" 	<< "Player1 HP: " << player1HP << "\tPlayer1 KP: " << player1KP << endl 	<< "player2 HP: " << player2HP << "\tPlayer2 KP: " << player1KP << endl; 	minigun([b]&[/b]player1KP, [b]&[/b]player2HP); 	cout << "Nach minigun():\n" 	<< "Player1 HP: " << player1HP << "\tPlayer1 KP: " << player1KP << endl 	<< "player2 HP: " << player2HP << "\tPlayer2 KP: " << player2KP << endl; } void minigun(int [b]*[/b]KP, int [b]*[/b]HP) { 	cout << "In minigun():\n"; 	KP -= 3; 	HP -= 12; 	cout << "Player1 KP: " << KP << endl 	<< "player2 HP: " << HP << endl; }
So würde das in C funzen (mal von den couts abgesehen)
Meine änderungen sind fett hervorgehoben.