Einzelnen Beitrag anzeigen

Grayknife

Registriert seit: 13. Feb 2015
Ort: Hessen
26 Beiträge
 
#2

AW: Schiffe versenken (zum XX-ten Mal :3 )

  Alt 18. Feb 2015, 19:06
Edit: Man könnte ja einfach schauen, ob um das schiff rum schon was liegt. Man würde dann in die Prozedur, die Spalte, die Zeile und die Anzahl übergeben. Es gibt eine Prozedur für waagerecht und eine prozedur für senkrecht. in der Prozedur wird bei waagerecht, dann die Zeile-1 gerechnet, um zuschauen ob darüber eine 1 ist, dann wird die Zeile+1 gerechnet, dann, die gleiche Zeile nur die Spalte-1 und dann nochmal Spalte+1. Bei meinem Programm ist das halt so, dass, wenn man einmal klickt, sich alle 5 Zellen in die jeweilige Richtung automatisch füllen
Delphi-Quellcode:
 if (radiobutton1.checked=True) and ((Spalte<4)) then begin //waagerecht setzen. Spalte<4, damit es nicht über den Rand hinausragt..
   PlaySound(PChar('AyeSir1'),HInstance,SND_Resource or SND_Async); //Sound abspielen.
   for I:=Spalte to Spalte+4 do SetzeSchiff1(I,Reihe); //Fünf mal die 1 wird im Array gespeichert.
   stringgrid1.Enabled:=False; //Deaktivieren des Grids1,
                                                               //damit nichts weiter gesetzt werden kann.
Wenn ich jetzt spezifisch auch beim ersten Schiff schon alles abfrage:
Delphi-Quellcode:
 IF start=0 then begin //Prozeduren fürs Schiffe setzen.
 Stringgrid1.MouseToCell(X,Y,Spalte,Reihe); //Abfrage, welche Zelle ausgewählt wurde.
 //-----------------------------------------------------------------------------

 Case Radiogroup1.ItemIndex of
0:begin
    if (radiobutton1.checked=True) and (Schifftesten1(Spalte,Reihe,4)=True) and ((Spalte<4)) then begin //waagerecht setzen.
      PlaySound(PChar('AyeSir1'),HInstance,SND_Resource or SND_Async); //Sound abspielen.
      for I:=Spalte to Spalte+4 do SetzeSchiff1(I,Reihe); //Fünf mal die 1 wird im Array gespeichert.
Die Schifftesten1 -Prozedur ist hierbei dann wichtig:
Delphi-Quellcode:
function Tform1.SchiffTesten1(Spalte,Reihe, Anz:Integer):Boolean;
var i,Ges:Integer;
begin
 Ges:=0;
 For i:=Spalte to Spalte+Anz do begin
  if (Spielfeld1[I,Reihe]=0) then inc(Ges); //Liegt auf dem Schiff was?
  if (Spielfeld1[I,Reihe-1]=0) then inc(ges); //Liegt überhalb des Schiffes was?
  if (Spielfeld1[I,Reihe+1]=0) then inc(ges); //Unterhalb?
 End;
 If (Spielfeld1[Spalte-1,Reihe]=0) then inc(ges); //vor dem Schiff?
 If (Spielfeld1[Spalte+Anz+1,Reihe]=0) then inc(ges); //Hinter dem schiff?

 If (Anz=4) and (Ges=17) then result:=True
 Else result:=False;
 // If Anz=3 and Ges=14...
 // If Anz=2 and Ges=11...

End;
So habe ich mir das gedacht, aber Ich glaube ich setze meine Gedanken falsch um :S :S
Versteht ihr, wie ich das denke?



Und noch ein Update-Edit <,< vllt sollte ich erst denken und dann schreiben ^^
Delphi-Quellcode:
 
function Tform1.SchiffTesten1(Spalte,Reihe, Anz:Integer):Boolean;
var i,Ges:Integer;
begin
 Ges:=0;
 For i:=Spalte to Spalte+Anz do begin
  if (Spielfeld1[I,Reihe]=0) then Ges:=Ges+1; //Liegt auf dem Schiff was?
  if (Spielfeld1[I,Reihe-1]=0) then Ges:=Ges+1; //Liegt überhalb des Schiffes was?
  if (Spielfeld1[I,Reihe+1]=0) then Ges:=Ges+1; //Unterhalb?
 End;
 If (Spielfeld1[Spalte-1,Reihe]=0) then Ges:=Ges+1; //vor dem Schiff?
 If (Spielfeld1[Spalte+Anz+1,Reihe]=0) then Ges:=Ges+1; //Hinter dem schiff?

 Case Anz of
  4: If Ges=17 then result:=True else result:= false;
  3: If Ges=14 then result:=True else result:= false;
  2: If Ges=11 then result:=True else result:= false;
  1: If Ges=8 then result:=True else result:= false;
 End;

End;
Und:
Delphi-Quellcode:
procedure TForm1.StringGrid1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var Spalte,Reihe,I:Integer;
begin

IF start=0 then begin //Prozeduren fürs Schiffe setzen.
 Stringgrid1.MouseToCell(X,Y,Spalte,Reihe); //Abfrage, welche Zelle ausgewählt wurde.
 //-----------------------------------------------------------------------------

 Case Radiogroup1.ItemIndex of
  0:begin
    if (radiobutton1.checked=True) and ((Spalte<4)) and (Schifftesten1(Spalte,Reihe,4)=True)then begin //waagerecht setzen.
      PlaySound(PChar('AyeSir1'),HInstance,SND_Resource or SND_Async); //Sound abspielen.
      for I:=Spalte to Spalte+4 do SetzeSchiff1(I,Reihe); //Fünf mal die 1 wird im Array gespeichert.
      radiogroup1.ItemIndex:=1;
    End;
   { if (radiobutton2.Checked=True) and ((Reihe<4)) then begin    //senkrecht setzen.
      PlaySound(PChar('AyeSir1'),HInstance,SND_Resource or SND_Async);
      for I:=Reihe to Reihe+4 do SetzeSchiff1(Spalte,I);          //s.o.
    End;                }

    ZeigeSpielfeld1;
  End;

  1:begin
    if (radiobutton1.checked=True) and ((Spalte<5)) and (Schifftesten1(Spalte,Reihe,3)=True) then begin
      PlaySound(PChar('AyeSir1'),HInstance,SND_Resource or SND_Async);
      for I:=Spalte to Spalte+3 do SetzeSchiff1(I,Reihe);
      radiogroup1.ItemIndex:=2;
    end;
    ZeigeSPielfeld1;
  end;
  2:begin
    if (radiobutton1.checked=True) and ((Spalte<6)) and (Schifftesten1(Spalte,Reihe,2)=True) then begin
      PlaySound(PChar('AyeSir1'),HInstance,SND_Resource or SND_Async); //Sound abspielen.
      for I:=Spalte to Spalte+2 do SetzeSchiff1(I,Reihe);
      Radiogroup1.ItemIndex:=3;
    end;
    ZeigeSPielfeld1;
  end;
  3:begin
    if (radiobutton1.checked=True) and ((Spalte<7)) and (Schifftesten1(Spalte,Reihe,1)=True) then begin
      PlaySound(PChar('AyeSir1'),HInstance,SND_Resource or SND_Async); //Sound abspielen.
      for I:=Spalte to Spalte+1 do SetzeSchiff1(I,Reihe);
      stringgrid1.Enabled:=False; // Deaktivieren des Grids,
      Button3.Enabled:=True; //damit nichts weiter gesetzt werden kann.
      Button3.Visible:=True;
    end;
    ZeigeSPielfeld1;
  End;
 End;
Jetzt bin ich soweit, klappt auch einigermaßen, aber irgendwie möchte er bei manchen Feldern trotzdem nichts setzen...
Und wie verhält sich das eigentlich am "Rand" des Arrays? Wenn ich ganz links an der Kante bin, und dann nochmal Reihe-1 rechne, was macht mein Delphi dann da?

Geändert von Grayknife (18. Feb 2015 um 21:29 Uhr)
  Mit Zitat antworten Zitat