AGB  ·  Datenschutz  ·  Impressum  







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

Schiffe versenken (zum XX-ten Mal :3 )

Ein Thema von Grayknife · begonnen am 18. Feb 2015 · letzter Beitrag vom 27. Mär 2015
Antwort Antwort
Seite 1 von 3  1 23      
Grayknife

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

Schiffe versenken (zum XX-ten Mal :3 )

  Alt 18. Feb 2015, 19:07
Hallo Dpler, Ich habe mich auch mal an ein Schiffe versenken rangesetzt, in bin für meine Verhältnisse und Programmierkenntnisse ziemlich weit gekommen
Bei meinem Schiffe versenken, spielen 2 Leute gegeneinander, erst können sie ein Schiff setzen, und anschließend auf das andere Spielfeld feuern )
-> Im Anhang befindet befindet sich alles und alles
(Bitte nicht über den Quellcode aufregen. So wie ich es aufgeschrieben habe, verstehe ich es einigermaßen!)

Aber wie gesagt, man kann leider nur 1 (sprich EIN) Schiff setzen , da ich denke das man einfach später nach und nach weitere Schiffe anfügen kann <,<
Aber irgendwie erweist sich das schwerer als gedacht. Ich habe mir das so gedacht:
Es befindet sich eine Radiogroup auf der Form, die dir zeigt, welches Schiff du jetzt setzen musst, anschließend kannst du zwischen waagerecht und senkrecht auswählen. Wenn man jetzt auf das Stringgrid klickt, wird das komplette Schiff gesetzt. Anschließend wandert der Pinökel von der Radiogroup eins weiter, und nun kannst du das nächste Schiff setzen. Und so weiter, insgesamt von 5-2.
_________________________

In der "Aufs-stringgrid-klicken"-prozedur befindet sich der Hauptquelltext.
Wenn man jetzt auf eine Zelle klickt, wird zuerst geschaut, ob man sich gerade im Setzen-Modus oder im Schießen-modus befindet.
Beim Setzenmodus:
1. Wo befindet sich der Pinökel? Waagerecht/senkrecht, Schiff für 5/4/3/2 Kästchen? Und nun wäre es doch am besten eine neue Prozedur zu schreiben, womit man testen kann, ob sich ein Schiff dort befindet, bzw, ob es direkt neben einem Schiff sein würde.

Aber mein Gedankengang bei der Programmierung will, glaube ich, nicht so wirklich aufgehen ^^

hat jemand eine Idee, wie ich das Abfragen kann, bzw. ändern kann?

Grüße

Grayknife
Angehängte Dateien
Dateityp: 7z SchiffeJanek.7z (623,1 KB, 21x aufgerufen)
  Mit Zitat antworten Zitat
Grayknife

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

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

  Alt 18. Feb 2015, 20: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 22:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

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

  Alt 18. Feb 2015, 22:30
Zum Thema Schiffe Versenken ist doch schon hinreichend - auch von mir - geschrieben worden und dieser Thread ist dir auch bekannt. Da habe ich mich lang und breit dazu ausgelassen, auch dass man sich erst einen Plan machen soll (Bleistift und viel Papier), weil man sich ohne diese Zettel schnell verzettelt.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Grayknife

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

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

  Alt 18. Feb 2015, 22:34
Ja ich weiß, tut mir Leid.. -.-"

vielleicht hätte ich mir auch einen Plan machen sollen <,<

Aber sonst wollt ihr auch immer, das wir das selber lösen, und das ist meine Lösung ;3
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

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

  Alt 19. Feb 2015, 08:13
Schießen sich Planung und Eigeninitiative neuerdings gegenseitig aus? Wieso informiert mich niemand darüber?
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
Grayknife

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

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

  Alt 19. Feb 2015, 08:25
Ich weiß jetzt nicht genau...

dann also einfach eine Frage:

Was passiert, wenn ich diese Prozedur aufrufe:
Delphi-Quellcode:
function Tform1.SchiffTesten1(Spalte,Reihe, Anz:Integer):Boolean;
var i,Ges:Integer;
begin
  Ges:=0;
 //...
  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;
und zwar mit dem Spaltenwert=0. Dann wird bei dem einen Aufruf 0-1 also -1 gerechnet. Das Array geht aber nur von 0-7. bricht er dann den Vorgang ab?
Denn wenn ich einfach ein kleines Testprogramm schreibe und auf einen Wert, der kleiner als 0 ist, zugreife, zeigt er mir eine Fehlermeldung an

Geändert von Grayknife (19. Feb 2015 um 08:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

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

  Alt 19. Feb 2015, 08:33
Kommt darauf an: ohne Bereichsprüfung merkst Du nicht, dass Du auf irgendwelchen Schrott zugreifst. Bei aktivierter Bereichsprüfung bekommst Du eine Fehlermeldung.
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
Grayknife

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

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

  Alt 19. Feb 2015, 08:37
Achso, selbstgeschriebene Prozeduren, testen also nicht, ob es den Bereich überhaupt gibt?

Also müsste ich noch eine(oder mehrere) Prozedur schreiben, wenn die Spalte bzw. die Zeile 0 ist? damit dort gar nicht über oder links neben dem Schiff abgefragt wird?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

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

  Alt 19. Feb 2015, 08:40
Eine einfache If-Abfrage vor dem Zugriff sollte genügen.
Delphi-Quellcode:
if Spalte > Low(Spielfeld1) then
  If (Spielfeld1[Spalte-1,Reihe]=0) then inc(ges);
Das Gleiche dann äquivalent auf der anderen Seite.
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
Grayknife

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

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

  Alt 19. Feb 2015, 08:55
Okey, und dieses low(Spielfeld1), gibt genau welchen wert an?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 23:00 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