String abfrage --> Schiffe versenken

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Jochim
Beiträge: 32
Registriert: Mi 20. Mär 2013, 13:44
OS, Lazarus, FPC: Win7 HP x64
CPU-Target: Bit

String abfrage --> Schiffe versenken

Beitrag von Jochim »

Hallo,
wir Arbeiten in der Schule an dem Spiel Schiffe versenken und da Ferien sind mache ich zu Haue schon einmal weiter. Jetzt habe ich aber folgendes Problem:

Es gibt verscheidende Bedingungen (Ausrichtung des Schiffes, nicht über Rand hinaus gucken, etc.) jetzt fehlt nur noch die Bedingung, das an dem Platz, wo das Schiff gesetzt werden soll noch keines ist. Dazu (für alle abfragen) habe ich eine Prozedur gemacht, wo nun der Fehler: Error: Operator is not overloaded: not "AnsiString" angezeigt wird. Die schiffe sind mit dem Buchstaben "s" in einem StringGrid und noch einmal mit den Koordinaten, Ausrichtung und Länge in einem Array gespeichert.

Ich hoffe ihr könnt mir Helfen, unten findet ihr noch die Prozedur.

Code: Alles auswählen

procedure darfsetzen(x,y,l:integer;a:boolean);
var i:integer;
begin
  if (a=true) and (l+y<iraster) and (x>0) and (y>0) then
  begin
      for i:=0 to l-1 do begin
        If not Form1.sg1.cells[x,y+i]='s' then dasetz:=true;
      end;
  end;
end;

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: String abfrage --> Schiffe versenken

Beitrag von Socke »

Du musst Klammern setzen; ansonsten gilt das not für den nächsten Ausdruck (hier: Form1.sg1.cells[x,y+i])

Code: Alles auswählen

If not (Form1.sg1.cells[x,y+i]='s') then dasetz:=true;
Du kannst natürlich statt nicht gleich auch ungleich schreiben

Code: Alles auswählen

If Form1.sg1.cells[x,y+i]<>'s' then dasetz:=true;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

debeye
Beiträge: 12
Registriert: Mi 20. Mär 2013, 23:10

Re: String abfrage --> Schiffe versenken

Beitrag von debeye »

Auch für den Fall dass mein Beitrag Teilweise mit dem meines Vorredners redundant ist:

schauen wir mal rein.

Code: Alles auswählen

procedure darfsetzen(x,y,l:integer;a:boolean);
//Ich nehme mal an x und y sind die Koordinaten im Grid und l ist die Länge des Schiffs
//Was ist a??
var i:integer;
begin
  //Also hier geht es scheinbar nur um vertikal angeordnete Schiffe?
  //Wegen (l+y<iraster) ... und ich rate auch mal das iraster die Länge in y-Richtung speichert (also die Zeilenzahl), richtig?
  if (a=true) and (l+y<iraster) and (x>0) and (y>0) then
  begin
      for i:=0 to l-1 do begin
         //Ich persönlich hätte die Verzweigung so geschrieben:
        If (Form1.sg1.cells[x,y+i]<>'s') then dasetz:=true;
        //Ich nehme mal an, dass in der Aariable dasetz gespeichert wird ob ich an diese Stelle setzen darf.
        //In dem Falle hast du ein Problem, denn wenn die if-Bedingung irgendwann mal nicht zutrifft,
        //weil ein 's' gefunden wird, dann wird dasetz nicht auf false gesetzt und somit bleibt es die ganze Zeit wahr.
        //auch wenn es das nicht dürfte. Ich würds eher so machen:
        //If (Form1.sg1.cells[x,y+i]='s') then dasetz:=false;
        //Dann muss aber ganz oben dasetz noch mit 'true' initialisiert werden, damit es immer true bleibt, wenn die Bedingung nicht eintritt.
      end;
  end;
end;
Zusammenfassend würde ich deine Methode so schreiben:

Code: Alles auswählen

 
procedure darfsetzenVertikal (x,y,l:integer;a:boolean);
var i:integer;
begin
  dasetz:=true;
  if (a=true) and (l+y<iraster) and (x>0) and (y>0) then
  begin
      for i:=0 to l-1 do begin
      If  (Form1.sg1.cells[x,y+i]='s') then dasetz:=false;
      end;
   end
   else 
   begin
          dasetz:=false;
   end;
end;
Alternativ würde ich dir vorschlagen das ganze als Funktion mit Rückgabewert boolean zu programmieren und an entsprechender Stelle diese Methode zur Abfrage zu benutzen.

Jochim
Beiträge: 32
Registriert: Mi 20. Mär 2013, 13:44
OS, Lazarus, FPC: Win7 HP x64
CPU-Target: Bit

Re: String abfrage --> Schiffe versenken

Beitrag von Jochim »

Danke für die schnelle Antwort, a ist die Ausrichtung des Schiffes. Ich denke so werde ich es nun hingekommen.

Mg
Jochim

Antworten