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