Thema: Delphi Minesweeper

Einzelnen Beitrag anzeigen

Popov
(Gast)

n/a Beiträge
 
#113

AW: Minesweeper

  Alt 26. Mär 2015, 19:05
@saii

Ich hab mir dein Beispiel angeguckt. Zuerst mal das:
Delphi-Quellcode:
  for k:=0 to 25 do
  begin
        A:=random(15);
        B:=random(15);
        IntA[A,B]:=9;
        StringGrid1.Cells[A,B]:='X';
  end;
Fangen wir damit an, dass bei dir alle Werte hardcoded sind. Das ist jetzt kein Fehler, aber wenn du Änderungen vornehmen willst, dann musst du alles in deinem Quellcode ändern. Schon was von Konstanten gehört?

Aber zurück zu dem Beispiel oben. So wie es aussieht willst du oben 26 Minen setzen. Wenn du am Ende tatsächlich 26 Minen gesetzt hast, dann eher nur zufällig, denn du prüfst nicht ob in dem Feld bereits eine Mine gesetzt ist. Theoretisch könnte es auch vorkommen, dass Random 26 Mal das gleiche Feld auswählt. Wird in der Praxis nicht vorkommen, trotzdem - ob du tatsächlich 26 Minen in 26 Felder setzt ist eher zufällig.

Sowas kann man ganz leicht mit einer Repeat Schleife prüfen.
Delphi-Quellcode:
  for k:=0 to 25 do
  begin
    repeat
        A:=random(15);
        B:=random(15);
    until IntA[A,B]<>9;

    IntA[A,B]:=9;
    StringGrid1.Cells[A,B]:='X';
  end;
Was mir auch aufgefallen ist - irgendwie kannst du dich nicht entscheiden ob du mit dem Array oder Panelen arbeitest.
Delphi-Quellcode:
    IntA[A,B]:=9;
    StringGrid1.Cells[A,B]:='X';
Kleiner Tipp - trenne beides. Arbeite nur mit dem Array, nutze das Panel nur zur Darstellung. Mal fragst du das Array ab, dann wieder mal die Captions der Panele.

Und vorerst letztens - schon mal was von Funktionen gehört? Ich weiß zwar nicht was die Zeile soll (hab sie noch nicht analysiert), aber diese Abfrage kommt 8 mal vor:
Delphi-Quellcode:
if (h+1>=0) and (h+1<=14) and (j>=0) and (j<=14) then PanelA[h+1,j].Caption:='_';
...
Wie wäre es wenn du das in eine Funktion packst? Die könnte so aussehen:
Delphi-Quellcode:
function AbfrageHJ(a, b, c, d: Integer): Boolean;
begin
  Result := (a=0) and (b<=14) and (c>=0) and (d<=14);
end;
Die Zeile in der Prozedur CannonFire würde dann so aussehen:
Delphi-Quellcode:
if AbfrageHJ(h+1, h+1, j, j) then PanelA[h+1,j].Caption:='_';
...
  Mit Zitat antworten Zitat