Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Gewinn-Abfrage bei 4-Gewinnt (https://www.delphipraxis.net/39485-gewinn-abfrage-bei-4-gewinnt.html)

malo 3. Feb 2005 13:16


Gewinn-Abfrage bei 4-Gewinnt
 
Ich versuch mich grade an einem kleinen 4-Gewinnt-Spielchen. Das klappt soweit auch. Meine erste Schwierigkeit ist jedoch schon die Gewinnabfrage :duck:

Ich hab dafür eine Function erstellt, die ausgeben soll, ob ein Spieler gewonnen hat.

Ich hab mir auch die Gewinnabfrage von Luckies 4-Gewinnt (bzw. von w3seek) angesehen, doch daraus werd ich irgendwie nicht richtig schlau...

Ich hab mich dann mal selbst versucht und folgenden Code auf die Beine gestellt.

Delphi-Quellcode:
function TForm1.Spieler2Sieg: boolean;
var i: integer;
begin
  for i := 1 to 42 do
    begin
      if ((FindComponent('Shape'+IntToStr(i)) as TShape).Brush.Color = clRed)
        and ((FindComponent('Shape'+IntToStr(i+1)) as TShape).Brush.Color = clRed)
          and ((FindComponent('Shape'+IntToStr(i+2)) as TShape).Brush.Color = clRed)
            and ((FindComponent('Shape'+IntToStr(i+3)) as TShape).Brush.Color = clRed)
              then
                Result := true else
                  Result := false;
    end;
end;
Daraus kann man auch schon fast erkennen, dass ich als "Felder" Shapes benutzt hab, die ich regelmäßig angeordnet hab (und die auch noch Standartnamen besitzen, was ja nicht sein sollte, ich weiß...). Mit diesem Code frag ich die Farben der Shapes will ich die Farben der Shapes abfragen und daraus erschließen, ob 4 gleichfarbige Shapes in einer Reihe stehen. Das soll jetzt erstmal dafür dienen, um horizontal abzufragen, ob 4 rote Steine in einer Reihe stehen.

Wenn ich jetzt die jeweiligen Shapes einfärbe (also Steine einwerfe) ruf ich auch immer schön die Function auf, aber irgendwie funktioniert das nicht ganz. Keine Fehlermeldung oder so, Result wird nur nie auf true gesetzt :gruebel:

Hat jemand ne Ahnung, warum?

Minz 3. Feb 2005 13:29

Re: Gewinn-Abfrage bei 4-Gewinnt
 
Wenn ich das richtig verstehe suchst du nach erzeugten TShape-Objekten.

Was du genau tust: du fragst ab ob z.B.

Shape1, Shape2, Shape3 und Shape4 alle rote Farbe haben. Ist dabei auch die Lage der Shapes berücksichtigt?

Zum Beispiel ist das wichtig wenn du sagen wir die unterste Reihe betrachtest. Wenn diese 8 Felder besitzt (1-8 ),

und du fragst jetzt shape6,shape7,shape8,shape9 und alle sind rot, würde deine Funktion true ausgeben, obwohl das nicht korrekt wäre !

Also ich weiß nicht genau warum deine Funktion niemals true ausgibt, aber an sich enthält sie auch schon logikfehler !

Ich persönlich würde auch nicht im Speicher nach einem Objekt suchen (ist eventuell Geschmackssache). Hast du das Spielfeld denn nicht in einem Array gespeichert? Das wäre sicherlich vorteilhafter, auch was einen eventuellen Computergegner angeht.

malo 3. Feb 2005 13:35

Re: Gewinn-Abfrage bei 4-Gewinnt
 
Die jeweiligen Shapes sind statische Shapes (es soll ja Leute geben, die sich unnötige Arbeit machen, weil sie zu faul zum nachdenken sind (ich z.B.) :wall: ).

Der Logikfehler ist mir noch gar nicht aufgefallen, aber den werd ich wohl berücksichtigen müssen... das heißt im Grunde, die ganze Function ist erstmal sinnlos. Trotzdem wüsste ich gerne, warum sie nicht true ausgibt :wall:

Das Spielfeld hab ich nicht in einem Array gespeichert. Wobei das jedoch eine wunderbare Idee ist, werd ich mal machen :duck:

Binärbaum 3. Feb 2005 13:54

Re: Gewinn-Abfrage bei 4-Gewinnt
 
Wie ich an dem Code sehe, durchläuft die funktion alle Felder (bzw. Shapes) und setzt danach Result. Fakt ist jedoch, dass wenn z.B. im ersten Durchlauf Result = true ist, dann wird dass im zweiten Durchlauf wieder überschrieben, usw. . Die Funktion dürfte also nur dann True ausgeben, wenn im letzten Durchlauf alle abgefragten Felder rot sind (d.h. die letzten vier Felder sind rot) und sonst nicht.
Das kann man aber ändern, indem man den Quelltext geringfügig ändert:
Delphi-Quellcode:
function TForm1.Spieler2Sieg: boolean;
var i: integer;
begin
  Result:= False;
  for i := 1 to 42 do
   ///weiter wie bisher ...
    ... and ((FindComponent('Shape'+IntToStr(i+3)) as TShape).Brush.Color = clRed)
              then
                Result := (true or Result);
    end;
end;
MfG
Binärbaum

malo 3. Feb 2005 14:27

Re: Gewinn-Abfrage bei 4-Gewinnt
 
Also schon wieder Logikfehler :wall:

Danke dafür schonmal :thumb:

Nur, was genau heißt diese Zeile:
Delphi-Quellcode:
Result := (true or Result);
:?:

Binärbaum 3. Feb 2005 14:34

Re: Gewinn-Abfrage bei 4-Gewinnt
 
Zitat:

Zitat von malo
Also schon wieder Logikfehler :wall:

Danke dafür schonmal :thumb:

Nur, was genau heißt diese Zeile:
Delphi-Quellcode:
Result := (true or Result);
:?:

Das heißt, dass Result mit True über ein logisches OR verknüpft wird und das Ergebnis dann in Result gespeichert wird.
Wenn ich's mir allerdings recht überlege, kann man auch einfach
Delphi-Quellcode:
Result:= True;
schreiben. Das kommt aufs selbe raus, wenn man nicht in einem else-Zweig wieder Result auf False setzt.

MfG
Binärbaum

atreju2oo0 3. Feb 2005 14:34

Re: Gewinn-Abfrage bei 4-Gewinnt
 
Da reicht eigentlich ein einfaches true...

[edit] War ja klar das ich zu spät bin... *gg* [/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz