Einzelnen Beitrag anzeigen

Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
760 Beiträge
 
Delphi 11 Alexandria
 
#31

AW: zweidimensionale Arrays

  Alt 14. Jun 2021, 10:01
- Wähle das Menu Ansicht > Debug Fenster > Lokale Variablen.
Setze im Code an sinnvollen Stellen Breakpoints. Starte dein Programm. Dann siehst du sicher sofort, wo's noch nicht klappt.

- Wenn du in Funktionen auf den Rückgabewert Result zugreifen willst (beim Debuggen oft notwendig), musst du {$R+,Q+,X-} ersetzen durch {$R+,Q+}.

- In der Aufgabe steht: "FIELDSIZE für die Spielfeldbreite bzw. -höhe (das Feld ist also immer quadratisch). Initial könnt Ihr diese auf 7 setzen, andere Größen sollen aber auch möglich sein."
Fragen:
> Ist bei deinem Programm FELDSIZE=10 möglich?
> Wenn von dir jemand FELDSIZE=9 fordert, solltest du dein Programm innert fünf Sekunden anpassen können. Klappt dies?

- printFeld. Du lässt die Bomben zählen, aber der Fall n=8 wird von dir nicht bearbeitet.

Du schreibst:

Delphi-Quellcode:
      if not visible[x, y] then
      begin
        setTextColor(7);
        s := ''
      end
      else if not visible[x, y] and (field[x, y] = Bombe) then
        s := 'ð'
      else
s := 'ð' wird nie ausgeführt, da du den Fall visible[x, y]=FALSE bereits vorher abgearbeitet hast. (Eventuell wäre eh if visible[x, y] and (field[x, y] = Bombe) näher an dem, was du willst? Und nach dem Abschnitt if not visible[x,y] then begin ...end weisst du dass visible[x,y] TRUE ist, also musst du darauf nicht testen. )


In printField schreibst du einen case Roman fürs Abarbeiten der Fälle n=0 bis 7.

Viel kürzer wäre dies: Definiere einen array farbe für die neun Fälle 0 bis 8:

Delphi-Quellcode:
procedure printField(field: TFIELD; visible: TVISIBLE);

const
  farbe : array[0..8] of word = ( 0,9,2,12,1,4,3,15,15 );

begin
...
      begin
        n := countBombs(field, x, y);
        setTextColor(farbe[n]);
        if n>0 then s:= inttostr(n) else s:= ' ';
      end;
...
end;

In der Funktion
function readInput(var x, y: TSize; var cancel, bomb: Boolean): Boolean;
schreibst du ziemlich am Anfang
readInput := gueltig or cancel or bomb;
Wozu diese Zeile gut sein soll...?

In der gleichen Funktion (readInput):
- Du initialisierst bomb, x, y nicht.
- Du definierst eine Variable field: TFIELD; Diese Variable enthält nutzlose Daten. (Deine Variable field in readInput und die global definierte Variable field haben ausser den Namen nix gemeinsam. Beim Debuggen würde dir auffallen, dass deine lokale field mit "Müll" gefüllt ist.)

readInput solltest du überdenken: 1. Du hast dort wo readInput steht (gemäss Aufgabe auch stehen muss), keinen Zugriff auf die globale Variable field. 2. Gemäss Aufgabenstellung muss readInput nur den User-Input prüfen.

Im Hauptprogramm schreibst du cancel := readInput...
readInput sollte aber gemäss Aufgabe TRUE zurückgeben, wenn der User sinnvolle Daten eingibt, sonst FALSE. So wie du's momentan schreibst wird cancel=TRUE, wenn der User sinnvolle Daten eingegeben hat.
Michael Gasser

Geändert von Michael II (15. Jun 2021 um 08:31 Uhr)
  Mit Zitat antworten Zitat