Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   TicTacToe (https://www.delphipraxis.net/159476-tictactoe.html)

Tytomik 29. Mär 2011 20:59


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

Neutral General 29. Mär 2011 21:03

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';

Luckie 29. Mär 2011 21:05

AW: TicTacTow
 
Und:
Delphi-Quellcode:
If t=2 then button2.caption ('o') and t=0;
was soll das sein? Soll
Delphi-Quellcode:
t=0
eine Zuweisung oder eine zweite Bedingung sein?

Satty67 29. Mär 2011 21:05

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:
If t=2 then
begin
  button1.caption ('o');
  t=0;
end;
Zuweisungen mit := also entgültig dann so
Delphi-Quellcode:
If t=2 then
begin
  button1.caption := 'o';
  t := 0;
end;
PS: Im Quelltext-Kommentar steht ja, was er erreichen will.

PPS: Zuweisungs- und Vergleichsoperator (=, :=) und Anweisungsblöcke sind absolutes Basiswissen. Unbedingt nochmal mit den Grundlagen (Operatoren, Schlüsselwörter usw.) beschäftigen!

Tytomik 29. Mär 2011 21:20

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.

nuclearping 29. Mär 2011 21:32

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)
     ...
?

Tytomik 29. Mär 2011 21:36

AW: TicTacTow
 
Nein der ist obendran aber den wollte ich nicht dazu tun.

Neutral General 29. Mär 2011 21:38

AW: TicTacTow
 
Nochwas:

Es sollte so aussehen:
Delphi-Quellcode:
   
    procedure Button8Click(Sender: TObject);
    procedure Button9Click(Sender: TObject);  
  private
    { Private declarations }
  public
    procedure Drueken;
  end;
Du solltest dir mal irgendwo die Grundlagen (vor allem Syntax und Unit-/Programmaufbau!

Luckie 29. Mär 2011 21:49

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.

Neutral General 29. Mär 2011 22:49

AW: TicTacTow
 
Ja stimmt du hast recht. Im Private-Bereich wäre die Methode eigentlich besser aufgehoben.

isilive 30. Mär 2011 02:43

AW: TicTacTow
 
Falsche Foren-Kategorie!

DP-Maintenance 25. Apr 2011 20:04

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.

Deep-Sea 26. Apr 2011 08:15

AW: TicTacTow
 
Zitat:

Zitat von Neutral General (Beitrag 1091873)
Im Private-Bereich wäre die Methode eigentlich besser aufgehoben.

Und das z.B. die OnClick-Methode ganze 9 mal redundant vorkommt, ist da nicht so schlimm?! :P

(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)

sHoXx 26. Apr 2011 08:21

AW: TicTacToe
 
[EDIT]
Zitat:

Und das z.B. die OnClick-Methode ganze 9 mal redundant vorkommt, ist da nicht so schlimm?!
[/EDIT]

außerdem würde ich dir empfehlen allen buttons das selbe Ereignis zuzuweisen:

Code:

procedure 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;
statt 9 mal der selbe Code hast du dann 1 mal Code für 9 Buttons

ist nicht getestet nur eben hingeschrieben sollte aber funktionieren

DeddyH 26. Apr 2011 08:31

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;

Deep-Sea 26. Apr 2011 08:48

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;

roboter202 27. Apr 2011 10:35

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:

Delphi-Quellcode:
procedure TForm1.Drueken;

und unten
Zitat:

Delphi-Quellcode:
procedure TForm1.Drueken;// Eigene procedure, es soll gezählt werden

wenn man das mal vergleicht mit

Zitat:

Delphi-Quellcode:
procedure Button9Click(Sender: TObject);

und
Zitat:

Delphi-Quellcode:
procedure TForm1.Button9Click(Sender: TObject);

Fällt jeden doch wohl schnell ein unterschied auf.

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:
   
    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;
heißen und unten muss alles so bleiben.

Wie das keinem auffalen konnte :?:

DeddyH 27. Apr 2011 10:41

AW: TicTacToe
 
Dann schau Dir einmal die Beiträge 8 - 10 an. Wie Dir das nicht auffallen konnte :stupid:

roboter202 27. Apr 2011 10:43

AW: TicTacToe
 
Ja aber das verschieben der Procedure in den Public bereich ist totaler Schwachsinn :stupid:

DeddyH 27. Apr 2011 10:44

AW: TicTacToe
 
Das steht in Beitrag 9 und 10. Liest Du auch, was andere schreiben?

roboter202 27. Apr 2011 10:48

AW: TicTacToe
 
ja aber beiträge wie
Zitat:

Zitat von DeddyH (Beitrag 1096955)
(allerdings ohne großartige Fehlerbehandlung)

deuten für mich darauf hin das es noch nicht einsichtig genug war und man aus der Antwort eher annahm das der Fehler durch die Position der Zuweisung der Procedure begründet war und nicht durch die fehlerhafte Definition der Procedure selbst. :stupid::cyclops:

DeddyH 27. Apr 2011 10:51

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?

roboter202 27. Apr 2011 10:55

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 18:16 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