Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Schon wieder Arrays... Werte abwechselnd ändern? (https://www.delphipraxis.net/30249-schon-wieder-arrays-werte-abwechselnd-aendern.html)

malo 22. Sep 2004 15:52


Schon wieder Arrays... Werte abwechselnd ändern?
 
Und zwar hab ich ein (recht schwer zu beschreibenes) Problem:

Ich hab ein 2Dimensionales Array erstellt. Jetzt hab ich von Anfang an alle ArrayWerte auf 0 gesetzt.

Jetzt hab ich außerdem für jedes Array einen Button erstellt.

Wenn ich jetzt auf einen Button klicke, hab ich mithilfe eines if-Befehls dafür gesorgt, dass, wenn der jeweilige Array-Wert = 0 ist, ändert sich das Caption des Buttons und der Wert.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
if
Array[1,1] = 0 then
Button1.Caption := 'Geklickt!';
if
Array[1,1] = 0 then
Array[1,1] := 1;
So weit, so gut. Jetzt soll aber, wenn ich auf einen beliebigen anderen Button klicke, der jeweilige Wert in 2 geändert werden und es soll eine neue Caption hin. Beim nächsten Klick auf einen weiteren beliebigen anderen Button soll der Wert wieder auf 1 und die erste Caption hin. Nur wie soll ich das anstellen?

Tyrael Y. 22. Sep 2004 16:09

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
 if Array[1,1] = 0 then
 begin
   Button1.Caption := 'Geklickt!';
   Array[1,1] := 1;
 end
 else if Array[1,1] = 1 then
 begin
   Button1.Caption := 'Nicht Geklickt!';
   Array[1,1] := 0;
 end;  
end;

meinst du es so?


mfg

malo 22. Sep 2004 16:17

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Nein.

Gesetzt der Fall, als erstes nimmt der jeweilige Nutzer den Button1. Diesen betätigt er. Der jeweilige Array des Button1 (in meinem Fall [1,1] ) kriegt nun den Wert 1. Damit der Button danach nicht mehr aktiviert werden kann, hab ich das ja mit einem if befehl ausgedrückt. Button1 soll nun nicht mehr benutzt werden können.

Wenn jetzt der Nutzer Button2 (bzw. irgendeinen anderen Button) nutzt, soll der jeweilige Array des Buttons den Wert 2 bekommen. Nun soll auch dieser Button nicht mehr zu nutzen sein.

Wenn jetzt Button3 benutzt wird, soll der jeweilige Array wieder den Wert 1 erhalten. Und immer so weiter. Immer abwechselnd.

Das soll jetzt jedoch nicht Buttonspezifisch sein. Der Nutzer soll selbst entscheiden können, welchen Button er benutzt, die Werte sollen immer abwechselnd in 1 und 2 geändert werden.

Ich hoffe, das war jetzt verständlich.

alcaeus 22. Sep 2004 17:30

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Hi malo,

dann will ichs mal versuchen.
Du hast drei Buttons: Button1, 2 und 3.
Klickt Benutzer auf den ersten Button, dann soll dieser disabled werden und 1 in das Array geschrieben werden.
Klickt er nun auf den nächsten, so soll auch dieser disabled werden und 2 kommt ins Array.
Und sobald er auf den 3. Klickt, so soll wieder 0 ins Array, aber was geschieht mit den anderen Buttons?

Zum Array:
Delphi-Quellcode:
procedure Button1Click(Sender: TObject);
  TButton(Sender).Enabled := False;
  MeinArray[1,1] := (MeinArray[1,1]+1) mod 3;
end;
Der Code kommt in eine OnClick, welche für alle 3 Buttons die gleiche ist.
Nun bleibt nur noch das Problem mit dem dritten Button, aber die Werte im Array gehen von 0 auf 1, dann auf 2 und anschließend wieder auf 0.

Falls ich dich jetzt komplett falsch verstanden habe, dann musst du dein Problem nochmal erklären ;)

Greetz
alcaeus

ibp 22. Sep 2004 17:49

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
habs mir nun drei mal durchgelesen :gruebel:

hä?

schreib doch mal bitte welcher button zu welchem array gehört
z.b.
button1 zu array[1,1]
button2 zu array[2,1] oder zu button1 zu array[1,2]

wie groß ist das array?

und welcher status soll von button3 an z.b. button1 gesendet werden?

malo 22. Sep 2004 17:50

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
grrrr... ich bin doch unverständlicher, als ich dachte...

Es ist im Grunde egal, welchen Button man anklickt. Beim ersten mal soll der Wert des jeweiligen Arrays, auf 1 gesetzt werden. Beim zweiten Mal soll der Wert auf 2 gesetzt werden. Beim dritten mal wieder auf 1.
Wobei es mehr als nur drei Buttons gibt. Insg. hab ich 9 verschiedene Buttons.

Ist das überhaupt möglich? Also immer abwechselnd den jeweiligen Array-Wert auf 1 und 2 zu setzen, wobei man jeden Button nur EINMAL klicken soll.

malo 22. Sep 2004 17:56

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
@ibp: Ich hab 9 Arrays [1..3, 1..3].
Button1 hat 1,1, Button2 hat 1,2, Button3 hat 1,3, Button4 hat 2,1 usw.

Und in Sachen Status: Ich will nur, dass beim ersten Klick auf einen Button der Arraywert auf 1 gesetzt wird, Klick auf einen zweiten button soll der Arraywert auf 2 gesetzt werden. Dann soll wieder beim nächsten Button der jeweilige Wert auf 1 gesetzt werden. Dann auf 2. Und immer so weiter.

Dabei soll jeder button nur EINMAL zu benutzen sein.

ibp 22. Sep 2004 18:03

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Zitat:

Zitat von malo
@ibp: Ich hab 9 Arrays [1..3, 1..3].
Und in Sachen Status: Ich will nur, dass beim ersten Klick auf einen Button der Arraywert auf 1 gesetzt wird, Klick auf einen zweiten button soll der Arraywert auf 2 gesetzt werden.

... welcher array wert soll auf zwei, der von dem button oder der von dem button davor?

malo 22. Sep 2004 19:36

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Zitat:

Zitat von ibp
Zitat:

Zitat von malo
@ibp: Ich hab 9 Arrays [1..3, 1..3].
Und in Sachen Status: Ich will nur, dass beim ersten Klick auf einen Button der Arraywert auf 1 gesetzt wird, Klick auf einen zweiten button soll der Arraywert auf 2 gesetzt werden.

... welcher array wert soll auf zwei, der von dem button oder der von dem button davor?

Der erste Button, der angeklickt wird, soll den arraywert 1 vergeben. Der zweite Button, der angeklickt wird, soll den Arraywert 2 vergeben. Wobei es für den Nutzer des Programms egal sien sollte, welchen Button er anklickt: der erste, den der Nutzer anklickt, soll den arraywert 1 vergeben. Der nächste vergibt 2. Dann wieder arraywert 1. Der nächste angeklickte Button arraywert 2. Und immer so weiter.

xineohp 22. Sep 2004 20:14

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
moin,

wenn ich das jetzt richtig verstanden und mir korrekt vorstelle, dann soll das so eine Art Drei-Gewinnt werden?
Wobei die 9 Buttons die 9 Felder darstellen, der eine Spieler 1en und der zweite 2en verteilt?!

liege ich mit dieser vermutung richtig?

Wenn ja, dann sollen ja 1en und 2en immer abwechseld verteilt werden, somit muss du doch nur prüfen/mitzählen ob die Gesamtzahl an gedrückten Buttons gerade oder ungerade ist und dann jeweils 1 bzw. 2 ein das jeweilige array feld eintragen.

malo 22. Sep 2004 20:20

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Zitat:

Zitat von xineohp
moin,

wenn ich das jetzt richtig verstanden und mir korrekt vorstelle, dann soll das so eine Art Drei-Gewinnt werden?
Wobei die 9 Buttons die 9 Felder darstellen, der eine Spieler 1en und der zweite 2en verteilt?!

liege ich mit dieser vermutung richtig?

Wenn ja, dann sollen ja 1en und 2en immer abwechseld verteilt werden, somit muss du doch nur prüfen/mitzählen ob die Gesamtzahl an gedrückten Buttons gerade oder ungerade ist und dann jeweils 1 bzw. 2 ein das jeweilige array feld eintragen.

bingo, genau das soll es werden :thumb: :!:

Den unteren Teil versteh ich jetzt nicht wirklich... soll man jetzt selbst aufpassen, ob man den jeweiligen Button schon gedrückt hat oder wie? :???:

xineohp 22. Sep 2004 20:29

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
1. jeder Button darf nur einmal gedrückt werden --> Im OnClick-Ereignis: ButtonX.enabeld := false;
2. fest stellen welcher Spieler an der Reihe ist bzw. welche Zahl eingetragen werden soll
--> eine globale Variable einführen die speichert welcher Spieler zu letzt gesetzt hat
--> Im OnClick-Ereignis:
Delphi-Quellcode:
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
end;
3. Wert in das array eintragen --> Im OnClick-Ereignis: array[X,Y] := LastPlayer

malo 22. Sep 2004 20:34

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
aha... hört sich schonmal nicht schlecht an.

nur: welchen Typ soll die Variable lastplayer haben? :?:

xineohp 22. Sep 2004 20:37

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
integer natürlich :roll: ... wir wollen schließlich was zählen :wink:

FAlter 22. Sep 2004 20:38

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Von einem Ordinaltyp auf jeden Fall.

Und in diesem Fall kein Char o. ä.

Wie wäre es den mit Integer?

malo 22. Sep 2004 21:11

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Wenn ich jetzt aber array[X,Y] := LastPlayer hab (natürlich hab ich X und Y durch die jeweiligen Arraydaten ersetzt) kommt da immer "Konstantenausdruck erwartet". Was soll ich jetzt machen? :???:

xineohp 22. Sep 2004 21:34

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
also du solltest folgende Deklarationen unter var stehen haben:

array: array[1..3,1..3] of integer;
LastPlayer: integer;

Dann sollte es keine Fehler geben. Wenn doch, poste mal deinen Quellcode.

malo 23. Sep 2004 13:25

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Ich hab jetzt mal das oberste weggelassen und nur alles ab var reinkopiert ;)

Delphi-Quellcode:
var
  Form1: TForm1;
  TicTacToe : array [1..3, 1..3] of integer;
  LastPlayer : integer;

implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
TicTacToe[1,1] := 0;
TicTacToe[1,2] := 0;
TicTacToe[1,3] := 0;
TicTacToe[2,1] := 0;
TicTacToe[2,2] := 0;
TicTacToe[2,3] := 0;
TicTacToe[3,1] := 0;
TicTacToe[3,2] := 0;
TicTacToe[3,3] := 0;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.enabled := false;
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
TicTacToe[1,1] := LastPlayer;
end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Button2.enabled := false;
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
TicTacToe[1,2] := LastPlayer;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
Button3.enabled := false;
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
TicTacToe[1,3] := LastPlayer;
end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Button4.enabled := false;
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
TicTacToe[2,1] := LastPlayer;
end;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
Button5.enabled := false;
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
TicTacToe[2,2] := LastPlayer;
end;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
Button6.enabled := false;
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
TicTacToe[2,3] := LastPlayer;
end;
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
Button7.enabled := false;
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
TicTacToe[3,1] := LastPlayer;
end;
end;

procedure TForm1.Button8Click(Sender: TObject);
begin
Button8.enabled := false;
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
TicTacToe[3,2] := LastPlayer;
end;
end;

procedure TForm1.Button9Click(Sender: TObject);
begin
Button9.enabled := false;
case LastPlayer of
  0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
  1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
  2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
TicTacToe[3,3] := LastPlayer;
end;
end;

end.
PS: Ich weiß, ich faules Schwein hab die case-Befehle direkt kopiert (mit kommentaren), aber... naja, sollte ja nicht das Hindernis sein.

