AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

TicTacToe - Frage zum Programmablauf

Ein Thema von ShadowDeath · begonnen am 11. Apr 2017 · letzter Beitrag vom 12. Apr 2017
Antwort Antwort
nahpets
(Gast)

n/a Beiträge
 
#1

AW: Finde den Fehler einfach nicht

  Alt 12. Apr 2017, 00:05
Hallo,

bisher kann ich den Fehler auch nicht finden.

Aber:
Delphi-Quellcode:
  // Gibt es diagonal einen Gewinner? (Von Links-Oben nach Rechts-Unten)
  for Y := 0 to 2 do
  begin
    Result := Spielfeld[ 0, 0 ];
    if ( Result <> Spielfeld[ 1, 1 ] ) or ( Result <> Spielfeld[ 2, 2 ] ) then Result := 0;
    If Result <> 0 then Exit;
  end;
Die For-Schleife erscheint mir hier überflüssig, es gibt nur eine entsprechende Diagonale, da Y in der Schleife nicht genutzt wird, dürfte das dreifache Durchlaufen der Schleife überflüssig sein.
Gilt analog auch für die andere Diagonale.

Zitat:
Um genau zu sein scheint die Gewinner Abfrage nicht zu funktionieren, doch ich finde den Fehler einfach nicht.
Könntest Du das bitte präzisieren?

Funktioniert das grundsätzlich nicht oder nur ab und an oder nur bei bestimmten Konstellationen?

Der Vorschlag von himitsu ist meiner Meinung nach sehr sinnvoll. Über die "Liste" der Controls kann man zwar abfragen, ob man eine passende Komponenten gefunden hat, aber die Reichenfolge ist nicht zwingend aufsteigend nach Namen, sondern wohl von der Erstellungsreihenfolge in der IDE abhängig. Speedbutton1 muss also nicht unbedingt Self.Controls[0] sein. Allerdings müsste das auffallen, weil dann die Caption nicht korrekt gesetzt wird.

Bei himitsus Ansatz müsste meiner Meinung nach aber Spielfeld: array[0..2, 0..2] of Byte; in Spielfeld: array[1..3, 1..3] of Byte; geändert werden und die For-Schleifen entsprechend von 1 bis 3 gehen. Ebenso müsste dann
Delphi-Quellcode:
// Wurde der Button gefunden?
  if ( X > 2 ) or ( Y > 2 ) then exit;
geändert werden in
Delphi-Quellcode:
// Wurde der Button gefunden?
  if ( X > 3 ) or ( Y > 3 ) then exit;
Wobei diese Abfrage eigentlich überflüssig sein dürfte, da ja nur den SpeedButtons 1 bis 9 die Ereignisroutine zugewiesen wurde. Sollte die Bedingung also erfüllt sein, ist noch irgendwas anderes nicht in Ordnung.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.920 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: TicTacToe - Frage zum Programmablauf

  Alt 12. Apr 2017, 09:08
Moin und willkommen in der DP.
Ich habe mal den Titel Deines Themas angepasst, damit dieser für Dritte aussagekräftiger ist.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.655 Beiträge
 
Delphi 12 Athens
 
#3

AW: TicTacToe - Frage zum Programmablauf

  Alt 12. Apr 2017, 09:12
Dann hättest Du aber auch gleich die Code- durch Delphi-Tags ersetzen können
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
ShadowDeath

Registriert seit: 11. Apr 2017
10 Beiträge
 
#4

AW: TicTacToe - Frage zum Programmablauf

  Alt 12. Apr 2017, 10:27
Also, erstmal danke für die zahlreichen Antworten. Ich habe erst einmal die falschen Tags korrigiert, damit es übersichtlicher ist. Zum Punkt, was den nun nicht funktioniert: Er erkennt nie den Gewinner, egal welche Gewinn Konstellation ich teste (sei es diagonal, vertikal oder horizontal). Gewünscht ist, dass er eine Message mit dem Gewinner ausgibt.

Delphi-Quellcode:
 // Sieger ermitteln
  Gewinner := ErmittelGewinner();

  // Entsprechend des Siegers eine Meldung ausgeben
  case Gewinner of
    0: Exit;
    1,2: ShowMessage( Format( 'Spieler %d hat gewonnen.', [ Gewinner ] ) );
    3: ShowMessage( 'Das Spiel endet unentschieden.' );
  end;
