Autor Beitrag
WormHole
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 145



BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TKampfscript.Timer1Timer(Sender: TObject);
begin
angreifen;
end;


Diese Prozedur wird dabei aufgerufen:
ausblenden volle Höhe Delphi-Quelltext
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));

  // Die Attacke
  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:
ausblenden 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 user profile iconraziel: Topic aus VCL (Visual Component Library) verschoben am So 14.08.2005 um 07:43
LigH
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: Sa 13.08.05 22:05 
Wie häufig kommt denn der Timer zum Zug? Schneller, als "angreifen" fertig wird?
__

Und übrigens, Kleinigkeit:

ausblenden Delphi-Quelltext
1:
if angreifer=1 then angreifer:=2 else angreifer:=1;					


:roll:

Wenn es immer nur genau zwei Parteien sein werden:

a) Warum nicht Boolean?
oder
b) angreifer := 3 - angreifer;
Raphael O.
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1596


VS 2013
BeitragVerfasst: Sa 13.08.05 22:12 
user profile iconWormHole 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:
ausblenden volle Höhe Delphi-Quelltext
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)); //wird immer ausgeführt (logisch ;) )

  // Die Attacke
  if angreifer=1 then
    begin
      if wurf_sp1<=treffer_sp1 then //hier wird abgebrochen, wenn treffer > wurf ist!! dann erfolgt keine Ausgabe von "Angreifer greift an"
        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 //s.o.
        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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 145



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: So 14.08.05 07:58 
user profile iconFiji-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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 145



BeitragVerfasst: 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:

ausblenden volle Höhe Delphi-Quelltext
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; // Der verteidiger greift hiernach an

  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');

//Wie kann ich hier nach, wenn angreifer:=2 als erstes ausgeführt wurde angreifer:=1 proc ausführen, ohne das das in einer endlosschleife endet?


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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: 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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
var AngreiferZuerst: Boolean;

{
  zufällig: AngreiferZuerst := (Random(2) > 0);

  round-robin: AngreiferZuerst := not AngreiferZuerst;
}


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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 145



BeitragVerfasst: 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:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
procedure angreifer;
begin
...
verteidiger;     // verweist auf die Verteidiger procedure
end;

procedure verteidiger;
begin
...
angreifer;      // verweist auf die Angreifer procedure
end;

procedure Button1.Click(Sender:TObject);
begin 
if initiative_sp1 > initiative_sp2 then angreifer else verteidiger; //Wer anfängt zu kämpfen!
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: Mo 15.08.05 11:40 
Hat man euch eigentlich bloß eine Programmier-Sprache beigebracht - oder auch Programmieren? (Also sprachunabhängige Grundlagen, Logik, Problemanalyse, Ablaufplan/Struktogramm, ...) :?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure angreifer;   
begin   
...   
end;   

procedure verteidiger;   
begin   
...   
end;   

procedure Button1.Click(Sender:TObject);   
begin    
  if initiative_sp1 > initiative_sp2 //Wer anfängt zu kämpfen!
  then begin
    angreifer;
    verteidiger;
  end
  else begin
    verteidiger;
    angreifer;
  end
end;
WormHole Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 145



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 145



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 239

Win98SE, Win2000SP4
D7
BeitragVerfasst: 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! ;)