Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Schiffe versenken, Platzierung (https://www.delphipraxis.net/151288-schiffe-versenken-platzierung.html)

m2zer0 31. Mai 2010 14:56

Re: Schiffe versenken, Platzierung
 
Was kann man denn am besten für die Platzierung der Computer Schiffe benutzen?

Ich mach mir schon seit Tagen Gedanken darüber, nur ich komm nicht darauf wie ich es anstelle ohnen einen Quelltext von einem gigantischen Ausmaß zu bekommen.. :(

m2zer0 1. Jun 2010 17:56

Re: Schiffe versenken, Platzierung
 
Die Platzierung hab ich nun auch gemeister. Nun kommt das Schießen :)
Da der Com nur zufällig schießen muss, muss ich es hinbekommen das ein Zufälliges Feld, das noch nicht beschossen wurde, beschossen wird. Wie kann ich das überprüfen? Geht das mithilfe eines Arrays?

patti 1. Jun 2010 17:59

Re: Schiffe versenken, Platzierung
 
Naja, das ist eigentlich ganz einfach. Mit Hilfe von "random" erzeugst du dir zwei Zufalls-Zahlen von 0 bis 9, eine für die x-Richtung und eine für die y-Richtung. Dann überprüfst du in deinem Array mit den Feldern, ob das Feld bereits "beschossen" wurde. Wenn ja --> nochmal neue Zufallszahlen erzeugen (das ganze in einer Schleife, bis das Feld, das rauskommt, noch nicht beschossen wurde), wenn nein --> "schießen".

mfg

m2zer0 1. Jun 2010 18:13

Re: Schiffe versenken, Platzierung
 
habe ich bereits versucht, nur irgendwann ist die Wahrscheinlichkeit so gering das eine passende Zahl getroffen wird, das das Programm sich an der Schleife aufhängt.

idefix2 2. Jun 2010 22:50

Re: Schiffe versenken, Platzierung
 
Delphi-Quellcode:
var
NochNichtBeschossen: array[1..m,1..n] of integer; // m*n spielfeldgrösse, alle noch nicht beschossenen Felder enthalten true
AnzahlNochNichtBeschossen: integer;

procedure zielsuchen (var x,y: integer);
var i,j,z,h: integer;
begin
z := trunc(random(AnzahlNochNichtBeschossen))+1;
h := 0;
for i := 1 to m do
for j := 1 to n do
  if NochNichtBeschossen [i,j]
  then begin inc(h);
       if h=z then begin x:=i; y:=j; exit end;
       end;
end;
Vielleicht in etwa so?

m2zer0 2. Jun 2010 23:26

Re: Schiffe versenken, Platzierung
 
Könntest du die procedure noch einmal kurz erklären?
Müsste es nicht ein array of boolean sein?

Vielen Dank schonmal für die Hilfe :)

idefix2 3. Jun 2010 15:56

Re: Schiffe versenken, Platzierung
 
entschuldige, natürlich boolean, im Kommentar steht ja auch: alle noch nicht beschossenen Felder enthalten true

Die Idee ist die: Wenn Du noch x nicht beschossene Felder hast, erzeugst Du eine Zufallsszahl n zwischen 1 und x und gehst dann im Feld zum n-ten noch nicht beschossenen Feld, die schon beschossenen Felder werden einfach übersprungen, ohne dass etwas passiert. Also bei jedem noch nicht beschossenen Feld den Zähler um 1 erhöhen, wenn Du bei n angelngt bist, die Prozedur (und die Schleife) verlassen.

freak4fun 3. Jun 2010 16:04

Re: Schiffe versenken, Platzierung
 
Delphi-Quellcode:
NochNichtBeschossen: array[1..m,1..n] of integer;
Finde ich besser. Hast du dir um die Zustände eines Feldes gedanken gemacht? Oder hälst du meherer Arrays vom Spielfeld?
Mir würden auf anhieb 4 Zustände einfallen: Boot getroffen, Boot nichtgetroffen, Wasser nicht beschossen, Wasser beschossen :gruebel:

m2zer0 3. Jun 2010 17:30

Re: Schiffe versenken, Platzierung
 
Ich benutze, wie bereits aus den vorherigen posts hervorgehend, ein Array of Char. Jedes Bot hat seinen eigenen Buchstaben, welcher sich nach dem Beschuss ändert. Gleiches gilt für das Wasser.

idefix2 3. Jun 2010 17:41

Re: Schiffe versenken, Platzierung
 
Zitat:

Oder hälst du meherer Arrays vom Spielfeld?
Ich möchte ja nicht das ganze Spiel programmmieren, sondern nur einen Vorschlag für das konkret formulierte Problem machen. Dafür ist boolean ausreichend.
Natürlich kann man die verschiedenen Zustände der Feldelemente in einer integer variablen oder sogar besser in einer Variablen vom Typ set of Aufzähltyp halten, und aufzähltyp ist dann etwas wie (IstWasser, IstBeschossen, IstAbgeschossen ....) und was auch immer noch an binären Zuständen benötigt wird.

Aber wie er m2zer0 seine Daten sonst organisiert, möchte ich ganz ihm überlassen (solange er nicht explizit danach fragt :) )

Ob es sinnvoll ist, in dem Feld jedem Boot einen anderen Buchstaben zuzuordnen, kann ich nicht sagen, weil ich mich mit dem Gesamtprogramm nicht beschäftigt habe, aus dem Bauch heraus würde ich sagen, eher nein, das schaut mir nicht nach einem sauberen Datenmodell aus, aber das muss letztlich der Programmierer entscheiden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:56 Uhr.
Seite 3 von 4     123 4      

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