AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Delphi-Quellcode:
also naja ich gebe euch nochal die Funktion dazu.....
procedure TForm1.Label8Click(Sender: TObject);
begin if IsFieldEmpty(Label8.Caption) then begin Label8.Caption := WriteToField(GPlayer); if CheckForWin(GBuffer) then //kann wegen optimierung nicht zugegriffen werden? begin Label8.Caption := ''; ShowMessage(IntToStr(GPlayer)+' hat gewonnen!'); GPlayer := 1; end else begin ChangePlayer; end; end; end;
Delphi-Quellcode:
also als ich es gerade durchgesteppt habe stand an der Seite
function TForm1.CheckForWin(AIndex: array of string): Boolean;
begin AIndex[1]:= Label1.Caption; AIndex[2]:= Label1.Caption; AIndex[3]:= Label1.Caption; AIndex[4]:= Label1.Caption; AIndex[5]:= Label1.Caption; AIndex[6]:= Label1.Caption; AIndex[7]:= Label1.Caption; AIndex[8]:= Label1.Caption; AIndex[9]:= Label1.Caption; result := false; begin if (AIndex[1] = AIndex[2]) and (AIndex[2] = AIndex[3]) and (IsFieldEmpty(AIndex[1]) = false) then begin result := true; end; if (AIndex[4] = AIndex[5]) and (AIndex[5] = AIndex[6]) and (IsFieldEmpty(AIndex[4]) = false) then begin result := true; end; if (AIndex[7] = AIndex[8]) and (AIndex[8] = AIndex[9]) and (IsFieldEmpty(AIndex[7]) = false) then begin result := true; end; if (AIndex[1] = AIndex[4]) and (AIndex[4] = AIndex[7]) and (IsFieldEmpty(AIndex[1]) = false) then begin result := true; end; if (AIndex[2] = AIndex[5]) and (AIndex[5] = AIndex[8]) and (IsFieldEmpty(AIndex[2]) = false) then begin result := true; end; if (AIndex[3] = AIndex[6]) and (AIndex[6] = AIndex[9]) and (IsFieldEmpty(AIndex[3]) = false) then begin result := true; end; if (AIndex[1] = AIndex[5]) and (AIndex[5] = AIndex[9]) and (IsFieldEmpty(AIndex[1]) = false) then begin result := true; end; if (AIndex[3] = AIndex[5]) and (AIndex[5] = AIndex[7]) and (IsFieldEmpty(AIndex[3]) = false) then begin result := true; end; end; end; Zitat:
bin eben Mittag essen also.... ich seh ja was ihr schreibt^^ |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
So macht der Parameter aber gar keinen Sinn, Du solltest ihn schon zum Datenaustausch nutzen. Aber mir leuchtet der Sinn des Array of String sowieso nicht ein (wieso ein Array, und dann auch noch Strings?). Übrigens setzt Du alle Elemente Deines Arrays auf denselben Wert, damit kannst Du Dir die Vergleiche eigentlich sparen :zwinker:
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Zitat:
Das Ergebnis der Funktionen ist ja bereits ein Wahrheitswert (Boolean). Deshalb musst Du nur zB
Delphi-Quellcode:
schreiben. Das reicht völlig, und erspart dir das eine oder andere Problem.
if CheckForWin(a) then
Sherlock |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Hatte ich das nicht druntergeschrieben? :cyclops:
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Ich wollte nur sicher gehen. Denn in Post 32 war ihr das noch nciht bewusst geworden, und danach stand nichts mehr dazu da - zugegeben: hab den Rest nur überflogen.
Aber das kann man ja nicht oft genug sagen ;) Sherlock |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Zitat:
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Zitat:
Zitat:
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Das
Delphi-Quellcode:
-Problem:
if ... = true then
Wie jeder bestimmt zu Wissen glaube, kennt ein Boolean zwei Zustände ... True oder False ... niwa? Falsch. :angle2: Siehe folgenden Test: Gegeben ist eine Funktion, welche einen booleanischen Wert zurückliefert. Und zusätzlich sind mehrere Varianten gegeben, diesen Boolean auszuwerten.
Delphi-Quellcode:
Also.
function Test: Boolean;
asm mov al, 8 end; ... if Test = true then ShowMessage('Test = true') else if Test = false then ShowMessage('Test = false') else ShowMessage('Test = weder true noch false?'); ... if Test = true then ShowMessage('Test = true : ja (richtig)') else ShowMessage('Test = true : nicht ja (falsch)'); if Test = false then ShowMessage('Test = false : nein (richtig)') else ShowMessage('Test = false : nicht nein (falsch)'); if Test then ShowMessage('Test : ja (richtig)') else ShowMessage('Test : nein (falsch)'); if not Test then ShowMessage('not Test : nein (richtig)') else ShowMessage('not Test : ja (falsch)'); Prüfe niemals auf True und False. Einzige Außnahme, wenn man wirklich "genau" den internen/binären Wert prüfen muß, was aber meistens nicht der Fall ist, da man ja nur den "logischen" Wert ala "Ja oder Nein" prüfen möchte. |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Zitat:
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
hmm... hast ja recht.... Wie bekommt er denn sonst die Werte aus den Labels?
ist ja blöde menno |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Könnte man das nicht gleich von Anfang an ordentlich aufziehen und Logik und Darstellung trennen? Ich finde, damit kann man gar nicht früh genug anfangen und gewöhnt sich dann suboptimale Arbeitsweise gar nicht erst an.
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
ja hatte ich ja auch^^
nur wusste ich ja nicht dass es nicht funktioniert. ich habe den Teil mit CheckForWin auskommentiert.... also es klappt alles hundert Prozent! nur das ist eben noch die Sache die klappen muss |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Nee, das hast Du nicht, Du verwendest visuelle Controls (TLabel) als Datenspeicher. Dafür sind sie aber nicht gedacht, sondern nur zur Darstellung von Daten. Ich weiß, dass man solchen Code oft findet, richtig gut ist das aber beileibe nicht.
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Du hast ein Parameter-Array ... wie wäre es, wenn man die Captions der Labels an diesen Parameter (beim Aufruf der Prozedur) übergibt?
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Jetzt kommt ihr sogar hier noch mit asm und irgendwelchen factory factory factorys.... :roll::roll:
Delphi-Quellcode:
AIndex[1]:= Label1.Caption;
AIndex[2]:= Label2.Caption; AIndex[3]:= Label3.Caption; AIndex[4]:= Label4.Caption; AIndex[5]:= Label5.Caption; AIndex[6]:= Label6.Caption; AIndex[7]:= Label7.Caption; AIndex[8]:= Label8.Caption; AIndex[9]:= Label9.Caption; |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Na, das muss man mir ja auch sagen, dass man es mit Labels nicht machen kann.
Ich muss die halt benutzen. dann suche ich mir mal einen anderen Weg womit es klappt. |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Nö, ich hätte jetzt an einen Record mit Status (der neue Typ) und zugehörigem Label gedacht sowie einem 2-dimensionalen Array desselben. Das ist zwar immer noch nicht ideal, hält aber zusammen, was zusammen gehört.
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Zitat:
Delphi-Quellcode:
das macht der Compiler nicht.
if CheckForWin(Label9.Caption) then
Zitat:
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Delphi-Quellcode:
if CheckForWin([Label1.Caption, Label2.Caption, Label3.Caption]) then
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
aber mit dem Label1 hat er ja 3 Gewinnmöglichkeiten.
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Ich habe ja bereits mehrfach gesagt, dass ich keinen Schimmer habe, wozu dieser Array-Parameter gut sein soll.
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
was auch immer hier stand.... es ist schwachsinn
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Mir ist gerade eine Idee gekommen: wenn man der Funktion immer 3 Strings übergibt und sie diese vergleicht, dann könnte das zumindest noch ein bisschen Sinn ergeben.
Delphi-Quellcode:
Damit prüft die Funktion, ob alle 3 Strings gleich sind. Nun kann man sie einmal für jede Zeile, einmal für jede Spalte und je einmal für die Diagonalen aufrufen.
type
TMyStringArray = array[0..2] of string; function CheckForWin(Labels: TMyStringArray): Boolean; begin Result := (Labels[0] = Labels[1]) and (Labels[0] = Labels[2]); end; |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
hmmm.... okaaaaay ich versuchs gleich mal'!
so in etwa sollte mein Array ja auch Sinn ergeben^^ |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
als Parameter würde ich also alle drei angeben?
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Japp.
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Zitat:
Zitat:
Delphi-Quellcode:
ich dreh durch:)
if CheckForWin([Label9.Caption, Label7.Caption, Label8.Caption]) then
begin Label9.Caption := ''; ShowMessage(IntToStr(GPlayer)+' hat gewonnen!'); GPlayer := 1; end else |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
ach sollte vielleicht mal Labels1 usw Schreiben oder? Ich glaube das macht Sinn:wall:
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Den Typ und die Funktion so deklarieren wie ich oben gezeigt habe, dann sollte das klappen.
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Zitat:
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Wie sieht die Funktion aus und was genau übergibst Du ihr?
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Delphi-Quellcode:
if CheckForWin(Label9, Label8, Label7) then
begin Label9.Caption := ''; ShowMessage(IntToStr(GPlayer)+' hat gewonnen!'); GPlayer := 1; end else
Delphi-Quellcode:
function TForm1.CheckForWin(Labels: MyStringArray): Boolean;
begin Result := (Labels[0] = Labels[1]) and (Labels[0] = Labels[2]); end; |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Delphi-Quellcode:
if CheckForWin([Label9.Caption, Label8.Caption, Label7.Caption]) then
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Zitat:
Zitat:
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Achja, das ist ja kein Open Array mehr. Dann eben so:
Delphi-Quellcode:
var
Kombination: TMyStringArray; begin Kombination[0] := Label1.Caption; Kombination[1] := Label2.Caption; Kombination[2] := Label3.Caption; if CheckForWin(Kombination) then |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Jupp, wenn man als Parameter-Typ einen Array-Typen angibt, dann muß auch eine Variable/Konstante mit genau diesem Typen übergeben werden.
Den sogenannten Open-Arrays ist sowas aber egal.
Delphi-Quellcode:
Oder man nimmt eben kein Array.
function CheckForWin(Labels: array of String): Boolean;
begin if Length(Labels) < 3 then // oder besser noch if Length(Labels) <> 3 then raise Exception.Create('Es müssen (mindestens) 3 Strings an CheckForWin übergeben werden.'); ...
Delphi-Quellcode:
function CheckForWin(Label1, Label2, Label3: String): Boolean;
begin ... |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
ja das war es schon eher. Jetzt muss ich es nur noch mit einbauen mit den diagonalen und so weiter.... das kann ich doch auch in eine extra procedure machen wei es ja für jedes Label gilt? obwohl...hmmm.... haben ja immer andere Label namen....
naja und jetzt wenn ich auf das eine label drücke ohne dass ich vorher was anderes geklickt habe wird mir der Gewinner angezeigt?! Also gewinnt der jenige, der als erstes klickt, weil das feld leer ist xD:lol: |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Wahrscheinlich prüfst Du eben nicht, ob das Feld leer ist, bevor Du die Funktion aufrufst.
|
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Delphi-Quellcode:
aber wieso geht der denn nicht?
function TForm1.CheckForWin(AIndex: array of string): Boolean;
begin AIndex[1]:= Label1.Caption; AIndex[2]:= Label2.Caption; AIndex[3]:= Label3.Caption; AIndex[4]:= Label4.Caption; AIndex[5]:= Label5.Caption; AIndex[6]:= Label6.Caption; AIndex[7]:= Label7.Caption; AIndex[8]:= Label8.Caption; AIndex[9]:= Label9.Caption; result := false; begin if (AIndex[1] = AIndex[2]) and (AIndex[2] = AIndex[3]) and (IsFieldEmpty(AIndex[1]) = false) then begin result := true; end; if (AIndex[4] = AIndex[5]) and (AIndex[5] = AIndex[6]) and (IsFieldEmpty(AIndex[4]) = false) then begin result := true; end; if (AIndex[7] = AIndex[8]) and (AIndex[8] = AIndex[9]) and (IsFieldEmpty(AIndex[7]) = false) then begin result := true; end; if (AIndex[1] = AIndex[4]) and (AIndex[4] = AIndex[7]) and (IsFieldEmpty(AIndex[1]) = false) then begin result := true; end; if (AIndex[2] = AIndex[5]) and (AIndex[5] = AIndex[8]) and (IsFieldEmpty(AIndex[2]) = false) then begin result := true; end; if (AIndex[3] = AIndex[6]) and (AIndex[6] = AIndex[9]) and (IsFieldEmpty(AIndex[3]) = false) then begin result := true; end; if (AIndex[1] = AIndex[5]) and (AIndex[5] = AIndex[9]) and (IsFieldEmpty(AIndex[1]) = false) then begin result := true; end; if (AIndex[3] = AIndex[5]) and (AIndex[5] = AIndex[7]) and (IsFieldEmpty(AIndex[3]) = false) then begin result := true; end; end; end; |
AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
Jetzt hast Du ja alles wieder über den Haufen geworfen :wall:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz