| Autor |
Nachricht |
Namenloser324
Unregistrierter
|
Namenloser324 Unregistrierter
11:50:57 23.04.2012 Titel: |
|
Zitieren |
Hi, also ich glaube die Diceklasse kannst du auch einfach als Memberfunktion implementieren, vielleicht auch als static member funktion, dann kannst du sie auch unabhängig von einem Objekt benutzen.
Ist ne Designfrage ob du jetzt unbedingt in einer Monsterklasse eine Dicefunktion brauchst/haben möchtest, aber irgendwie empfinde ich es als Overkill für ein einfaches Würfeln eine Klasse zu erstellen.
Nimm vielleicht sowas:
class Monster
{
[...]
static int roll(int WuerfelAugen = 20)
{
blablabla
}
};
Ok, eigentlich unsinnig, daher besser:
Erstell ne Klasse Spiel oder ähnliches die eben diese rollmethode dann besitzt.
Bei deiner Kampffrage bin ich mir unsicher wie du das meinst:
Könntest z.B. eine Kampfmethode erstellen in der Klasse Monster:
class Monster
{
[..]
bool Kampf(Monster Gegner)
{
Dice W20(20);
while(min(this->Leben,Gegner.Leben)>0)
{
[...]//dein Kampfskript
}
}
} |
|
|
|
 |
