Delphi-PRAXiS
Seite 2 von 5     12 34     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz (https://www.delphipraxis.net/162412-tic-tac-toe-mal-wieder-versteh-aufgabestellung-nicht-ganz.html)

biby90 23. Aug 2011 11:40

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Delphi-Quellcode:
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;
also naja ich gebe euch nochal die Funktion dazu.....
Delphi-Quellcode:
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;
also als ich es gerade durchgesteppt habe stand an der Seite
Zitat:

//kann wegen optimierung nicht zugegriffen werden

bin eben Mittag essen also.... ich seh ja was ihr schreibt^^

DeddyH 23. Aug 2011 12:10

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:

Sherlock 23. Aug 2011 12:27

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Zitat:

Zitat von biby90 (Beitrag 1118841)
also muss ich die alle umschreiben und auf false prüfen?

NEIN!

Das Ergebnis der Funktionen ist ja bereits ein Wahrheitswert (Boolean). Deshalb musst Du nur zB
Delphi-Quellcode:
if CheckForWin(a) then
schreiben. Das reicht völlig, und erspart dir das eine oder andere Problem.

Sherlock

DeddyH 23. Aug 2011 12:30

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Hatte ich das nicht druntergeschrieben? :cyclops:

Sherlock 23. Aug 2011 12:32

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

DeddyH 23. Aug 2011 12:34

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Zitat:

Zitat von sherlock (Beitrag 1118922)
aber das kann man ja nicht oft genug sagen ;)

full ack ;)

biby90 23. Aug 2011 12:53

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Zitat:

Übrigens setzt Du alle Elemente Deines Arrays auf denselben Wert
das Array soll ja eigentlich die Werte aus dem Label vergleichen. Sprich wenn Reihen 1,2 und 3 ein X haben dann hat Spieler X gewonnen...

Zitat:

if CheckForWin(a) then
habe ich docj... oder nicht?

himitsu 23. Aug 2011 12:57

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Das
Delphi-Quellcode:
if ... = true then
-Problem:

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:
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)');
Also.
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.

DeddyH 23. Aug 2011 13:02

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Zitat:

Delphi-Quellcode:
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;

Was steht dann wohl in den einzelnen Elementen drin?

biby90 23. Aug 2011 13:05

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

DeddyH 23. Aug 2011 13:12

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.

biby90 23. Aug 2011 13:16

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

DeddyH 23. Aug 2011 13:18

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.

himitsu 23. Aug 2011 13:19

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?

mleyen 23. Aug 2011 13:21

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;

biby90 23. Aug 2011 13:22

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.

DeddyH 23. Aug 2011 13:23

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.

biby90 23. Aug 2011 13:24

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Zitat:

wenn man die Captions der Labels an diesen Parameter

Delphi-Quellcode:
if CheckForWin(Label9.Caption) then
das macht der Compiler nicht.
Zitat:

[Pascal Fehler] Unit1.pas(277): E2010 Inkompatible Typen: 'Array' und 'TCaption'

DeddyH 23. Aug 2011 13:25

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Delphi-Quellcode:
if CheckForWin([Label1.Caption, Label2.Caption, Label3.Caption]) then

biby90 23. Aug 2011 13:28

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
aber mit dem Label1 hat er ja 3 Gewinnmöglichkeiten.

DeddyH 23. Aug 2011 13:29

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.

biby90 23. Aug 2011 13:31

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
was auch immer hier stand.... es ist schwachsinn

DeddyH 23. Aug 2011 13:35

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:
type
  TMyStringArray = array[0..2] of string;

function CheckForWin(Labels: TMyStringArray): Boolean;
begin
  Result := (Labels[0] = Labels[1]) and (Labels[0] = Labels[2]);
end;
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.

biby90 23. Aug 2011 13:39

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^^

biby90 23. Aug 2011 13:50

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
als Parameter würde ich also alle drei angeben?

DeddyH 23. Aug 2011 13:52

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Japp.

biby90 23. Aug 2011 13:57

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Zitat:

[Pascal Fehler] Unit1.pas(287): E2001 Ordinaltyp erforderlich

Zitat:

[Pascal Fehler] Unit1.pas(287): E2010 Inkompatible Typen: 'Integer' und 'TCaption'

Delphi-Quellcode:
if CheckForWin([Label9.Caption, Label7.Caption, Label8.Caption]) then
    begin
      Label9.Caption := '';
      ShowMessage(IntToStr(GPlayer)+' hat gewonnen!');
      GPlayer := 1;
    end else
ich dreh durch:)

biby90 23. Aug 2011 13:59

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
ach sollte vielleicht mal Labels1 usw Schreiben oder? Ich glaube das macht Sinn:wall:

DeddyH 23. Aug 2011 14:07

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.

biby90 23. Aug 2011 14:14

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Zitat:

[Pascal Fehler] Unit1.pas(287): E2010 Inkompatible Typen: 'MyStringArray' und 'TLabel'
kann ja wohl nicht sein!

DeddyH 23. Aug 2011 14:16

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Wie sieht die Funktion aus und was genau übergibst Du ihr?

biby90 23. Aug 2011 14:18

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;

DeddyH 23. Aug 2011 14:19

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Delphi-Quellcode:
if CheckForWin([Label9.Caption, Label8.Caption, Label7.Caption]) then

biby90 23. Aug 2011 14:21

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Zitat:

[Pascal Fehler] Unit1.pas(287): E2010 Inkompatible Typen: 'MyStringArray' und 'TCaption'
Zitat:

[Pascal Fehler] Unit1.pas(287): E2034 Zu viele Parameter
Das will er auch nicht

DeddyH 23. Aug 2011 14:24

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

himitsu 23. Aug 2011 14:40

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:
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.');
  ...
Oder man nimmt eben kein Array.
Delphi-Quellcode:
function CheckForWin(Label1, Label2, Label3: String): Boolean;
begin
  ...

biby90 23. Aug 2011 14:51

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:

DeddyH 23. Aug 2011 14:57

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.

biby90 23. Aug 2011 15:08

AW: tic tac toe.... mal wieder:) versteh aufgabestellung nicht ganz
 
Delphi-Quellcode:
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;
aber wieso geht der denn nicht?

DeddyH 23. Aug 2011 15:09

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 23:47 Uhr.
Seite 2 von 5     12 34     Letzte »    

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