Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - TicTacToe mit Delphi programmieren
Bravenesss - Sa 08.09.12 18:08
Titel: TicTacToe mit Delphi programmieren
Ich bin gerade Dabei ein Tic Tac Toe Spiel zu scripten.
Soweit alles gut... bloß komm ich nun nicht weiter wie ich es machen soll,
dass das Programm erkennt wann jemand gewonnen hat.
Es gibt ja insgesamt beim Tic Tac Toe nur 8 Lösungen, habe mir zunächst sowas dabei gedacht.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| var Form1: TForm1; spieler: integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin ShowMessage('Spieler 1 fängt an!'); spieler := 1; end;
procedure TForm1.BitBtn1Click(Sender: TObject); begin If Spieler =1 then begin spieler :=2; BitBtn1.Caption := ('X'); If BitBtn1.Caption := ('X') BitBtn2.Caption = ('X') BitBtn3.Caption = ('X') then Label1.Caption('Spieler 1 hat gewonnen!') end else if spieler=2 then begin BitBtn1.Caption := ('O'); spieler :=1; end; end; end; |
Das mit der Abfrage mit den Captions funktioniert aber nicht ganz...
hat jemand eine Lösung parat?
PS: Bin ein Anfänger und es ist nur ein Ausschnitt aus dem Quellcode (die Tic Tac Toe-Felder sind BitButtons).
mfG Bravenesss ;)
Mathematiker - Sa 08.09.12 19:13
Hallo, :welcome:
In Deinem Text sind mehrere Fehler, die der Compiler doch anzeigen müsste.
Delphi-Quelltext
1: 2: 3:
| If BitBtn1.Caption := ('X') BitBtn2.Caption = ('X') BitBtn3.Caption = ('X') |
müsste durch
Delphi-Quelltext
1:
| If (BitBtn1.Caption = 'X') and (BitBtn2.Caption = 'X') and (BitBtn3.Caption = 'X') |
ersetzt werden. Ein Vergleich erfordert = und nicht :=. Außerdem müssen mehrere Bedingungen durch einen logischen Operator verbunden werden, je nach Bedarf and = UND bzw. or = ODER.
Auch Label1.Caption('Spieler 1 hat gewonnen!') dürfte nichts werden.
Außerdem solltest Du Deinen Text so formatieren, dass zueinandergehörende begin und end besser zu erkennen sind. Also
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| procedure TForm1.BitBtn1Click(Sender: TObject); begin If Spieler =1 then begin spieler :=2; BitBtn1.Caption := 'X'; If (BitBtn1.Caption = 'X') and (BitBtn2.Caption = 'X') and (BitBtn3.Caption = 'X') then Label1.Caption:='Spieler 1 hat gewonnen!' end else if spieler=2 then begin BitBtn1.Caption := 'O'; spieler :=1; end; end; |
Damit ist in Deinem Text ein end zu viel. Außerdem erkennt man nun, dass die 2.Abfrage Spieler=2 überflüsig ist, da diese im else-Zweig Deines 1.Tests ausgeführt wird, d.h. wenn der Spieler nicht der 1. ist.
Vielleicht fügst Du das vollständige Projekt an. Dann kann man auch etwas mehr zur Logik Deiner Lösung sagen.
Beste Grüße
Mathematiker
Bravenesss - Sa 08.09.12 20:59
Danke für deine schnelle Antwort und deine Tipps :)
Hier das von dir gewünschte komplette Projekt.
Moderiert von
Narses: Binaries aus dem Archiv entfernt.
Mathematiker - Sa 08.09.12 22:29
Hallo Braveness,
ich habe mit Deinen Text angesehen und prinzipiell geht das schon so.
Mein erster Vorschlag wäre, dass Du vielleicht nicht 8 Methoden für die Schalter, sondern nur eine nutzt, d.h. jeder Schalter wird mit BitBtn1Click verknüpft:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure TForm1.BitBtn1Click(Sender: TObject); begin If Spieler =1 then begin spieler :=2; (sender as tbitbtn).Caption := 'X' end else begin spieler :=1; (sender as tbitbtn).Caption := 'O'; end; end; |
Über die Variable Sender erhälst Du, wer die Methode aufruft. Sind es nur Bitbuttons, gibt mein Beispiel auch keinen Fehler und mit (sender as tbitbtn) kannst Du auf den jeweiligen Schalter zugreifen.
Dann müsstest Du auch "nur" noch die acht Siegmöglichkeiten für jeden Spieler in der einen Methode testen.
Damit es für Dich übersichtlicher wird, würde ich auch die Lage der Schalter verändern, so dass links oben Nr. 1 daneben Nr. 2 usw. sind.
Die Abfrage für den 1.Spieler und die oberste Waagerechte und die Diagonale von links oben nach recht unten wäre dann
Delphi-Quelltext
1: 2: 3:
| If ((BitBtn1.Caption = 'X') and (BitBtn2.Caption = 'X') and (BitBtn3.Caption = 'X')) or ((BitBtn1.Caption = 'X') and (BitBtn5.Caption = 'X') and (BitBtn8.Caption = 'X')) then |
Natürlich musst Du dies noch erweitern.
Außerdem würde man wahrscheinlich eine andere Idee nutzen, z.B. ein zweidimensionales Feld, aber dass ist im Moment nicht das Thema.
Im Forum findest Du schon mehrere Einträge zu Tic Tac Toe.
http://www.entwickler-ecke.de/search.php?search_id=2088686608 Dort kann man auch mal nachsehen.
Beste Grüße
Mathematiker
Bravenesss - So 09.09.12 12:21
Danke nochmal lieber Mathematiker :)
Der erste Teil deiner Antwort hat mir prinzipiell gefallen, allerdings würde ich der Einfachheit erstmal als Anfänger
lieber meinen Teil mit den 9 BitBtn bei behalten. Das geht doch auch oder? Du meintest ja es wäre nur ein Vorschlag.
Nun zum 2tem Teil. Wie du bereits geschrieben hast habe ich die Formation der Schlater sinnvoll verändert, sodass
die Anordnung nun einen sinn beinhaltet.
Auch habe ich wie du schon geschrieben hast die If Schleife mit den and's erweitert, wie hier im Beispiel zu sehen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.BitBtn1Click(Sender: TObject); begin If Spieler =1 then begin spieler :=2; BitBtn1.Caption := ('X'); If ((BitBtn1.Caption = 'X') and (BitBtn2.Caption = 'X') and (BitBtn3.Caption = 'X')) then Label1.Caption('Spieler 1 hat gewonnen!') <---- Fehler : Operator oder Semikolon fehlt. end else if spieler=2 then begin BitBtn1.Caption := ('O'); spieler :=1;
end; end; |
Bloß kommt so der Fehler Operator oder Semikolon fehlt. Aber soweit ich weiß darf man doch in einer If then- Schleife keine Semikolons setzen? Erst ganz am Ende der Schleife sollte eins hin. Also wieso entsteht dort ein Fehler :o
mfG Brave
mandras - So 09.09.12 12:46
> Also wieso entsteht dort ein Fehler :o
Es müßte heißen: Label1.Caption := so wie weiter unten beim BitBtn1
Ich glaube das "end" nach dem Label1.Caption müßte noch weg.
Mathematiker - So 09.09.12 13:05
Bravenesss hat folgendes geschrieben : |
Bloß kommt so der Fehler Operator oder Semikolon fehlt. Aber soweit ich weiß darf man doch in einer If then- Schleife keine Semikolons setzen? Erst ganz am Ende der Schleife sollte eins hin. Also wieso entsteht dort ein Fehler |
Mandras hat es zwar schon gesagt, aber wenn Du meinen ersten Eintrag (Quelltext) liest, dann steht dort schon, dass es
label1.caption:='Text' heißen muss. Bei der Eigenschaft caption muss der Text immer mit := zugewiesen werden.
Die Aussage "keine Semikolons in der if-then-else-Schleife" stimmt nur insofern, dass vor dem else kein Semikolon steht.
Deshalb meckert der Compiler auch nicht, sondern das label1.caption ist es.
Bravenesss hat folgendes geschrieben : |
Der erste Teil deiner Antwort hat mir prinzipiell gefallen, allerdings würde ich der Einfachheit erstmal als Anfänger
lieber meinen Teil mit den 9 BitBtn bei behalten. Das geht doch auch oder? Du meintest ja es wäre nur ein Vorschlag. |
Selbstverständlich! Es war nur ein Vorschlag.
Beste Grüße
Mathematiker
Bravenesss - So 09.09.12 19:46
Ok 1000 Danke wieder einmal für deine Hilfe.
Ich hab nun die Abfrage gemacht, und es ging sogar solange ich nur die Abfrage mit X gemacht habe.
Also es wurde nur angezeigt wenn X gewinnt aber nicht O. Als ich dann aber den GENAU GLEICHEN Quellcode
für das O kopiert habe funktionierte es nicht mehr. Er überspringt aus unbekannten Grund einfach den Zug
von X und geht zu O über.
Wenn man dann nochmal auf den Button klickt kommt weiterhin kein X mehr sondern wieder ein O.
Das heißt es wird X immer irgendwie übersprungen... und es geht nur O.
Schaut es euch selber an... für die Übersicht habe ich mich nun nur auf den Button1 eingeschränkt, denn wenn
der gehen wird, werden ja alle Buttons gehen :)
Das Projekt ist wiedereinmal angehängt.
Mathematiker - So 09.09.12 21:21
Hallo Braveness,
Du hast irgendwie ein Problem mit der Verwendung von end. Formatiere den Text so um, dass Du siehst, welches begin zu welchem end gehört. Funktionieren wird
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| procedure TForm1.BitBtn1Click(Sender: TObject); begin If Spieler =1 then begin spieler :=2; BitBtn1.Caption := ('X');
If ((BitBtn1.Caption = 'X') and (BitBtn2.Caption = 'X') and (BitBtn3.Caption = 'X')) or((BitBtn4.Caption = 'X') and (BitBtn5.Caption = 'X') and (BitBtn6.Caption = 'X')) or((BitBtn7.Caption = 'X') and (BitBtn8.Caption = 'X') and (BitBtn9.Caption = 'X')) or((BitBtn1.Caption = 'X') and (BitBtn4.Caption = 'X') and (BitBtn7.Caption = 'X')) or((BitBtn2.Caption = 'X') and (BitBtn5.Caption = 'X') and (BitBtn8.Caption = 'X')) or((BitBtn3.Caption = 'X') and (BitBtn6.Caption = 'X') and (BitBtn9.Caption = 'X')) or((BitBtn1.Caption = 'X') and (BitBtn5.Caption = 'X') and (BitBtn9.Caption = 'X')) or((BitBtn3.Caption = 'X') and (BitBtn5.Caption = 'X') and (BitBtn7.Caption = 'X')) then Label1.Caption:='Spieler 1 hat gewonnen!' end else begin spieler :=1; BitBtn1.Caption := ('O');
If((BitBtn1.Caption = 'O') and (BitBtn2.Caption = 'O') and (BitBtn3.Caption = 'O')) or((BitBtn4.Caption = 'O') and (BitBtn5.Caption = 'O') and (BitBtn6.Caption = 'O')) or((BitBtn7.Caption = 'O') and (BitBtn8.Caption = 'O') and (BitBtn9.Caption = 'O')) or((BitBtn1.Caption = 'O') and (BitBtn4.Caption = 'O') and (BitBtn7.Caption = 'O')) or((BitBtn2.Caption = 'O') and (BitBtn5.Caption = 'O') and (BitBtn8.Caption = 'O')) or((BitBtn3.Caption = 'O') and (BitBtn6.Caption = 'O') and (BitBtn9.Caption = 'O')) or((BitBtn1.Caption = 'O') and (BitBtn5.Caption = 'O') and (BitBtn9.Caption = 'O')) or((BitBtn3.Caption = 'O') and (BitBtn5.Caption = 'O') and (BitBtn7.Caption = 'O')) then Label1.Caption:='Spieler 2 hat gewonnen!'; end; end; |
Elegant ist das aber nicht, vor allem, wenn Du das für jeden Schalter neu eingeben willst.
Beste Grüße
Mathematiker
Delphi-Laie - Mo 10.09.12 17:48
Von wem? Von dir doch bestimmt nicht! Warum übernimmst du mithin so altruistisch die Pflichten anderer? Und welchen Mehrwert bringt deine Präsentation deiner "Crosspostingjagdbeute" bei der Lösung des hier vorgetragenen Problems?
Was sich da mit wem "kreuzt", weiß ich zudem bis heute nicht.
Delete - Mo 10.09.12 18:08
Delphi-Laie hat folgendes geschrieben : |
Von wem? Von dir doch bestimmt nicht! Warum übernimmst du mithin so altruistisch die Pflichten anderer? Und welchen Mehrwert bringt deine Präsentation deiner "Crosspostingjagdbeute" bei der Lösung des hier vorgetragenen Problems?
Was sich da mit wem "kreuzt", weiß ich zudem bis heute nicht. |
Aus den
Richtlinien [
http://www.entwickler-ecke.de/sites.php?id=9]:
3.10 Crosspostings
Stellst du die gleiche Frage auch in einem anderen Forum, dann kennzeichne deine Frage bitte entsprechend und verlinke die Topics untereinander.
Und warum du dich hier so aufplusterst, weiß ich bis heute nicht ...
Delphi-Laie - Mo 10.09.12 19:10
Und wo ist der Beweis, daß es sich um die gleiche Person handelt?
Von "müssen", wie du es behauptetest, ist in den Richtlinien auch keine Rede, es ist eine Bitte. Warum die Bitte auch noch auf das Verhalten in anderen Foren ausgeweitet ist ("untereinander"), ist rätselhaft. Für das eigene Forum kann ich Richtlinien ja noch nachvollziehen...
Bravenesss - Fr 14.09.12 14:18
so danke :D jetzt geht es wirklich... das mit den ends versuche ich nun besser unter Kontrolle zuhalten :)
Bei allen die mir geholfen haben danke nochmal zunächst ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!