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