![]() |
TicTacToe
hallo,
Ich habe angefangen mit TicTacToe zu programmieren. Aber ohne zu gucken wer gewonnen hat sondern nur auf Buttons x und o. Aber jedes mal wen ich es öffnen will zeigt es mir eine Nachricht an !Expected '=' but';'found! und das wars, da ich noch ein Einsteiger bin weiß ich nicht wo der fehler ist, könnt ihr mal bitte rübergucken?
Delphi-Quellcode:
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure TForm1.Drueken; private { Private declarations } public { Public declarations } end; var Form1: TForm1; t: Integer;// variable zum Zählen implementation {$R *.dfm} procedure TForm1.Drueken;// Eigene procedure, es soll gezählt werden begin t:=t+1; end; procedure TForm1.Button1Click(Sender: TObject); begin Drueken; If t=1 then button1.caption 'x';// wenn t gleich 1 ist soll auf dem button x stehen If t=2 then button1.caption ('o') and t=0;// wenn t gleich 2 ist soll auf dem button o stehen //und es wieder auf 0gebracht werden end; procedure TForm1.Button2Click(Sender: TObject); begin Drueken; If t=1 then button2.caption ('x'); If t=2 then button2.caption ('o') and t=0; end; procedure TForm1.Button3Click(Sender: TObject); begin Drueken; If t=1 then button3.caption ('x'); If t=2 then button3.caption ('o') and t=0; end; procedure TForm1.Button4Click(Sender: TObject); begin Drueken; If t=1 then button4.caption ('x'); If t=2 then button4.caption ('o') and t=0; end; procedure TForm1.Button5Click(Sender: TObject); begin Drueken; If t=1 then button5.caption ('x'); If t=2 then button5.caption ('o') and t=0; end; procedure TForm1.Button6Click(Sender: TObject); begin Drueken; If t=1 then button6.caption ('x'); If t=2 then button6.caption ('o') and t=0; end; procedure TForm1.Button7Click(Sender: TObject); begin Drueken; If t=1 then button7.caption ('x'); If t=2 then button7.caption ('o') and t=0; end; procedure TForm1.Button8Click(Sender: TObject); begin Drueken; If t=1 then button8.caption ('x'); If t=2 then button8.caption ('o') and t=0; end; procedure TForm1.Button9Click(Sender: TObject); begin Druecken; If t=1 then button9.caption ('x'); If t=2 then button9.caption ('o') and t=0; end; Danke |
AW: TicTacTow
Hallo,
Du musst die Caption zuweisen!
Delphi-Quellcode:
// Falsch
If t=1 then button2.caption ('x'); // Richtig (Einrückung kann auch nicht schaden) If t=1 then button2.caption := 'x'; |
AW: TicTacTow
Und:
Delphi-Quellcode:
was soll das sein? Soll
If t=2 then button2.caption ('o') and t=0;
Delphi-Quellcode:
eine Zuweisung oder eine zweite Bedingung sein?
t=0
|
AW: TicTacTow
Mehre Anweisungen, die nach nach einer If-Prüfung ausgeführt werden sollen, in einen Anweisungsblock setzen.
Also statt
Delphi-Quellcode:
.
if t=2 then button1.caption ('o') and t=0;
so
Delphi-Quellcode:
Zuweisungen mit := also entgültig dann so
If t=2 then
begin button1.caption ('o'); t=0; end;
Delphi-Quellcode:
PS: Im Quelltext-Kommentar steht ja, was er erreichen will.
If t=2 then
begin button1.caption := 'o'; t := 0; end; PPS: Zuweisungs- und Vergleichsoperator (=, :=) und Anweisungsblöcke sind absolutes Basiswissen. Unbedingt nochmal mit den Grundlagen (Operatoren, Schlüsselwörter usw.) beschäftigen! |
AW: TicTacTow
Danke ich habe das auch noch geändert aber ich glaube der fehler ist
bei meiner eigene procedure. Kann das sein? Er zeigt immer noch den gleichen Fehler an. |
AW: TicTacTow
Ist das im ersten Beitrag dein KOMPLETTER Source aus der Form1? Wenn ja, wo ist der Header?
Delphi-Quellcode:
?
unit Form1;
interface uses ... type TForm1 = class(TForm) ... |
AW: TicTacTow
Nein der ist obendran aber den wollte ich nicht dazu tun.
|
AW: TicTacTow
Nochwas:
Es sollte so aussehen:
Delphi-Quellcode:
Du solltest dir mal irgendwo die Grundlagen (vor allem Syntax und Unit-/Programmaufbau!procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); private { Private declarations } public procedure Drueken; end; |
AW: TicTacTow
Warum sollte die Prozedur Drueken öffentlich sein. Wenn man mal davon absieht das drücken mit ck geschrieben wird. ;) Des weiteren warte ich noch auf eine Beantwortung meiner Frage.
|
AW: TicTacTow
Ja stimmt du hast recht. Im Private-Bereich wäre die Methode eigentlich besser aufgehoben.
|
AW: TicTacTow
Falsche Foren-Kategorie!
|
Dieses Thema wurde am "25. Apr 2011, 21:04 Uhr" von "mkinzler" aus dem Forum "Neuen Beitrag zur Code-Library hinzufügen" in das Forum "Object-Pascal / Delphi-Language" verschoben.
|
AW: TicTacTow
Zitat:
(War ja klar, das wieder so ein Thread kommen würde. Ich habe erst vor Tagen das Spiel selbst mal kurz dahinprogrammiert. Allerdings wollte ich nur mal den NegaMax-Algorithmus für die "KI" ausprobieren :-D) |
AW: TicTacToe
[EDIT]
Zitat:
außerdem würde ich dir empfehlen allen buttons das selbe Ereignis zuzuweisen:
Code:
statt 9 mal der selbe Code hast du dann 1 mal Code für 9 Buttonsprocedure TForm1.Button1Click(Sender: TObject); begin Druecken; If t = 1 then begin TButton(Sender).Caption := 'x'; end; If t = 2 then begin TButton(Sender).Caption := 'o' t := 0; end; end; ist nicht getestet nur eben hingeschrieben sollte aber funktionieren |
AW: TicTacToe
Oder so (allerdings ohne großartige Fehlerbehandlung):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const Captions: array[1..2] of Char = ('x', 'o'); begin Druecken; (Sender as TButton).Caption := Captions[t]; if t > 1 then t := 0; end; |
AW: TicTacToe
Da es in diesem Spiel nur zwei Spieler gibt, könnte man T auch als boolesche Variable deklarieren. Diese muss man pro Zug dann nur invertieren und erspart sich so die doppelte Abfrage, ob T einen bestimmten Wert hat oder nicht. Und dann bitte auch nicht global deklarieren :-D
Beispiel anhand von DeddyHs Vorschlag:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
const Captions: Array[Boolean] of Char = ('x', 'o'); begin T := not T; // Druecken; (Sender as TButton).Caption := Captions[T]; end; |
AW: TicTacToe
Moin,
Also ich denke nicht das er nach weiteren Lösungsansätzen gefragt hat sondern vielmehr um eine Lösung des Problems gebeten hat. Hier die LÖSUNG: Zitat:
Zitat:
Zitat:
Zitat:
Wenn der Inhalt der Procedure unten definiert wird muss TForm1 angegeben werden da es sich bei der Procedure um eine Procedure dieser TForm handelt. Denn es könnte ja auch mehrere TForms geben. Oben jedoch ist das TForm1. völlig sinnlos da sie natürlich zu dieser gehört sonst stände sie ja nicht bei den Procedures der TForm! RICHTIG IST : Oben muss es :
Delphi-Quellcode:
heißen und unten muss alles so bleiben.procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); procedure Button4Click(Sender: TObject); procedure Button5Click(Sender: TObject); procedure Button6Click(Sender: TObject); procedure Button7Click(Sender: TObject); procedure Button8Click(Sender: TObject); procedure Button9Click(Sender: TObject); procedure Drueken; private { Private declarations } public { Public declarations } end; Wie das keinem auffalen konnte :?: |
AW: TicTacToe
Dann schau Dir einmal die Beiträge 8 - 10 an. Wie Dir das nicht auffallen konnte :stupid:
|
AW: TicTacToe
Ja aber das verschieben der Procedure in den Public bereich ist totaler Schwachsinn :stupid:
|
AW: TicTacToe
Das steht in Beitrag 9 und 10. Liest Du auch, was andere schreiben?
|
AW: TicTacToe
ja aber beiträge wie
Zitat:
|
AW: TicTacToe
Mein Post bezog sich auf den darüber und mit der Fehlerbehandlung war gemeint, dass ich die Array-Grenzen nicht abprüfe. Aber das wird langsam OT, wir können ja nicht jeden Thread hier im Nachhinein analysieren, wo kämen wir da hin?
|
AW: TicTacToe
außerdem ist das hier kein Chat
könnte vielleicht mal einer dicht machen.:thumb: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:11 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