| Autor |
Beitrag |
WormHole
      
Beiträge: 145
|
Verfasst: Sa 13.08.05 21:53
Hallo, da bin ich wieder...
Also, ich tüfftel hier gerade an meinem Proc rum aber werd nicht daraus schlau warum es das macht was es macht ^^ Hört sich sche**** an, ist aber bestimmt leicht zu lösen (für euch^^):
Also, ich habe einen Timer der ne andere Prozedur aufruft:
Delphi-Quelltext 1: 2: 3: 4:
| procedure TKampfscript.Timer1Timer(Sender: TObject); begin angreifen; end; |
Diese Prozedur wird dabei aufgerufen:
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:
| procedure TKampfscript.angreifen; begin wurf_sp2:=random(20)+1; wurf_sp1:=random(20)+1; Logbuch.Lines.Add('Runde '+inttostr(runde));
if angreifer=1 then begin if wurf_sp1<=treffer_sp1 then begin Logbuch.Lines.Add('Angreifer greift an...'); if wurf_sp2<=parade_sp2 then begin Logbuch.Lines.Add('Der Verteidiger pariert'); end else begin Logbuch.Lines.Add('Der Angreifer macht ' + inttostr(schaden_sp1) + ' Schaden'); leben_sp2:=leben_sp2-schaden_sp1; end; end; end;
if angreifer=2 then begin if wurf_sp2<=treffer_sp2 then begin Logbuch.Lines.Add('Der Verteidiger greift an...'); if wurf_sp1<=parade_sp1 then begin Logbuch.Lines.Add('Der Angreifer pariert'); end else begin Logbuch.Lines.Add('Der Verteidiger macht ' + inttostr(schaden_sp2) + ' Schaden'); leben_sp1:=leben_sp1-schaden_sp2; end; end; end;
if angreifer=1 then angreifer:=2 else angreifer:=1;
runde:=runde+1; werte_anzeigen; end; |
Total unlogisch ist dann, dass mir mein Memo folgende Aufzeichnungen macht:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Runde 6 Angreifer greift an... Der Verteidiger pariert Runde 7 Der Verteidiger greift an... // VERTEIDIGER DRAN Der Verteidiger macht 6 Schaden Runde 8 //eine RUNDE WIRD ÜBERSPRUNGEN (Angreifer dran) Runde 9 Der Verteidiger greift an... // VERTEIDIGER DRAN Der Verteidiger macht 6 Schaden |
Das kann manchmal auch in der ersten Runde sein, manchmal in der dritten, also total random...  *grübel*
WARUM NUR?
Danke für Antworten! Moderiert von raziel: Topic aus VCL (Visual Component Library) verschoben am So 14.08.2005 um 07:43
|
|
LigH
      
Beiträge: 239
Win98SE, Win2000SP4
D7
|
Verfasst: Sa 13.08.05 22:05
Wie häufig kommt denn der Timer zum Zug? Schneller, als "angreifen" fertig wird?
__
Und übrigens, Kleinigkeit:
Delphi-Quelltext 1:
| if angreifer=1 then angreifer:=2 else angreifer:=1; |
Wenn es immer nur genau zwei Parteien sein werden:
a) Warum nicht Boolean?
oder
b) angreifer := 3 - angreifer;
|
|
Raphael O.
      
Beiträge: 1596
VS 2013
|
Verfasst: Sa 13.08.05 22:12
WormHole hat folgendes geschrieben: | Hallo, da bin ich wieder...
Also, ich tüfftel hier gerade an meinem Proc rum aber werd nicht daraus schlau warum es das macht was es macht ^^ Hört sich sche**** an, ist aber bestimmt leicht zu lösen (für euch^^):
Diese Prozedur wird dabei aufgerufen:
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:
| procedure TKampfscript.angreifen; begin wurf_sp2:=random(20)+1; wurf_sp1:=random(20)+1; Logbuch.Lines.Add('Runde '+inttostr(runde)); if angreifer=1 then begin if wurf_sp1<=treffer_sp1 then begin Logbuch.Lines.Add('Angreifer greift an...'); if wurf_sp2<=parade_sp2 then begin Logbuch.Lines.Add('Der Verteidiger pariert'); end else begin Logbuch.Lines.Add('Der Angreifer macht ' + inttostr(schaden_sp1) + ' Schaden'); leben_sp2:=leben_sp2-schaden_sp1; end; end; end;
if angreifer=2 then begin if wurf_sp2<=treffer_sp2 then begin Logbuch.Lines.Add('Der Verteidiger greift an...'); if wurf_sp1<=parade_sp1 then begin Logbuch.Lines.Add('Der Angreifer pariert'); end else begin Logbuch.Lines.Add('Der Verteidiger macht ' + inttostr(schaden_sp2) + ' Schaden'); leben_sp1:=leben_sp1-schaden_sp2; end; end; end; |
|
ich weiß nicht, was sein soll, wenn treffer > wurf ist, aber wenn dann trotzdem X greift an dastehen soll muss das entsprechende Showmessage vor die Bedingung oder eben einen entsprechenden else-Teil formulieren..
hoffe das war irgendwie verständlich, sonst nochmal nachfragen 
|
|
WormHole 
      