nimda4
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
|
nimda4 Mitglied
12:23:58 23.04.2012 Titel: |
Antwort |
Zitieren |
So nun meine Antwort auf beide Themen:
Ich werde die Kampffunktion in der Klasse Monster machen.
Die funktioniert ja (wie du auch im Code den ich dir per Mail gegeben habe) folgender massen:
kampfmethode.
| Code: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | Objekt Oger Klasse Monster.
Objekt Mensch Klasse Monster.
Objekt W20 Klasse dices.
Oger wirft W20
if(W20 <=Angriff Oger)
{
Mensch muss sich verteidigen, wirft W20;
if(W20>=Verteidigung Mensch) //kann schalg nicht parieren
{
der schlag trifft den menschen, Leben Mensch - Schaden Oger;
}
pariert schlag des ogers;
Mensch greifft an , W20;
if(W20<=Angriff Mensch)
{
Oger muss sich verteidigen, wirft W20;
if(W20>=Verteidigung Oger) //kann schalg nicht parieren
{
der schlag trifft den Oger, Leben Oger - Schaden Mensch;
}
pariert schlag des Menschen;
} | |
Im Main möchte ich wenn eien Kampf stat findet das so machen:
Ich (Mensch muss kämpfen) mein gegner ist X (Oger,troll oder was auch immer, wird mit Monster X; erstellt)
Es soll nun die Methode Kampf ausführen und automatisch die Werte des vorher erstellten Gegners übernehmen.
Ich weiss wie ich den Kampf machen will jedoch weiss ich nciht wie es dei Werte übernehmen kann :S
Ich hoffe man versteht was ich meine?
Oder rede ich nach zu vielem Herumprobieren nur noch wirres Zeug? xD
Gruss und Danke an alle
Nimda4 |
|
|
|
 |
Namenloser324
Unregistrierter
|
Namenloser324 Unregistrierter
12:27:29 23.04.2012 Titel: |
|
Zitieren |
Die Werte werden doch automatisch kopiert, wenn du den Gegner via call by value an die Kampfmethode übergibst. |
|
|
|
 |
nimda4
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
|
nimda4 Mitglied
13:04:04 23.04.2012 Titel: |
|
Zitieren |
| Namenloser324 schrieb: | | Die Werte werden doch automatisch kopiert, wenn du den Gegner via call by value an die Kampfmethode übergibst. |
Hmmm ich verstehe nicht wie genau das gehen soll :S
Ist das so gemeint?:
| Code: | | void kampffunktion(Mensch,Monster1) | | |
|
|
|
 |
Namenloser324
Unregistrierter
|
Namenloser324 Unregistrierter
14:49:16 23.04.2012 Titel: |
|
Zitieren |
Äh, jetzt vermischt du aufruf und definition der Funktion.
Also:
Wenn du deine Funktion wie folgt definierst:
| C++: | | void kampf(Mensch Spieler,Monster Gegner) | |
Dann sagst du damit dem Compiler das beim Aufruf der Funktion die Parameter als Kopie übergeben werden,d.h. es werden in der Funktion nur Kopien mit exakt dem gleichen Inhalt verwendet(streng genommen heißt das, dass der Kopierkonstruktor der Klasse aufgerufen wird). |
|
|
|
 |
Namenloser324
Unregistrierter
|
Namenloser324 Unregistrierter
14:50:39 23.04.2012 Titel: |
|
Zitieren |
Achso und wenn du mehrere Gegner verwenden möchtest änderst du einfach die Funktion zu:
| C++: | | void Kampf(Mensch Spieler,std::vector<Monster> Gegner) | |
und in der Funktion verwendest du dann eine Schleife die durch alle Gegner durchläuft. Im Grenzfall mit nur einem Gegner funktioniert es dann identisch zum sonstigen Fall. |
|
|
|
 |
nimda4
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
|
nimda4 Mitglied
08:16:45 24.04.2012 Titel: |
|
Zitieren |
| Namenloser324 schrieb: | Achso und wenn du mehrere Gegner verwenden möchtest änderst du einfach die Funktion zu:
| C++: | | void Kampf(Mensch Spieler,std::vector<Monster> Gegner) | |
und in der Funktion verwendest du dann eine Schleife die durch alle Gegner durchläuft. Im Grenzfall mit nur einem Gegner funktioniert es dann identisch zum sonstigen Fall. |
Danke werde ich sofort versuchen zu testen
Gruss
Nimda4 |
|
|
|
 |
nimda4
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
|
nimda4 Mitglied
10:06:08 25.04.2012 Titel: |
Frage |
Zitieren |
Hab das mit deinem Code getestet funktioniert zwar noch ncith werde aber noch einwenig mich im Internet schlau machen und weiter versuchen bevor ich weider nachfrage
Habe aber noch eine Frage bezüglich Seite 1 dieses Thema mti dem Code für den Waffen Einkauf ich hab das jetzt mal nach gebildet und es sieht wie folgt aus:
| C++: | 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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | [code]
#include <stdio.h>
#include <tchar.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
class Waffe
{
public:
Waffe(string CName,string CDmg,string CKosten){Name = CName;Dmg = CDmg;Kosten=CKosten;}
string Name,Dmg,Kosten;
};
class Waffenliste
{
public:
void add(Waffe item)
{
Liste.push_back(item);
}
vector<Waffe> Liste;
};
int main()
{
string Geld;
int Geld_2=100;
Waffenliste liste;
ifstream file("waffe.txt");
if(file.good())
{
while(!file.eof())
{
vector<string> zeile;
string line;
getline(file,line);
do
{
//generiert Substring und fügt den gleich dem vektor hinzu
zeile.push_back(line.substr(0,line.find(" ")));
//wenn danach noch ein leerzeichen kommt löscht er bis zu diesem sonst alles
if(line.find(" ")!= string::npos)
line.erase(0,line.find(" ")+1);
else
line.erase();
}
while(!line.empty());
liste.add(Waffe(zeile[0],zeile[1],zeile[2]));
}
}
file.close();
for(unsigned int i = 0 ; i<liste.Liste.size();i++)
cout << "Name: " << liste.Liste[i].Name << "(Dmg " << liste.Liste[i].Dmg << ",Kosten " << liste.Liste[i].Kosten << ")" << endl;
cout <<"eingeben\n";
int x;
cin >>x;
Geld=liste.Liste[x].Kosten;
int value = atoi(Geld.c_str());
Geld_2=Geld_2-value;
cout <<Geld_2;
cout << "Waffe " << liste.Liste[x].Name << "gekauft" << endl;
system("pause");
} | | [/code]
Jedoch wenn ich 2 Eingebe stürzt das Programm ab, weil (wie ich herausgefunden habe) es gar kein 2 gibt.
Ich habe zwar 2 Waffen in der Liste jedoch lisst es nur die 2te ein.
waffe.txt
| Code: | Dolch 20 50
Schwert 60 200 | |
Ausgabe wenn ich 1 Drücke:
"-200Waffe Schwertgekauft"
Ausgabe bei 2 oder höhere Zahl(bei höherer Zahl ist es ja klar):
"Debug Assertion failed
.
.
.
"
Abort Retry Ignor
Weiss jemand wiso es das Erste nicht einliesst?
Gruss
Nimda4 |
|
|
|
 |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1782
|
Belli Mitglied
10:24:12 25.04.2012 Titel: |
Re: Frage |
Zitieren |
| nimda4 schrieb: |
Ich habe zwar 2 Waffen in der Liste jedoch lisst es nur die 2te ein. |
Deine 'Liste' ist keine Liste, sondern ein Vektor. Und wenn der zwei Einträge hat, dann haben diese die Indizes 0 und 1. |
|
|
|
 |
nimda4
Mitglied
Benutzerprofil
Anmeldungsdatum: 19.04.2012
Beiträge: 25
|
nimda4 Mitglied
10:29:23 25.04.2012 Titel: |
Re: Frage |
Zitieren |
[/code]| Belli schrieb: | | nimda4 schrieb: |
Ich habe zwar 2 Waffen in der Liste jedoch lisst es nur die 2te ein. |
Deine 'Liste' ist keine Liste, sondern ein Vektor. Und wenn der zwei Einträge hat, dann haben diese die Indizes 0 und 1. |
Hab ich gerade auch festgestellt und wollte es posten da sah ich deinen Post xD
Ich danke dir trotzdem
Ich habe noch eine Frage.
Wie kann ich bei folgender Funktion dafür Sorgen das die Abstände die ich mit <<" " gemacht habe automatisch erstellen alssen je nach dem wie lang der string ist?
| C++: | 1 2 3 4 5 6 7 8 9 10 11 | [code]
for(unsigned int i = 0 ; i<liste.Liste.size();i++)
cout << i <<" " << liste.Liste[i].Name <<" " << liste.Liste[i].Dmg <<" " << liste.Liste[i].Kosten << endl;
cout <<"eingeben\n";
int x;
cin >>x;
Geld=liste.Liste[x].Kosten;
int value = atoi(Geld.c_str());
Geld_2=Geld_2-value;
cout <<Geld_2;
cout << "Waffe " << liste.Liste[x].Name << "gekauft" << endl; | | [/code]
Ich habe mri überlegt ob es so geht:
String maximal länge.
Teilen in 4 Teile je nach dem wie Lang z.b der Name ist (die 4 Kategorienen).
Gruss
Nimda4 |
Zuletzt bearbeitet von nimda4 am 10:45:46 25.04.2012, insgesamt 1-mal bearbeitet |
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|