AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

zweidimensionale Arrays

Ein Thema von Mo53 · begonnen am 10. Jun 2021 · letzter Beitrag vom 14. Jun 2021
Antwort Antwort
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: zweidimensionale Arrays

  Alt 10. Jun 2021, 19:04
Alles Klar, Vielen Dank für die umfangreichen Erklärungen
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: zweidimensionale Arrays

  Alt 10. Jun 2021, 21:35
Ich hab hier noch ein Problem mit der Funktion readInput.
Und zwar bleibt readInput immer false auch wenn gueltig := true oder cancel := true ist

Delphi-Quellcode:
{$APPTYPE CONSOLE}
{$R+,Q+,X-}

uses
  System.SysUtils,
  Windows;

const
  FIELDSIZE: Byte = 7;

type
  TSize = 1 .. 7;
  TSTATE = (leer, Bombe);
  TDIR = (Nord, NordOst, Ost, SüdOst, Süd, SüdWest, West, NordWest);
  TFIELD = array [TSize, TSize] of TSTATE;
  TVISIBLE = array [TSize, TSize] of Boolean;

const
  OFFSET_X: array [TDIR] of integer = (0, 1, 1, 1, 0, -1, -1, -1);
  OFFSET_Y: array [TDIR] of integer = (1, 1, 0, -1, -1, -1, 0, 1);

  // Setzt die Ausgabeposition der Konsole auf die angegebene Koordinate.
  // @param
  // x,y - zu setzende Position in der Konsole an 0/0 = oben links
procedure setConsolePosition(x, y: Byte);
var
  coord: _COORD;
begin
  coord.x := x;
  coord.y := y;
  if SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord) then;
end;

// Setzt die Textfarbe der Konsole
// @param
// color - zu setzender Farbwert
procedure setTextColor(color: word);
begin
  if SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color) then
end;

// Initialisiert das Feld leer und das Sichbarkeitsfeld mit 'false'
// Setzt in gerundet 10% aller Zellen eine Bombe
// @param
// field - Feld, welches initialisiert wird
// visible - zu setzendes Sichtbarkeitsfeld
procedure initField(var field: TFIELD; var visible: TVISIBLE);
var
  x, y, r, s: integer;
begin
  for x := 1 to FIELDSIZE do
  begin
    for y := 1 to FIELDSIZE do
    begin
      visible[x, y] := FALSE;
      field[x, y] := leer;
    end;
  end;
  r := (FIELDSIZE * FIELDSIZE) div 10;
  s := (FIELDSIZE * FIELDSIZE) mod 10;
  if s >= 5 then
    inc(r);
  // Bomben platzieren
  randomize;
  while r > 0 do
  begin
    x := Random(FIELDSIZE) + 1; // Random liefert einen Wert 0..(FIELDSIZE - 1)
    y := Random(FIELDSIZE) + 1;
    if field[x, y] = leer then
    begin
      field[x, y] := Bombe;
      Dec(r);
    end;
  end;
end;

// Prüft, ob eine Koordinate gültig ist
// @param
// x,y - zu überprüfende Koordinatenwerte
// @out
// Überprüfung ob Koordinate im Bereich des Spielfeldes liegt
// @return
// true, wenn Koordinaten gültig sind
function isValidCoord(x, y: integer): Boolean;
begin
  if ((x <= FIELDSIZE) and (x >= 1)) then
    if ((y <= FIELDSIZE) and (y >= 1)) then
      isValidCoord := TRUE
    else
      isValidCoord := FALSE;
end;

// Zeigt an, wie viele Bomben sich auf den Nachbarzellen, der übergebenen
// Koordinate befinden
// @param
// field - Spielfeld, welches geprüft wird
// x,y - Koordinaten
// @out
// Bestimmung der Nachbarzellen
// @return
// byte-Wert, wie viele Bomben in den Nachbarzellen existieren
function countBombs(field: TFIELD; x, y: TSize): Byte;
var
  dir: TDIR;
  xNachbar, yNachbar: integer;
  n: Byte;
begin
  n := 0;
  for dir := low(TDIR) to high(TDIR) do
  begin
    xNachbar := x + OFFSET_X[dir];
    yNachbar := y + OFFSET_Y[dir];
    if field[x, y] = Bombe then
      inc(n);
  end;
  countBombs := n;
end;

