Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   zweidimensionale Arrays (https://www.delphipraxis.net/208109-zweidimensionale-arrays.html)

Michael II 14. Jun 2021 09:01

AW: zweidimensionale Arrays
 
- 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.

Blup 14. Jun 2021 18:29

AW: zweidimensionale Arrays
 
Zitat:

Zitat von Mo53 (Beitrag 1491059)
Mein Programm steht jetzt mittlerweile fast, jedoch habe ich zwei Probleme an denen ich fast verzweifel, zum einen sieht das Programm nach der zweiten Abfrage jedes Zeichen als gültig und deckt sofort auf ohne überhaupt die dritte Abfrage auszuführen, zum anderen markiert das Programm das ausgewählte Feld nicht mit einer Bombe sobald ich auf b drücke, sondern deckt sofort auf. Ich wäre echt über jede Hilfe dankbar.

Lies dir deine Aufgabenstellung noch einmal genau durch:

Das Spiel endet, wenn alle Zellen außer denen mit Bomben aufgedeckt wurden, wenn der Spieler eine Bombe "aufgedeckt" hat, wenn er eine Zelle fälschlicherweise als Bombe markiert hat oder wenn bei einer der Eingaben mit x/X das Spiel abgebrochen wurde.

Einen dritten Zustand "nicht aufgedeckt aber mit Bombe markiert" kannst du in deiner Datenstruktur nicht abbilden.
Dafür müsste z.B. visible[x, y] drei Zustände annehmen können (also nicht nur True oder False).
Diese Regel in der Aufgabenstellung vereinfacht ein wenig das Programm.

Deshalb auch bei der Ausgabe:
Delphi-Quellcode:
   if not visible[x, y] then
   begin
     {...zugedeckte Felder darstellen...}
   end
   else
   begin
     {...aufgedeckte Felder darstellen...}
     if field[x, y] = Bombe then
     begin
       s := 'ð';
       SetColor({...});
     end    
     else {...usw...}


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 Uhr.
Seite 4 von 4   « Erste     234   

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