Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi for-Schleife - Aktion IMMER 5 mal ausführen (https://www.delphipraxis.net/50728-schleife-aktion-immer-5-mal-ausfuehren.html)

Yheeky 30. Jul 2005 16:52


for-Schleife - Aktion IMMER 5 mal ausführen
 
Hallo,

ich habe ein Spielfeld von einer Größe von 10x10. Man nehme nun mal an, das Spielfeld würde nur aus 1en und 2en bestehen. Ich möchte per Knopfdruck nun 5 Felder des Spielfeldes verändern, aber NUR wenn es keine 1 hat.
Mein Problem ist nun folgendes: Wenn ich eine einfache for Schleife benutze um das Verändern von nur 5 Feldern zu verwirklichen (for i := 1 to 5 do) kann ich ja mit einer einfachen if-Abfrage prüfen, ob das Feld eine 1 oder 2 hat. Wenn das Feld aber eine 1 hat, wird die if-Abfrage ignoriert und das "i" in der for-Schleife läuft weiter. Nun werden nur noch 4 Felder getauscht, obwohl ja 5 getauscht werden sollen. Ich habe versucht das mit einer repeat Schleife zu lösen, aber das habe ich nicht hinbekommen. Vielleicht kann mir ja einer einen entscheidenden Tipp geben. Danke.

DGL-luke 30. Jul 2005 16:54

Re: for-Schleife - Aktion IMMER 5 mal ausführen
 
du musst in die for-schleife eine while schleife hineinbauen, die erst aufhört, wenn tatsächlich ein feld gewechselt wurde.

aber was machst du, wenn es gar keien 5 felder mehr mit einer 2 gibt?

Yheeky 30. Jul 2005 16:57

Re: for-Schleife - Aktion IMMER 5 mal ausführen
 
Okay, was spricht gegen eine repeat...while Schleife?

Das kommt mit 100%iger Sicherheit nicht vor ;)

sECuRE 30. Jul 2005 16:57

Re: for-Schleife - Aktion IMMER 5 mal ausführen
 
Hi,

meinst du so etwas?
Delphi-Quellcode:
GeaenderteFelder:=0;
for c:=0 to 10 do
  for c2:=0 to 10 do
    if (Spielfeld[c,c2] = 2) and (GeaenderteFelder < 5) then begin
      Spielfeld[c,c2]:=1;
      Inc(GeanderteFelder);
    end;
Alle Variablen außer den Spielfeld sind vom Typ integer.

cu

Yheeky 30. Jul 2005 17:02

Re: for-Schleife - Aktion IMMER 5 mal ausführen
 
Nein, in deinem Fall wären es ja immer die Felder 0,0 + 1,0 + 2,0 + 3,0 + 4,0 wenn sie keine 1 haben. Es sollen ja zufällige Felder ausgewählt werden. Mit einer while...do Anweisung funktionierts nun, aber mich würde interessieren, warum repeat...until nicht funktioniert. Wahrscheinlich hab ich es nur falsch angewendet aber ich wundere mich trotzdem...Danke jedenfalls für den Tipp mit while...do

DGL-luke 30. Jul 2005 17:07

Re: for-Schleife - Aktion IMMER 5 mal ausführen
 
dann würde ich einfach fünf einzigartige zufallskoordinaten erstellen....

Yheeky 30. Jul 2005 17:11

Re: for-Schleife - Aktion IMMER 5 mal ausführen
 
Was heisst einzigartige? So habe ich es ja gemacht, aber wenn an einer Stelle X,Y eine 1 war, wurde die Bedingung ja nicht erfüllt.

arnold mueller 30. Jul 2005 18:04

Re: for-Schleife - Aktion IMMER 5 mal ausführen
 
Hallo Yheeky!

Ist es für Dich egal an welcher Stelle im Spielfeld die Suche beginnt?

Wenn die Suche immer oben links beginnen darf, dann würde ich es so machen:

Delphi-Quellcode:
var Field: array[1..10,1..10] of byte;
    Changed: byte;

(...)

Changed := 5;

for x := 1 to 10 do
begin
  for y := 1 to 10 do
  begin
    if Field[x,y] <> 1 then
    begin
      Field[x,y] := 2;
      dec(Changed);
      if Changed = 0 then Break;
    end;
  end;
end;

Andernfalls zufällige Werte für x und y wählen:

Changed := 5;

x := random(9);
y := random(9);

Repeat
    if Field[x+1,y+1] <> 1 then
    begin
      Field[x,y] := 2;
      dec(Changed);
    end;
until Changed = 0;

Oder Startpunkt zufällig wählen, und von dort nach rechts oder nach links suchen.


Oder vielleicht doch ganz anders ... :wink:

Bye,
Arno

[edit=alcaeus]delphi-Tags gesetzt. In Zukunft bitte selbst machen. Danke Mfg, alcaeus[/edit]

arnold mueller 30. Jul 2005 18:09

Re: for-Schleife - Aktion IMMER 5 mal ausführen
 
Zitat:

Zitat von arnold mueller
Hallo Yheeky!

if Field[x,y] <> 1 then

Field[x,y] := 2;

Arno

Das ist natürlich Quatsch, aber es geht doch um das Prinzip ...

Bye,
Arno


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