Und bezüglich der Tags von VCL-Komponenten: Ich war mir bewusst, dass es diese Eigenschaft für VCL Komponente gibt. Doch leider habe ich mich vorher nie damit auseinander gesetzt, deswegen nahm ich die 'unsaubere' Methoden anhand der Erstellungsreihenfolge (1-9 gehören zum Spielfeld, 10 ist der Neustart Button). Also dürfte es da keine Probleme geben (außer die Unsauberkeit des Codes).
Ich werde versuchen weitgehend alles Überflüssige zu entfernen (For-Schleifen) bzw. zu optimieren (Tags). Dennoch bin ich überzeugt, dass der Fehler woanders liegt. Ich würde mich sehr freuen, wenn ich noch ein paar Lösungsansätze finden würdet bzw. mit mir teilen würdet.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#5

AW: TicTacToe - Frage zum Programmablauf

  Alt 12. Apr 2017, 10:58
Delphi-Quellcode:
case Gewinner of
    0: Exit;
Das ist überflüssig, da nach dem Case ja eh kein Code mehr kommt.
  Mit Zitat antworten Zitat
Whookie

Registriert seit: 3. Mai 2006
Ort: Graz
446 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: TicTacToe - Frage zum Programmablauf

  Alt 12. Apr 2017, 11:11
1. Die Lösung steht doch vermutlich schon in #4
2. Verwende den Debugger und schau dir deine Variablen an
3. Wozu soll die angehängte .exe im Zipfile gut sein? Wenn du möchtest das sich das jemand hier ansieht dann häng das Projekt an, so das man es compilen kann (.exe erstellen kann hier sogut wie jeder )
Whookie

Software isn't released ... it is allowed to escape!
  Mit Zitat antworten Zitat
ShadowDeath

Registriert seit: 11. Apr 2017
10 Beiträge
 
#7

AW: TicTacToe - Frage zum Programmablauf

  Alt 12. Apr 2017, 12:45
Ich habe es jetzt nochmal ausführlich getestet. Dabei ist mir aufgefallen, dass es manchmal funktioniert und manchmal nicht. Leider bin ich nicht in der Lage die Ursache zu finden, die fürs funktionieren/nicht funktionieren verantwortlich ist. Ich denke aber es liegt an gesagtem ControlCount. Leider weiß ich nicht, wie ich das Programm debuggen soll. In der Starter Edition ist die Debug Option leider nicht enthalten :/
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#8

AW: TicTacToe - Frage zum Programmablauf

  Alt 12. Apr 2017, 12:48
Dann setz doch mal zur Überprüfung an verschiedenen Stellen Showmessage()-Boxen, welche die aktuellen Variableninhalte oder sonst was ausgeben.
So mache ich das immer, obwohl ich einen Debugger habe.
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#9

AW: TicTacToe - Frage zum Programmablauf

  Alt 12. Apr 2017, 13:06
Nachdem ich jetzt mal 'ne Weile mit der EXE rumgespielt habe, bin ich mir fast sicher, dass das interne Spielfeld hier  Spielfeld[ X, Y ] := Spieler; anders befüllt wird, als die optische Darstellung der Captions suggeriert.

Um das zu prüfen, solltest Du zuerst mal mit dem Debugger schauen, was genau passiert. (Sorry, hatte den Hinweis, auf des Fehlen des Debuggers, irgendwie nicht wahrgenommen )

Dort, wo Du dem Anwender das Ergebnis per ShowMessage anzeigst, könntest Du auch mal das Spielfeld ausgeben. Das könnte mit 'nem weiteren ShowMessage passieren:
Delphi-Quellcode:
ShowMessage(Format('%d %d %d',[SpielFeld[0,0],SpielFeld[1,0],SpielFeld[2,0]) + #13
+ Format('%d %d %d',[SpielFeld[0,1],SpielFeld[1,1],SpielFeld[2,1]) + #13
+ Format('%d %d %d',[SpielFeld[0,2],SpielFeld[1,2],SpielFeld[2,2]));
(Hoffentlich hab' ich hier jetzt nicht X und Y vertauscht.)
Die Anzeige sollte mit der Darstellung der Speedbutton-Captions übereinstimmen.
Wenn nicht, stimmt die erwartete Reichenfolge der Speedbuttons in Self.Controls nicht mit der tatsächlichen überein.
Anders kann ich mir die etwas chaotische Ergebnisermittlung, mit kaum einem richtigen Ergebnis, nicht vorstellen.

Geändert von nahpets (12. Apr 2017 um 13:19 Uhr) Grund: Ok - verstanden, nix Debugger - irgendwie überlesen :-(
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#10

AW: TicTacToe - Frage zum Programmablauf

  Alt 12. Apr 2017, 13:12
Zitat:
Um das zu prüfen, solltest Du zuerst mal mit dem Debugger schauen, was genau passiert.
Seine IDE hat keinen Debugger
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 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 by Thomas Breitkreuz