![]() |
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:
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?
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; |
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 |
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. |
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:
Der Code kommt in eine OnClick, welche für alle 3 Buttons die gleiche ist.
procedure Button1Click(Sender: TObject);
TButton(Sender).Enabled := False; MeinArray[1,1] := (MeinArray[1,1]+1) mod 3; end; 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 |
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? |
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. |
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. |
Re: Schon wieder Arrays... Werte abwechselnd ändern?
Zitat:
|
Re: Schon wieder Arrays... Werte abwechselnd ändern?
Zitat:
|
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. |
Re: Schon wieder Arrays... Werte abwechselnd ändern?
Zitat:
Den unteren Teil versteh ich jetzt nicht wirklich... soll man jetzt selbst aufpassen, ob man den jeweiligen Button schon gedrückt hat oder wie? :???: |
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:
3. Wert in das array eintragen --> Im OnClick-Ereignis: array[X,Y] := LastPlayer
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; |
Re: Schon wieder Arrays... Werte abwechselnd ändern?
aha... hört sich schonmal nicht schlecht an.
nur: welchen Typ soll die Variable lastplayer haben? :?: |
Re: Schon wieder Arrays... Werte abwechselnd ändern?
integer natürlich :roll: ... wir wollen schließlich was zählen :wink:
|
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? |
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? :???:
|
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. |
Re: Schon wieder Arrays... Werte abwechselnd ändern?
Ich hab jetzt mal das oberste weggelassen und nur alles ab var reinkopiert ;)
Delphi-Quellcode:
PS: Ich weiß, ich faules Schwein hab die case-Befehle direkt kopiert (mit kommentaren), aber... naja, sollte ja nicht das Hindernis sein.
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.
Delphi-Quellcode:
und genau da tritt die Fehlermeldung auf "Konstantenausdruck erwartet... übrigens bei allen Befehlen dieser Art.
TicTacToe[1,1] := LastPlayer;
|
Re: Schon wieder Arrays... Werte abwechselnd ändern?
Zitat:
|
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; |
Re: Schon wieder Arrays... Werte abwechselnd ändern?
Delphi-Quellcode:
könntest du auch vereinfachen zu:
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; 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; |
Re: Schon wieder Arrays... Werte abwechselnd ändern?
Delphi-Quellcode:
nicht vergessen :)
Spalte:=(BtnNr-Zeile) div 10;
|
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: |
Re: Schon wieder Arrays... Werte abwechselnd ändern?
Zitat:
Delphi-Quellcode:
Spalte:=BtnNr-Zeile*10;
|
Re: Schon wieder Arrays... Werte abwechselnd ändern?
[ot]
Wieso *10 ?
Delphi-Quellcode:
[/ot]
BtnNr := 23;
Zeile:=BtnNr mod 10; // Zeile = 3 Spalte:=(BtnNr-Zeile) div 10; // 23-3 = 20; 20/10 = 2 |
Re: Schon wieder Arrays... Werte abwechselnd ändern?
@scp
also bei mir ist:
Code:
Zeile= 23 div 10 = 2
Spalte= 23-(2*10) = 3 |
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.
|
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