Beiträge: 145
|
Verfasst: So 14.08.05 07:25
Also, wurf_sp1 ist ein Random Wurf....
BeispieL:
Spieler 1 würfelt: 9
Spieler 1 guckt was seine Fähigkeit in treffen ist! Ah es ist 11.
Wenn Würfel_sp1 <= seine Fähigkeit ist, dann trifft er!
Und ich habe den Timer schon auf 5 sec gestellt.... Kommt trotzdem noch...^^
Und Fiji-Fighter, kannst du das bidde nochmal erklären...?!?
greetz
|
|
LigH
      
Beiträge: 239
Win98SE, Win2000SP4
D7
|
Verfasst: So 14.08.05 07:58
Fiji-Fighter meint:
- "Runde" kommt immer.
- "Angreifer" greift nur an, wenn "wurf_sp1 <= treffer_sp1" - nicht immer.
- "Verteidiger" greift nur an, wenn "wurf_sp2 <= treffer_sp2" - nicht immer.
Das bedeutet: Es kann Runden geben, in denen sowohl "Angreifer" als auch "Verteidiger" nicht angreifen - nämlich dann, wenn sowohl "wurf_sp1 > treffer_sp1", als auch "wurf_sp2 > treffer_sp2", im Zufallsgenerator erwürfelt wurde.
|
|
WormHole 
      
Beiträge: 145
|
Verfasst: So 14.08.05 19:29
Ah jetzt hab ichs versttanden.....
Neue Frage:
Da der Kampf ja nach dem SChema abläuft:
sp1 attackiert
sp2 attackiert
nächste runde
sp2 attackiert
sp1 attackiert
muss ich die attacken nacheinander ausführen... also hier die sp1 attacke procedure:
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:
| if angreifer=1 then begin if wurf_sp1<=treffer_sp1 then begin Logbuch.Lines.Add('Angreifer greift an...'); if wurf_sp2<=parade_sp2 then begin Logbuch.Lines.Add('Der Verteidiger pariert'); end else begin Logbuch.Lines.Add('Der Angreifer macht ' + inttostr(schaden_sp1) + ' Schaden'); leben_sp2:=leben_sp2-schaden_sp1; end; end; end; if wurf_sp1>treffer_sp1 then Logbuch.Lines.Add('Der Angreifer haut ins Leere');
if angreifer=1 then angreifer:=2; if angreifer=2 then begin if wurf_sp2<=treffer_sp2 then begin Logbuch.Lines.Add('Der Verteidiger greift an...'); if wurf_sp1<=parade_sp1 then begin Logbuch.Lines.Add('Der Angreifer pariert'); end else begin Logbuch.Lines.Add('Der Verteidiger macht ' + inttostr(schaden_sp2) + ' Schaden'); leben_sp1:=leben_sp1-schaden_sp2; end; end; end; if wurf_sp2>treffer_sp2 then Logbuch.Lines.Add('Der Verteidiger haut ins Leere');
|
Danach wird die sp2 procedure ausgeführt... kein problem, nur wenn der sp2 als erstes dran ist, dann ist die sp1 procedure ja über der sp2 procedure und ich kann die nicht mehr mit
if angreifer=2 then angreifer:=1
ausführen, und das würde dann sowieso in einer endlosschleife enden.... Wie kann ich das Problem lösen?
|
|
LigH
      
Beiträge: 239
Win98SE, Win2000SP4
D7
|
Verfasst: So 14.08.05 21:08
Ich verstehe immer noch nicht wirklich, was du willst: Bisher rate ich mal, du möchtest, dass zufällig mal erst Angreifer und dann Verteidiger, und mal erst Verteidiger und dann Angreifer, zuschlagen - aber immer beide. Soweit richtig?
Wie wäre es dann mit folgendendem Vorschlag:
- zwei untergeordnete Prozeduren (AngreiferSchlaegt, VerteidigerSchlaegt)
- eine Boolean-Variable, mit der festgelegt wird, wer zuerst zuschlägt.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| var AngreiferZuerst: Boolean;
if AngreiferZuerst then begin AngreiferSchlaegt; VerteidigerSchlaegt; end else begin VerteidigerSchlaegt; AngreiferSchlaegt; end; |
Schon ist das ganze übersichtlicher.
__
Divide et impera. / Teile und herrsche.
Teile dein Problem in Unterprobleme. Strukturiere deinen Quelltext durch Unterprogramme (Prozeduren, Funktionen). Dadurch gewinnst du Übersichtlichkeit, und kannst beim Debuggen auch Quelltextbereiche überspringen, von denen du weißt, dass sie korrekt arbeiten.
|
|
WormHole 
      
Beiträge: 145
|
Verfasst: Mo 15.08.05 11:16
Dann führe ich die angreifer attacke aus... Danach muss die Verteidiger attacke!
Okay, klappt... Soweit war ich aber auch schon^^ Nur:
NACHDEM EIN SPIELER ANGEGRIFFEN HAT IST DER ANDERE SPIELER MIT ANGREIFEN DRAN:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure angreifer; begin ... verteidiger; end;
procedure verteidiger; begin ... angreifer; end;
procedure Button1.Click(Sender:TObject); begin if initiative_sp1 > initiative_sp2 then angreifer else verteidiger; end; |
Das ganze würde in einer Endlosschleife enden. Wie kann ich es machen, dass nach der Verteidigerattacke die Angreifer attacke ausgeführt wird, aber ohne das das in einer Endloschleife endet? Ist jetzt verstanden, wie ich das meine?
|
|
LigH
      
Beiträge: 239
Win98SE, Win2000SP4
D7
|
Verfasst: Mo 15.08.05 11:40
|
|
WormHole 
      
Beiträge: 145
|
Verfasst: Mo 15.08.05 11:49
Hab es schon anders gelöst, trotzdem danke
Und mir hat man nichts beigebracht. Ich bin gerade selber am lernen... Ohne Hilfe^^
|
|
LigH
      
Beiträge: 239
Win98SE, Win2000SP4
D7
|
Verfasst: Mo 15.08.05 11:54
Na, dann ist es besonders schwer, einen guten Einstieg zu finden. Ansonsten hätte man es noch auf schlechte Lehrer schieben können...
Bücher zu einer Programmiersprache sind dann oft nicht der beste Anfang. "Algorithmen und Datenstrukturen (für eine Programmiersprache)" wäre eigentlich viel wichtiger, bevor es richtig losgeht.
Uns hat man immer gesagt: "Das Programm muss schon im Kopf laufen, noch bevor die erste Zeile Code eingetippt wird. Und wenn der nicht reicht, dann nehmt den Papier-Computer zu Hilfe." Meiner Meinung nach ein guter Ratschlag: Erst wenn ich selber das Problem verstehe, und mir selber das Problem in allen Einzelheiten erklären und beschreiben kann, kann ich auch eine Lösung schreiben, die der Computer versteht.
|
|
WormHole 
      
Beiträge: 145
|
Verfasst: Mo 15.08.05 12:07
Ja bei mir ist das so, ich habe nur ein einziges Buch, und das ist eher ein Lexikon zu Delphi^^
Mit dem Programm erst im Kopf "schreiben", dass habe ich auch erst versucht. Bis ich die erste 3 Zeilen geschrieben habe und der erste Fehler schon da war  Dafür habe ich einfach noch nicht die Kenntnisse um das Proc erst im Kopf zu erstellen... Ich tue mein bestes und versuche euch guten proggern hier im Forum nicht auf die nerven zu gehen wenn da solche kleinen Pisselfragen kommen, aber wenn ich nicht weiter weiß, dann frage ich hier, dafür ist das Forum ja da^^
|
|
LigH
      
Beiträge: 239
Win98SE, Win2000SP4
D7
|
Verfasst: Mo 15.08.05 13:10
Kleine Übung zum Warmwerden:
Versuch mal aufzuschreiben, wie man einen Knoten mit Schleife bindet.
Nicht erschrecken, wenn das eine Seite voll wird! Wenn du das schaffst, dann weißt du, wie man Computern gegenüber denken muss! 
|
|
|