// Textausgabe des Spielfeldes in der Konsole
// @param
// field - Spielfeld, welches ausgegeben werden soll
// visible - augedeckte Zellen
procedure printField(field: TFIELD; visible: TVISIBLE);
var
  x, y: Byte;
  s: string;
  n: integer;
begin
  for x := 1 to FIELDSIZE do
  begin
    for y := 1 to FIELDSIZE do
    begin
      if not visible[x, y] then
        s := ''
      else if field[x, y] = Bombe then
        s := 'ð'
      else
      begin
        n := countBombs(field, x, y);
        if n = 0 then
          s := ' '
        else
          s := IntToStr(n);
      end;
      write(s, ' ');
    end;
    writeln;
  end;
end;

// liest vom Benutzer Spalte und Zeile ein und prüft diese. Außerdem wird der
// Benutzer gefragt ob die gewählte Zelle aufgedeckt oder als Bombe markiert
// oder das Programm mit der Eingabe von x beendet werden soll
// @param
// x,y - x- und y-Koordinate des Spielfeldes
// cancel - soll das Spiel verlassen werden?
// bomb - soll eine Bombe markiert werden?
// @out
//
// @return
function readInput(var x, y: TSize; var cancel, bomb: Boolean): Boolean;
var
  eingabe: char;
  gueltig: Boolean;
begin
  eingabe := upcase(eingabe);
  gueltig := FALSE;
  case eingabe of
    'X':
      cancel := TRUE;
    '1' .. '7':
      gueltig := TRUE;
  end;

  case eingabe of
    'X':
      cancel := TRUE;
    'B':
      bomb := TRUE;
  end;
  readInput := gueltig or cancel;
end;

// Prüft, ob das gesamte Spielfeld mit Ausnahme der Bomben aufgedeckt ist
// @param
// field - Spielfeld, in dem geprüft werden soll
// visible -Sichtbarkeit der Zellen
// @out
//
// @return
// true, wenn alle Zellen außer die Bomben aufgedeckt sind
(* function isFieldSolved(field : TFIELD; visible :TVISIBLE) : boolean;
  begin
  while visible or (field = Bombe) do

  end; *)


var
  field: TFIELD;
  visible: TVISIBLE;
  cancel, bomb: Boolean;
  x, y: TSize;

begin
  initField(field, visible);
  printField(field, visible);
  writeln('Bitte eine Spalte von 1 bis 7 eingeben oder ''X'' für Abbruch: ');
  readln(x);
  if readInput(x, y, cancel, bomb) then
  begin
    writeln('Bitte eine Zeile von 1 bis 7 eingeben oder ''X'' für Abbruch: ');
    readln(y);
    if readInput(x, y, cancel, bomb) then
    begin
      writeln('Bitte ein ''B'' eingeben, wenn dort eine Bombe markiert werden soll, '
        + 'leer lassen zum aufdecken oder ''X'' für Abbruch: ');
    end;
  end;

  readln;

end.
  Mit Zitat antworten Zitat
Michael II

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

AW: zweidimensionale Arrays

  Alt 11. Jun 2021, 00:46
Ich frage mich, wieso du das hier kompilieren kannst: eingabe := upcase(eingabe); ? Mein Delphi könnte das nicht .

Wenn du in #1 deine Beschreibung von function readInput(var x, y: TSize; var cancel, bomb: Boolean): Boolean; liest, dann könnte man vermuten, dass die Benutzereingaben Spalte, Zeile etc. direkt IN der Funktion eingelesen werden sollten und nicht im Hauptprogramm. (Darauf deutet auch hin, dass die Argumente als var Parameter deklariert sind.).
Michael Gasser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.476 Beiträge
 
Delphi 12 Athens
 
#4

AW: zweidimensionale Arrays

  Alt 11. Jun 2021, 12:31
Debuggen und schauen was passiert?


@Michael: Das ist der Unterschied(e) zwischen Delphi-Referenz durchsuchenUpCase (ASCII-Char), Delphi-Referenz durchsuchenUpperCase (ASCII) und Delphi-Referenz durchsuchenAnsiUpperCase (ANSI/Unicode)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (11. Jun 2021 um 12:36 Uhr)
  Mit Zitat antworten Zitat
Michael II

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

AW: zweidimensionale Arrays

  Alt 11. Jun 2021, 13:47
@Michael: Das ist der Unterschied(e) zwischen Delphi-Referenz durchsuchenUpCase (ASCII-Char), Delphi-Referenz durchsuchenUpperCase (ASCII) und Delphi-Referenz durchsuchenAnsiUpperCase (ANSI/Unicode) [/QUOTE]

Danke himitsu. Dann würde mich spontan auf den Rest dieser Zeile - zum Beispiel den Wert von eingabe - konzentrieren.
mo du schreibst gueltig oder cancel seien true. Woher hast du diese Werte? Du weisst, wie du debuggen kannst? Du kannst beim Debuggen Programmzeile für Programmzeile beobachten, was passiert und welche Werte in deinen Variablen gespeichert sind.
Michael Gasser

Geändert von Michael II (11. Jun 2021 um 14:09 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#6

AW: zweidimensionale Arrays

  Alt 11. Jun 2021, 14:09
Zitat:
Delphi-Quellcode:
var
  eingabe: char;
  gueltig: Boolean;
begin
  eingabe := upcase(eingabe);
Welchen Wert hat denn eingabe zu diesem Zeitpunkt? Das weißt Du nicht? Gut, dann sind wir schon 2

P.S.: Eigentlich müsste der Compiler hier eine Warnung ausgeben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: zweidimensionale Arrays

  Alt 11. Jun 2021, 20:07
Ich habe ein kleines Problem und zwar das falls eine Bombe eingetragen werden soll einfach nichts geschieht.
Sieht vielleicht jemand von euch wo der Fehler ist, der Debugger hilft mir da auch nicht weiter.



Delphi-Quellcode:

{$APPTYPE CONSOLE}

{$R+,Q+,X-}

uses
  System.SysUtils,
  Windows;

const
  FIELDSIZE : Byte = 7;

type
  TSize = 1..7;
  TSTATE = (leer, Bombe);
  TDIR = (Nord, NordOst, Ost, SüdOst, Süd, SüdWest, West, NordWest);
  TFIELD = array[TSIZE, TSIZE] of TSTATE;
  TVISIBLE = array[TSIZE, TSIZE] of Boolean;

const
  OFFSET_X : array[TDIR] of integer = (0,1,1,1,0,-1,-1,-1);
  OFFSET_Y : array[TDIR] of integer = (1,1,0,-1,-1,-1,0,1);

//Setzt die Ausgabeposition der Konsole auf die angegebene Koordinate.
//@param
//x,y - zu setzende Position in der Konsole an 0/0 = oben links
procedure setConsolePosition(x,y : byte);
var
  coord : _COORD;
  begin
    coord.X := x;
    coord.Y := y;
    if SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord) then;
  end;

//Setzt die Textfarbe der Konsole
//@param
//color - zu setzender Farbwert
procedure setTextColor(color : word);
begin
  if SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color) then
end;

//Initialisiert das Feld leer und das Sichbarkeitsfeld mit 'false'
//Setzt in gerundet 10% aller Zellen eine Bombe
//@param
//field - Feld, welches initialisiert wird
//visible - zu setzendes Sichtbarkeitsfeld
procedure initField(var field : TFIELD ; var visible : TVISIBLE);
var x, y, r, s : integer;
begin
   for x := 1 to FIELDSIZE do
   begin
    for y := 1 to FIELDSIZE do
    begin
      visible[x, y] := FALSE;
      field[x,y] := leer;
    end;
   end;
   r := (FIELDSIZE * FIELDSIZE) div 10;
   s := (FIELDSIZE * FIELDSIZE) mod 10;
   if s >= 5 then
     inc(r);
   // Bomben platzieren
   randomize;
   while r > 0 do
   begin
     x := Random(FIELDSIZE) + 1; // Random liefert einen Wert 0..(FIELDSIZE - 1)
     y := Random(FIELDSIZE) + 1;
     if field[x, y] = leer then
     begin
       field[x, y] := Bombe;
       Dec(r);
     end;
   end;
 end;

 //Prüft, ob eine Koordinate gültig ist
//@param
// x,y - zu überprüfende Koordinatenwerte
//@out
//Überprüfung ob Koordinate im Bereich des Spielfeldes liegt
//@return
// true, wenn Koordinaten gültig sind
function isValidCoord(x,y : integer): boolean;
begin
  if ((x <= FIELDSIZE) and (x >= 1)) then
  if ((y <= FIELDSIZE) and (y >= 1)) then
  isValidCoord := TRUE
  else isValidCoord := FALSE;
end;

//Zeigt an, wie viele Bomben sich auf den Nachbarzellen, der übergebenen
//Koordinate befinden
//@param
//field - Spielfeld, welches geprüft wird
//x,y - Koordinaten
//@out
//Bestimmung der Nachbarzellen
//@return
// byte-Wert, wie viele Bomben in den Nachbarzellen existieren
function countBombs(field : TFIELD; x,y : TSIZE) : byte;
var
  dir : TDIR;
  xNachbar, yNachbar : integer;
  n : byte;
begin
  n := 0;
  for dir := low(TDir) to high(TDir) do
    begin
      xNachbar := x + OFFSET_X[dir];
      yNachbar := y + OFFSET_Y[dir];
      if field[x,y] = Bombe then inc(n);
    end;
  countBombs := n;
end;

//Textausgabe des Spielfeldes in der Konsole
//@param
//field - Spielfeld, welches ausgegeben werden soll
//visible - augedeckte Zellen
procedure printField(field : TFIELD; visible : TVISIBLE);
var
  x, y : byte;
  s: string;
  n: Integer;
begin
  for x := 1 to FIELDSIZE do
  begin
    for y := 1 to FIELDSIZE do
    begin
      if not visible[x, y] then
        s := ''
      else if visible[x,y] and (field[x, y] = Bombe) then
        s := 'ð'
      else
      begin
        n := countBombs(field, x, y);
        if n = 0 then
          s := ' '
        else
          s := IntToStr(n);
      end;
      write(s,' ');
    end;
    writeln;
  end;
end;

//liest vom Benutzer Spalte und Zeile ein und prüft diese. Außerdem wird der
//Benutzer gefragt ob die gewählte Zelle aufgedeckt oder als Bombe markiert
//oder das Programm mit der Eingabe von x beendet werden soll
//@param
//x,y - x- und y-Koordinate des Spielfeldes
//cancel - soll das Spiel verlassen werden?
//bomb - soll eine Bombe markiert werden?
//@out
//
//@return
function readInput(var x, y: TSize; var cancel, bomb: Boolean): Boolean;
var
  gueltig: Boolean;
  eingabeX, eingabeY, eingabeZ: Char;
  field : TFIELD;
  visible : TVISIBLE;
begin
  eingabeX := upcase(eingabeX);
  gueltig := FALSE;
  cancel := FALSE;
  readInput := gueltig or cancel;
  writeln('Bitte eine Spalte von 1 bis 7 eingeben oder ''X'' für Abbruch: ');
  readln(eingabeX);
  case eingabeX of
    'X': cancel := TRUE;
    '1'..'7': begin
                  gueltig := TRUE;
                  x := StrToInt(eingabeX);
              end;

  else readInput := FALSE;
  end;

  if gueltig then
  begin
    writeln('Bitte eine Zeile von 1 bis 7 eingeben oder ''X'' für Abbruch: ');
    readln(eingabeY);
    case eingabeY of
      'X': cancel := TRUE;
      '1' .. '7': begin
                    gueltig := TRUE;
                    y := StrToInt(eingabeY);
                  end
    else readInput := FALSE;
    end;
  end;

  if isValidCoord(x,y) then
  begin
    writeln('Bitte ein ''B'' eingeben, wenn dort eine Bombe markiert werden '+
    'soll, leer lassen zum Aufdecken oder ''X'' für Abbruch: ');
    readln(eingabeZ);
    case eingabeZ of
    'B' : field[x,y] := Bombe;
    'X' : cancel := TRUE;
    else readInput := FALSE;
    end;
    visible[x,y] := TRUE;
  end;
end;




// Prüft, ob das gesamte Spielfeld mit Ausnahme der Bomben aufgedeckt ist
// @param
// field - Spielfeld, in dem geprüft werden soll
// visible -Sichtbarkeit der Zellen
// @out
//
// @return
// true, wenn alle Zellen außer die Bomben aufgedeckt sind
(* function isFieldSolved(field : TFIELD; visible :TVISIBLE) : boolean;
  begin
  while visible or (field = Bombe) do



  end; *)




var
  field: TFIELD;
  visible: TVISIBLE;
  cancel, bomb: Boolean;
  x, y: TSize;
  eingabe: char;
  eingabeX: integer;
  eingabeY: integer;



begin
  initField(field, visible);
  printField(field, visible);
  while readInput(x,y,cancel, bomb) do
  begin
    writeln('haha');
    printField(field,visible);
  end;
 readln;
end.

Geändert von Mo53 (11. Jun 2021 um 20:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 +1. Es ist jetzt 03:52 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz