Einzelnen Beitrag anzeigen

Benutzerbild von patti
patti

Registriert seit: 20. Okt 2004
Ort: Mittelfranken
665 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Schiffe versenken, Platzierung

  Alt 24. Mai 2010, 11:46
Vom Ansatz her schaut das, was du bisher hast, schon mal gar nicht so schlecht aus.

In deiner Schiff-Setzen-Routine (die ich etwas ändern würde, so ist es ziemlich umständlich und fehleranfällig) würde ich folgendes machen: Zuerst mal musst du dir überlegen, wann die Positionierung gültig ist, d.h. wann ein Setzen des Schiffs nach den Regeln erlaubt sein soll. Ein Schiff darf kein anderes Schiff irgendwo berühren, d.h. es muss um das neu zu setzende Schiff ein "Rand" von einem Feld frei sein (siehe auch Bilder im Anhang). In der Routine würde ich mir dieses Rechteck bestimmen, und zwar mit Hilfe einer Variable vom Typ TRect:

Delphi-Quellcode:
var r : TRect;
var gueltig : boolean;
var iX, iY : integer;
//
//...
// Ueberpruefung, ob innerhalb des Felds (das hast du ja schon)...
//
// Du weisst ja, wo das Schiff gesetzt werden soll und du weisst die Länge und die Orientierung des Schiffs. Damit kannst du schonmal die Position des Schiffs im Rect speichern:
r.Left := x;
r.Top := y;
//
if Orientierung = horizontal (* oder wie du es halt speicherst *) then
begin
  r.Right := r.Left + Laenge -1;
  r.Bottom := r.Top;
end
else
begin
  r.Right := r.Left;
  r.Bottom := r.Top + Laenge -1;
end;
//
// Jetzt musst du das Rect auf jeder Seite noch um "1" vergoessern, dabei musst du bedenken, dass das Schiff auch an einem Rand des Felds liegen kann:
//
if r.Left > 0 then r.Left := r.Left -1;
if r.Top > 0 then r.Top := r.Top -1;
if r.Right < 9 then r.Right := r.Right +1;
if r.Bottom < 9 then r.Bottom := r.Bottom +1;
//
// Jetzt kannst du das gesamte Rect in einer Schleife durchgehen und die Felder ueberpruefen:
//
gueltig := true;
//
for iX := r.Left to r.Right do
  for iY := r.Top to r.Bottom do
    if not(arr2[iX,iY]) then gueltig := false;
// (Schleife kann man noch einbisschen optimieren)
//
if gueltig then
begin
  // SETZEN
end;
(ungetestet, nur hier schnell im Beitrags-Editor getippt, können Tippfehler drin sein )

Hoffe, das hilft dir schonmal einbisschen weiter

mfg
Patti
Miniaturansicht angehängter Grafiken
pos_ungueltig_916.jpg   pos_gueltig_208.jpg  
Patrick Kreutzer
[Informatik-Student im 4. Semester]
http://www.patti-k.de/
  Mit Zitat antworten Zitat