AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

zweidimensionale Arrays

Ein Thema von Mo53 · begonnen am 10. Jun 2021 · letzter Beitrag vom 14. Jun 2021
Antwort Antwort
Seite 4 von 4   « Erste     234
Michael II
Online

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
576 Beiträge
 
Delphi 10.4 Sydney
 
#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
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.320 Beiträge
 
Delphi 10.4 Sydney
 
#32

AW: zweidimensionale Arrays

  Alt 14. Jun 2021, 19:29
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...}
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 09:02 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf