Autor Beitrag
Bravenesss
Hält's aus hier
Beiträge: 7



BeitragVerfasst: Sa 08.09.12 18:08 
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.

ausblenden volle Höhe 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Sa 08.09.12 19:13 
Hallo, :welcome:
In Deinem Text sind mehrere Fehler, die der Compiler doch anzeigen müsste.
ausblenden Delphi-Quelltext
1:
2:
3:
  If BitBtn1.Caption := ('X')
      BitBtn2.Caption = ('X')
      BitBtn3.Caption = ('X')

müsste durch
ausblenden 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

ausblenden 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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein

Für diesen Beitrag haben gedankt: Bravenesss
Bravenesss Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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 user profile iconNarses: Binaries aus dem Archiv entfernt.
Einloggen, um Attachments anzusehen!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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:
ausblenden 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
ausblenden 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. www.entwickler-ecke....search_id=2088686608 Dort kann man auch mal nachsehen.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Bravenesss Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 432
Erhaltene Danke: 107

Win 10
Delphi 6 Prof, Delphi 10.4 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: So 09.09.12 13:05 
user profile iconBravenesss hat folgendes geschrieben Zum zitierten Posting springen:
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.
user profile iconBravenesss hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Bravenesss Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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.
Einloggen, um Attachments anzusehen!
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: 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
ausblenden volle Höhe 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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Mo 10.09.12 01:03 
unter www.delphipraxis.net...mm-vereinfachen.html gibt es noch eine andere Form der Implementierung

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 10.09.12 15:00 
[url=forum.delphi-treff.d...elphi-programmieren]Crosspostings[/url] müssen als solche gekennzeichnet werden!
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: Mo 10.09.12 17:48 
user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
[url=forum.delphi-treff.d...elphi-programmieren]Crosspostings[/url] müssen als solche gekennzeichnet werden!


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.

Für diesen Beitrag haben gedankt: Devil1925, Mathematiker
Perlsau
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 10.09.12 18:08 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconPerlsau hat folgendes geschrieben Zum zitierten Posting springen:
[url=forum.delphi-treff.d...elphi-programmieren]Crosspostings[/url] müssen als solche gekennzeichnet werden!


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:

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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 7



BeitragVerfasst: 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 ;)