![]() |
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:
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.
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; 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? |
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. |
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: |
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:
MfG
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; Binärbaum |
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);
|
Re: Gewinn-Abfrage bei 4-Gewinnt
Zitat:
Wenn ich's mir allerdings recht überlege, kann man auch einfach
Delphi-Quellcode:
schreiben. Das kommt aufs selbe raus, wenn man nicht in einem else-Zweig wieder Result auf False setzt.
Result:= True;
MfG Binärbaum |
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