Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

11

25.04.2007, 21:38

Zur Fehlerbehebung mit Zahlen wär eine Möglichkeit:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
std::string tmp;
//...

int num=0;
while (! std::cin >> num)
{
  // Fehler

  std::cin.clear();
  std::cin >> tmp;
}
// num verwenden


Bin grad nich 100% sicher, ob ich alles beachtet hab, müsste aber eigentlich gehen

12

25.04.2007, 22:00

C-/C++-Quelltext

1
2
3
4
5
6
7
cin>>iTarget;
    while (!cin >> iTarget) 
    { 
        // Fehler 

        cin.clear(); 
        cin >> tmp; 
    }

so siehts etz aus und funktioniert anscheinend. was genau macht das denn?

solange cin keine zahl ist füllt er es mit nem string? oder was tut das? :P

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

13

26.04.2007, 00:53

Was soll das cin >> iTarget vor der Schleife denn sein? das funktioniert zwar, wenn man nen Fehler produziert, aber bei korrekten Eingaben sollte das cin vor der Schleife weg...
Was in der Schleife passiert:

1. Der >> operator versucht, die Nutzereingabe in ein int zu speichern, wenn das fehlschlägt setzt er ein Fehlerflag in cin. Am Ende wird in jedem Fall cin zurückgegeben.
2. Der ! Operator testet, ob das zurückgegebene cin-objekt Fehlerflags gesetzt hat, wenn ja liefert er true zurück. D.h. wenn ein Fehler gesetzt ist betritt das Prog die Schleife, wenn kein Fehler gesetzt ist läuft das Prog mit dem eingespeicherten int nach der Schleife weiter
3. In der Schleife: Normalerweise schlägt cin >> fehl, wenn Eingabe und Speicherobjekt nicht zusammenpassen, ein String passt eigentlich immer. Deshalb werden die Flags per clear() gelöscht (mit gesetztem Fehlerflag geht nix) und die falsche Eingabe wird im String gespeichert, dannach wird erneut versucht, eine korrekte Eingabe zu erhalten (neuer Schleifendurchlauf)

14

26.04.2007, 08:49

wenn ich das cin vor der schleife weglasse, konnte ich gestern gar nix eingeben :D war iTarget mit 0 initialisiert kam ne endlosschleife von:

Fehler in der Eingabe!

wurde es mit 1 initialisiert kam ne endlosschleife von:

"Gegner1" wird angegriffen!


aber ich test das heut nachmittags dann nochmal :)
mit meiner variante ,die ich hier gepostet habe funktionierte es auf jedenfall oO :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

26.04.2007, 10:02

Das ganz kannst du über getline und einen stringstream ganz schön lösen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int x;
    std::stringstream cnv;
    std::string line;

    do
    {
        std::cout << "Wert eingeben: ";

        std::getline( std::cin, line );

        cnv.clear();
        cnv.str( line );
        cnv >> x;
    } while ( !cnv );
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

16

26.04.2007, 16:19

David_pb

Ich sehe nicht, wo der Vorteil darin liegen soll, einen extra Stringstream zu nutzen wenn man eigentlich das gleiche direkt mit cin machen kann...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

17

26.04.2007, 17:01

Das Problem bei der direkten Version sind irgendwelche Reste im Streambuffer die dann seltsame Verhalten mit sich bringen. Mit getline hat sich das Problem gegessen da hierbei niemals irgendwelche Probleme dieser Art auftreten können.
@D13_Dreinig

18

26.04.2007, 20:30

hm irgendwie wärs kewl, wenn während der hero attacke ausführen kann, dass die gegner trotzdem cd reduziert krign und angreifen können.

das ganze würde jetzt wieder mit getasynckeystate gehn, aber irgendwie, muss man ja dann exakt, wann der hero die attacke starten kann nen knopf drücken :(

gäbs da vl irgendwie ne möglichkeit, dass man kA 2-3sekunden zeit hat seine eingabe zu treffen, danach wird vom hero eine "warterunde" ausgeführt? oder der hero geht von selbst in verteidigungsstellung bis der cd wieder fertig ist, das wär auch egal. wichtig wärs ne zeitbegrenzte eingabe :D

gibts da vernünftige lösungswege?

btw sry, werds mit den pots und spells noch ned hinbekommen , muss mehr für uni tun als gedacht:d und bin weekend am gardasee^^

aber nächste woche kommt dann mit großer wahrscheinlichkeit ne bessere version raus :)

19

14.05.2007, 20:08

der doppelpost sei mir gestattet:)

also hallo mal wieder:D das projekt ist natürlich nicht gestorben und für die zauber hab ich imo ein gutes system "entwickelt" mit 2 klassen:

klasse CSpells: was die grundgerüste für zauber beinhaltet
klasse CBuff : was zauberverstärker beinhaltet (wie z.b. vergiftet sein über mehrere runden etc.)

es gibt eben nur ein prob. anscheinend hab ich irgendwo nen grundfehler drin, bei der koordinatenberechnung oder so. ich kanns mir einfach ned erklären, aber wenn sich der held von der dritten karte zur zweiten zurückbeamt, landet er nicht beim "ausgang" sondern einige zellen daneben. ebenso wenn man von der vierten zur dritten karte retourgeht.

das verwunderlich ist nur, dass es zwischen erster und zweiter karte perfekt funktioniert. egal wie ich mich bewege und was ich mache, er berechnet die startposition bei der neugeladenen karte richtig.

woran das leigt,dass es ab der dritten karte nicht mehr richtige geht: kA. hab mir die wichtigen codestellen schon 50x durchgelesen und herummodifiziert (unter anderem auch den quellcode gekürzt^^ weil ich unnötige passagen drinhatte). aber alles hilft nichts.

also sry,dass das solange dauert, aber wenn das ned hinhaut, will ichs keine neue version veröffentlichen^^


wollts nur mitgeteilt haben zur info :)

mfg
Simon

Werbeanzeige