Delphi-Quellcode:
TicTacToe[1,1] := LastPlayer;
und genau da tritt die Fehlermeldung auf "Konstantenausdruck erwartet... übrigens bei allen Befehlen dieser Art.

ibp 23. Sep 2004 13:41

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Zitat:

Zitat von malo
Ich hab jetzt mal das oberste weggelassen und nur alles ab var reinkopiert ;)

procedure TForm1.FormCreate(Sender: TObject);
begin
//..
LastPlayer:=0;

end;

damit sollte dein problem gelöst sein!

scp 23. Sep 2004 13:41

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Du hast die Zeile eins zu weit oben eingefügt, das Case muss ja erstmal durch end; abgeschlossenwerden:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.enabled := false;
  case LastPlayer of
    0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
    1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
    2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
  end;
  TicTacToe[1,1] := LastPlayer;
end;

ibp 23. Sep 2004 14:02

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button1.enabled := false;
  case LastPlayer of
    0: LastPlayer := 1; // noch kein Button gedrückt, also kommt Spieler 1 drann
    1: LastPlayer := 2; // Spieler 1 war drann, also muss jetzt Spieler 2 rann
    2: LastPlayer := 1; // Spieler 2 war drann, also muss jetzt Spieler 1 rann
  end;
  TicTacToe[1,1] := LastPlayer;
end;
könntest du auch vereinfachen zu:

du definierst den tag des jeweiligen buttons mit:

button1.tag:=11
button5.tag:=22
button7.tag:=31
etc.
dann das onclick erignis auf folgente procedure

Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
var BtnNr:integer;
    Zeile,Spalte:integer;
begin
  TButton(Sender).Enabled := false; // aktueller button kann nicht mehr gedrückt werden
  BtnNr:=TButton(Sender).Tag; // Button-Nr

  Zeile:=BtnNr mod 10;
  Spalte:=BtnNr-Zeile;

  inc(LastPlayer); // +1
  if LastPlayer>2 then
    LastPlayer:=1;

  TicTacToe[Zeile,Spalte] := LastPlayer;
end;

scp 23. Sep 2004 14:06

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Delphi-Quellcode:
Spalte:=(BtnNr-Zeile) div 10;
nicht vergessen :)

malo 23. Sep 2004 14:16

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Naja, ich hab jetzt einfach mal das end überall verschoben... diese vereinfachung merk ich mir jedoch für das nächste Mal, bin jetzt nur zu faul alles zu ändern und mir dann auch noch zu merken, was die einzelnen Befehle da machen :roll:

Naja, dann kann ich mich ja mal weiter auf den Weg zum fertigen Spiel machen... Danke nochmal an alle, die mir geholfen haben, und auch an die, die es versucht haben :mrgreen:

ibp 23. Sep 2004 14:19

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
Zitat:

Zitat von scp
Delphi-Quellcode:
Spalte:=(BtnNr-Zeile) div 10;
nicht vergessen :)

stimmt ein fehler, aber nicht so sondern:


Delphi-Quellcode:
Spalte:=BtnNr-Zeile*10;

scp 23. Sep 2004 16:48

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
[ot]
Wieso *10 ?
Delphi-Quellcode:
  BtnNr := 23;

  Zeile:=BtnNr mod 10; // Zeile = 3
  Spalte:=(BtnNr-Zeile) div 10; // 23-3 = 20; 20/10 = 2
[/ot]

ibp 24. Sep 2004 08:46

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
@scp

also bei mir ist:
Code:
Zeile= 23 div 10 = 2
Spalte= 23-(2*10) = 3

scp 24. Sep 2004 10:22

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
So gehts natürlich auch, du hast aber bei Zeile im Originalcode mod verwendet, was durchaus die bessere Wahl war, weil es genauer ist.

ibp 24. Sep 2004 10:29

Re: Schon wieder Arrays... Werte abwechselnd ändern?
 
stimmt sollte eigentlich div sein!

genauer kann nicht sein, da mod sich aus div berechnet:

x mod y = x - (x div y) * y.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:37 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