AW: Schiffe versenken programmieren
Also ich würde, wie Sir Rufo schon gesagt hat erst einmal Zettel und Stift zur Hand nehmen und grob die Benutzeroberfläche zeichnen und dir erst eimal darüber Klar werden, wie dein Programm aussehen soll, was passieren soll wenn man auf den und den Button bzw. Feld klickt. D.h. ganz logisch das gesamte Programm erst einmal konzipieren und noch keinen Gedanken daran verschwenden, wie es dann umgesetzt werden soll.
Wenn du das alles gemacht hast kannst Du dir die grobe Strukturierung des Codes überlegen, d.h. noch nicht in Einzelheiten verfallen, sondern dir z.B. überlegen wie viele Units du brauchst(wenn du z.B. mehrere Fenster verwendest), wie diese miteinander verbunden werden sollen und welche Prozeduren du benötigst und was diese wiederum machen sollen. Und dann müsstest Du auch schon das haben, was dein Lehrer von dir bis Dienstag verlangt hat. Danach kannst Du den Code ganz in Ruhe umsetzen. |
AW: Schiffe versenken programmieren
Wofür bräuchte ich mehrere Units?
Und ich muss aber meine Sachen die ich aufgemalt habe irgendwie so verabreiten dass ich das Dienstag abgeben kann.. Ich bin echt überfordet mit dem Versuch wenigstens etwas zu haben :? |
AW: Schiffe versenken programmieren
Mehrere Units bräuchtest du nur dann, wenn Du mehrere Fenster haben willst. Du brauchst ja so oder so 2 Spielfelder für die beiden Spieler. Dann solltest Du z.B. schon mal wissen, ob Du beide Felder in einem Fenster hast (Was allerdings unsinnig wäre da sich dann ja die Spieler gegenseitig aufs Spielfeld gucken könnten, aber das ist programmiertechnisch egal) oder ob Du die Felder nacheinander ein- und ausblenden lassen willst sodass immer das Feld des Spielers, der gerade am Zug ist, aktiv ist. Das sind so grundlegende Sachen, da würde ich mich erst mal entscheiden. Wie Du das dann realisierst, kannst du dann im 2. Schritt überlegen.
Ich weiß ja nicht, in welcher Form dein Lehrer die Projektplanung verlangt, aber grundsätzlich würde es ausreichen, wenn Du im 2.Schritt die Struktur des Quellcodes(z.B. welche Prozeduren benötigt werden) als Diagramm (mit Pfeilen usw.) aufzeichnest. Das kannst Du aber erst machen, wenn Du mit Schritt1 fertig bist. Deswegen würde ich erst mal zur Ruhe kommen und noch mal ganz von Vorne logisch dein Programm aufbauen. |
AW: Schiffe versenken programmieren
Ok ich werde mich morgen nochmal hier melden..
Müsste das ja in paar Stunden morgen hinkriegen /: Aber nochmal zu den Feldern.. Ich hab mir gedacht, dass ich nur ein Feld mache , wo Schiffe zufällig aufgeteilt werden.. Desweiteren hat dann ein Spieler Zeit , diese Schiffe zu suchen und ''zerstören''. Das wichtige dabei ist dann, wie viel Züge er dafür braucht.. Diese Züge werden dann am Ende zusammengerechnet und gelangen in den Highscore. So wäre meine Idee gewesen.. Da ich glaube, dass es mit einem 2 Feld und einem Computer noch schwieriger ist. |
AW: Schiffe versenken programmieren
Achso, dann habe ich das falsch verstanden. Ich habe gedacht, Du wolltest ein Spiel für 2 Spieler machen, die sich dann abwechselnd gegenseitig "beschießen".
So ist das natürlich deutlich einfacher. |
AW: Schiffe versenken programmieren
Zitat:
Zitat:
Zitat:
Code:
weiß man auf dem Papier nicht ob das ein 5'er und dein 2'er Schiff ist, oder ein 4'er und ein 3'er.
0000000000
XXXXX00000 X000000000 X000000000 0000000000 0000000000 Deshalb auf dem Papier:
Code:
Nun ist die Sache klar. Auf dem Papier.
0000000000
XXXXX00000 0000000000 X000000000 X000000000 0000000000 Nun eine Computerversion:
Code:
Kein Problem, hier kann man erkennen welches Feld für welches Schiff gilt.
0000000000
2111100000 2000000000 2000000000 0000000000 0000000000 Aber bleiben wir mal bei den Regeln für Papierversion. Hier zwei Varianten nebeneinander:
Code:
Welche Version ist leichter auszuwerten? Bei der linken Version mußt man erst mit einer Logik das Schiff lokalisieren, dann erkennen um welches es sich handelt, dh. dazu muss man nicht nur Felder zählen, sondern erkennen wo das Schiff einen Anfang und wo Ende hat. Dann zählt man die Felder dazwischen. Sorry, das ist aber mit Verlaub die komplizierteste aller Arten wie man das Problem angehen muss, denn man muss hier eine Logik programmieren. Bei der zweiten Variante weiß ich, dass Schiff 1 fünf Felder lang ist. Jetzt brauche ich nur noch alle Felder prüfen. Finde ich keine 1 mehr auf dem Feld, weiß ich, dann Schiff 1 versunken ist.
0000000000 0000000000
XXXXX00000 1111100000 0000000000 0000000000 X000000000 2000000000 X000000000 2000000000 0000000000 0000000000 Zitat:
Was ich mit meinem abgewandeltem Tic Tac Toe geboten habe ist ein Ziel auf das man hinarbeiten kann. Man fängt auch kein Haus zu bauen ohne zu wissen wie es aussagen will. Das Ziel ist vorgegeben. So abwegig ist also meine Hilfe mit dem Raster nicht. Auf der andere Seite ist die Diskussion wohl aber eher akademisch, denn ich hab das Gefühl, dass der TE sich auf StringGrid eingeschossen hat. |
AW: Schiffe versenken programmieren
Das mit dem Haus ist ein gutes Beispiel.
Bevor auch nur ein Stein bewegt wird (Umsetzung) wird eine Zeichnung erstellt (Plan). Bei Software sind die Steine Codezeilen und die Zeichnung eben der Plan. Die Aufgabe, die der TE zu erfüllen hat besteht aus einem Plan (Deadline Dienstag) und dem fertigen Programm (Deadline in 2 Monaten). Daraus folgere ich: Code hilft ihm im Moment nicht weiter, das Zwischenziel am Dienstag (Plan) zu erreichen. Die Ermittlung ob ein Schiff versenkt wurde, kann mit meiner Methode per Rekursion ermittelt werden (beliebt bei Info-Lehreren) Etwas Ähnliches wird benötigt um die Positionierung des Schiffs zu überprüfen. Des Weiteren würde ich die Schiffe über eine Lookup-Tabelle identifizieren. Dadurch kann das Spielfeld bleiben, wie es ist (und die Schusslogik) auch wenn die Anzahl und Größe der Schiffe variiert. BTW: In einen Plan gehören auch diese unterschiedlichen Lösungsansätze (auch deiner) mit rein und man vergleicht die Vor- und Nachteile. Dann entscheidet man sich für einen Weg und der wird dann umgesetzt. |
AW: Schiffe versenken programmieren
Wobei ich mir schon vorhin überlegt habe wozu überhaupt ein Array nötig ist. Man kann genauso gut 10 Arrays für 10 Schiffe erstellen, die Größe entspricht der Länge der Schiffe, Typ TPoint. Die Koordinate wo sich die Schiffe befinden (bzw. jedes Teil des Schiffes) ist nicht in dem Feld vermerkt, sondern in TPoints des Schiff-Arrays, z. B.
Delphi-Quellcode:
. Schießt der Gegner, prüft man nicht das Feld, sondern geht alle Schiffe durch und prüft auf Treffer.
var Kreuzer1: array[1..5] of TPoint;
So würde ich das angehen, weil am einfachsten. Aber das ist nicht die klassische Methode und ich weiß nicht was der Lehrer sehen will. |
AW: Schiffe versenken programmieren
Zitat:
Delphi-Quellcode:
Naja :wall:
if Feld[X,Y] <> Wasser then
Treffer; |
AW: Schiffe versenken programmieren
Zitat:
|
AW: Schiffe versenken programmieren
Zitat:
Hast du dir schon Gedanken zum Spiel gemacht? Ich gestern schon. Mit der oberen Abfrage ist es nicht getan. Wenn du das alles mit dem oberen Code schaffst, dann hast du meinen Respekt. Mit der oberen Abfrage erkennst du auf einen Treffer, aber nicht ob ein Schiff versenkt wurde. Zwar könntest du nach jeder Abfrage zusätzlich das ganze Feld prüfen ob alles getroffen wurde, du wüsstest dann zumindest ob alles getroffen wurde was zu treffen war und du gewonnen hast, aber du könntest keine Zwischenergebnisse liefern, ob z. B. ein Schiff versenkt wurde. In dem Fall müsstest du mit einer logischen Routine Schiffe auf dem Feld suchen und als solche erkennen. Und auch wenn die oben genannten Regeln eher für Papiervarianten gelten, denn in Computerversionen stoßen die Schiffe durchaus zusammen, aber bleiben wir mal bei Papierregeln, so ist es nicht verboten, dass Schiffe nebeneinander liegen. Womit die Lokalisierung eines Schiffes nicht mehr so einfach über freie Felder neben dem Schiff wären. Also, weil du den :wall: -Smiley ins Spiel brachtest, würde ich gerne deine Lösung sehen. |
AW: Schiffe versenken programmieren
Man könnte es mit Mengenlehre versuchen. Dazu müssen die Felder zwar in Byte umgerechnet werden, aber das ist ja keine allzu große Hürde. Dann bekommt jedes Schiff eine Menge und die Schüsse auch. Ein Schiff ist dann versenkt, wenn seine Feldmenge komplett in der Schussmenge enthalten ist. Einfacher geht es IMHO kaum.
|
AW: Schiffe versenken programmieren
Also schonmal Danke, dass ich euch für mein Problem so viel Zeit nehmt :wink:
Zitat:
Mein Plan war jetzt: 1. Generieren des Spielfeldes durch eine Imgakomponente ( evtl. StringGrid ) 2. Spiel Starten -> Schiffe zufällig auf dem Feld platzieren ( Wie? ) 3. Klick auf das Feld (Zähler +1): 3.1 Treffer? -> Ja -> Dann Überprüfung ob Schiff versenkt? -> Ja -> Meldung ''Schiff versenkt'' ( Nein? -> Dann naechster Klick 3.2 Treffer? -> Nein -> Dann naechster Klick4. Solange Wiederholen bis alle Schiffe getroffen wurden -> 1.-3. weiderholen 5. Alle Schiffe getroffen? -> Ja -> Meldung: ''Sie haben gewonnen - ... Versuche'' 6. Hervorhebung des Highscores -> Name eintragen -> Im Highscore speichern Waere das so für das komplette Programm eine grober Plan? Hoffe ihr könnt mir Folgen (: Danke im Vorraus. :thumb: |
AW: Schiffe versenken programmieren
Das Platzieren der Schiffe ist einer der beiden Hauptaufgaben. Die zweite ist mit einer Logik die Schiffe des Spielers durch den Computer zu finden. Wobei das ist noch für die einfachere der beiden Hauptaufgaben halten, denn wenn ich mir einige Battleship Computerspiele angucke, wird nur nach einem Raster gesucht. Wird was gefunden, wird die Nachbarschaft geprüft.
Die komplizierter der beiden Hauptaufgaben ist eher das Platzieren der Schiffe. Was für den Menschen kein Problem ist, muss erst mit Logik im Programm umgesetzt werden. Die Überschneidung der Schiffe prüfen ist noch das kleinere Problem. Das kann man noch relativ einfach prüfen. Etwas schwieriger ist die Prüfung auf das aneinander Stoßen, denn aneinander stoßen bedeutet nicht, dass die Schiffe sich nicht berühren dürfen. Parallel aneinander liegen ist nach den Regeln nicht verboten. |
AW: Schiffe versenken programmieren
@ Popov
Wie ich schon gesagt habe.. Ich mache nur ein Feld, d.h. ich hab kein Computer der Spielzüge machen muss.. Das Ziel ist es mit so wenig Zügen wie möglich zu gewinnen. Mein Plan war jetzt (Überarbeitet): 1. Generieren des Spielfeldes durch eine Imgakomponente ( evtl. StringGrid ) 2. Spiel Starten -> Schiffe zufällig auf dem Feld platzieren ( Wie? ) 3. Klick auf das Feld (Zähler +1) ( if ... then ; else ... ) 3.1 Treffer? -> Ja -> Dann Überprüfung ob Schiff versenkt? -> Ja -> Meldung ''Schiff versenkt'' ( Nein? -> Dann naechster Klick 3.2 Treffer? -> Nein -> Dann naechster Klick 4. Solange Wiederholen bis alle Schiffe getroffen wurden -> 1.-3. weiderholen 5. Alle Schiffe getroffen? -> Ja -> Meldung: ''Sie haben gewonnen - ... Versuche'' 6. Hervorhebung des Highscores -> Name eintragen -> Im Highscore speichern |
AW: Schiffe versenken programmieren
Vergiss das Grid erst einmal, das ist ja nur die Darstellung. Du solltest zunächst das Gesamtproblem in kleinere Teilprobleme und diese wiederum in noch kleinere Teilprobleme zerlegen, bis eine weitere Zerlegung nicht mehr sinnvoll erscheint. Diese "Kleinstprobleme" werden dann einzeln in Funktionen oder Prozeduren gelöst. Nehmen wir doch die Platzierung als Beispiel:
- Zufällige Position ermitteln - Position zulässig? -> alle Regelbedingungen erfüllt? Ja -> nächstes Schiff Nein -> zurück zum Anfang Man könnte also eine Funktion ZulaessigePosition mit einem Boolean-Rückgabewert schreiben, die nacheinander die Regelbedingungen (wieder einzelne Boolean-Funktionen) abprüft. Nach diesem Schema baut man dann nach und nach die gesamte Anwendung auf. |
AW: Schiffe versenken programmieren
ok ich werde jetzt mit Hilfreichen Punkten den Plan erweitern (:
Mein Plan war jetzt (Überarbeitet): 1. Generieren des Spielfeldes durch eine Imgakomponente ( evtl. StringGrid ) 2. Spiel Starten -> Schiffe zufällig auf dem Feld platzieren ( evtl mit Boolean ''True o. False'' ) 2.1. Zufällige Position ermitteln 2.2. Position zulässig? -> Alle Regelbedingungen erfüllt? 2.3. Ja -> nächstes Schiff // Nein -> zurück zum Anfang3. Klick auf das Feld (Zähler +1) ( if ... then ; else ... ) 3.1 Treffer? -> Ja -> Dann Überprüfung ob Schiff versenkt? -> Ja -> Meldung ''Schiff versenkt'' // Nein? -> Dann naechster Klick 3.2 Treffer? -> Nein -> Dann naechster Klick4. Solange Wiederholen bis alle Schiffe getroffen wurden -> 1.-3. weiderholen 5. Alle Schiffe getroffen? -> Ja -> Meldung: ''Sie haben gewonnen - ... Versuche'' 6. Hervorhebung des Highscores -> Name eintragen -> Im Highscore speichern Über weitere Vorschläge und Hinweise wäre ich Dankbar (: Könnte ich 3. mit ''if'' machen? |
AW: Schiffe versenken programmieren
Es gibt bei 3. ja nur 2 Möglichkeiten: Treffer oder kein Treffer, da bietet sich ein If ja geradezu an ;)
|
AW: Schiffe versenken programmieren
Liste der Anhänge anzeigen (Anzahl: 5)
Die Platzierung der Schiffe kann so erfolgen:
Für die Start-Koordinaten gibt es aber je nach Orientierung und Schiffsgröße Einschränkungen, die man schon im Vorfeld berücksichtigen kann:
Delphi-Quellcode:
und beim Platzieren des Schiffs diesen Status in alle Nachbarfelder zu schreiben. Dann wird auch die Prüfung wesentlich unkomplizierter.
NearShip
Im Spiel selber wird der Status
Delphi-Quellcode:
dann genauso behandelt wie
NearShip
Delphi-Quellcode:
.
Water
Hier mal der interne Zustand des Spielfeldes nach 7 Schüssen Anhang 40522 Legende Anhang 40523 |
AW: Schiffe versenken programmieren
Vielen Dank Ruso, jedoch möchte ich erstmal mein kompletten Plan fertigstellen und dass geht doch schon wieder in die Richtung Codierung? ^^
|
AW: Schiffe versenken programmieren
Zitat:
|
AW: Schiffe versenken programmieren
Liste der Anhänge anzeigen (Anzahl: 3)
Für die Spieler-Anzeige werden
Delphi-Quellcode:
,
Water
Delphi-Quellcode:
und
NearShip
Delphi-Quellcode:
behandelt wie
Ship
Delphi-Quellcode:
und man bekommt bei diesem Stand
Water
Anhang 40526 das heraus Anhang 40524 Legende Anhang 40525 |
AW: Schiffe versenken programmieren
ok ok ^^
Ich werde deine Idee in meine Projektplanung die ich morgen mache einbeziehen ja? (: Das wurde ja mithilfe des StringGrids gemacht oder? Dann werde ich die Bilder als Anschauung für unsere lehrerin benutzen. (: |
AW: Schiffe versenken programmieren
Zitat:
Da ist nicht ein Gramm Delphi (oder sonstige Programmiersprache) drin Das meinte ich die ganze Zeit mit Blatt Papier und malen ... :roll: |
AW: Schiffe versenken programmieren
Zitat:
Genauso ist es mit dem oberen Plan. Zitat:
1. Vorbereitung 1.1. ein Record für Array-Zellen generieren (damit hat man mehr Möglichkeiten) 1.2.1. eine Array-Matrix für das Spielfeld Spieler generieren 1.2.2. eine Array-Matrix für das Spielfeld Computer generieren 1.3. Spielanfang, alle Zellen löschen 1.4.1. Computer 10 Schiffe aufstellen lassen 1.4.1.1. Schiffspositionen zufällig generieren 1.4.1.2. Schiffsposition auf Überschneidung prüfen 1.4.1.3. Schiffsposition auf aneinander stoßen prüfen 1.4.1. Spieler 10 Schiffe aufstellen lassen 1.4.1.1. Schiffsposition auf Überschneidung prüfen 1.4.1.2. Schiffsposition auf aneinander stoßen prüfen 1.5. Grafikausgabe Spielerfeld 2. Spiel ... |
AW: Schiffe versenken programmieren
@Popov
Wenn man sich die ganze Zeit an einem StringGrid verbeißt und auch nach gefühlten 20 Aufforderungen es nicht schafft ein Blatt Papier und Stift zu nehmen und das mal aufzumalen und durchzuspielen (mit Papier und Stift), ja dann rennt man tatsächlich planlos durch die Gegend. Hast du bei meinen Grafiken irgendwo etwas von Array gelesen? Nein, wozu auch, das interessiert überhaupt nicht, in welcher Struktur ich das speicher (ich könnte das auch in einem String speichern) Ich habe lediglich Überlegungen dazu angestellt, was beachtet werden muss, wie man die Positionierungs-Regeln umsetzt und was für einen Status die einzelnen Felder haben können. Wenn ich diese Überlegungen hinter mir habe, dann mache ich mir Gedanken, ob ich da ein Array oder Liste oder Dictionary nehme ... aber dann bin ich schon bei der Umsetzung und klappere auf der Tastatur rum. |
AW: Schiffe versenken programmieren
Popov , ließt du dir meine Sachen eigl auch durch? ^^
Ich habe schon 3x geschrieben , dass ich kein Computer habe.. Außerdem geht es um die Planunf und nicht gleich um die Codierung ob ich Array nutze oder nicht.. @ Sir Rufo Ich habe es aufgemalt aber hab halt wenig programmiert und mir fehlen halt die Zusammenhänge um es ordentlich zu planen ^^ Schonmal vielen dank für deine Zeit (: Ich werde das Feld später mit einem StringGrid generieren obwohl ich noch nicht weiß wie das geht (hab dafür ja 2 monate zeit ) Zum zufälligen Positionieren wäre doch Boolean nützlich oder sehe ich das falsch? (dann könnte ich es kurz in der Planung erwähnen.. ) |
AW: Schiffe versenken programmieren
Zitat:
Stell dir einfach vor, du musst einer Person das Spiel "Schiffe Versenken" erklären, so dass er nachher den Part des Programms übernehmen kann. Dabei gibts du ihm auch ein paar Kniffe und Tricks mit, die du herausgefunden hast (siehe Positionierung eines Schiffes mit den Start-Koordinaten) Zitat:
Zitat:
|
AW: Schiffe versenken programmieren
Zitat:
Zitat:
Kommen wir zurück zu der Struktur. Man muss sich am Anfang für eine der beiden Varianten entscheiden, später geht schlecht. Somit ist es meiner Meinung nach nicht unwichtig wie man es später speichert. |
AW: Schiffe versenken programmieren
Zitat:
Vorausgesetzt du hast einen Computer, meinst aber keinen Computergegner zu haben, in dem Fall stellt sich die Frage was du da eigentlich programmieren sollst? Dann ist das eigentlich keine richtige Aufgabe. |
AW: Schiffe versenken programmieren
Zitat:
|
AW: Schiffe versenken programmieren
@ Popov
Das Ziel meines Programmes ist halt so wenig wie möglich züge zu brauchen um alle schiffe zu versenken. (: @ Rufo Das waere bis jetzt meine vorläufige Planung: Projektplanung - ,,Schiffe versenken'' 1. Generieren des Spielfeldes durch ein StringGrid 1.1. 12x12 Feld erstellen mithilfe ( vertikal A-L und horizontal 1-12 )2. Spiel Starten -> Schiffe zufällig auf dem Feld platzieren ( evtl mit Boolean ) 2.1. Zufällige Position ermitteln3. Klick auf das Feld (Zähler +1) ( if ... then ; else ... ) 3.1. Treffer? → Ja → Dann Überprüfung ob Schiff versenkt? → Ja -> Meldung''Schiff versenkt'' // Nein? → nächster Klick 3.2. Treffer? → Nein → nächster Klick4. Solange Wiederholen bis alle Schiffe getroffen wurden -> 3. wiederholen 4.1. Zähler nach jedem Klick auf dem Spielfled um 1 erhöhen5. Alle Schiffe getroffen? 5.1. Wurden alle Schiffe getroffen? → Ja? → Meldung anzeigen: ''Alle Schiffe getroffen''6. Erscheinen des Highscores 6.1. Highscore ( Liste der Besten Spieler ) erstellenDie Bilder hab ich jetzt hier mal weggelassen.. In welchem Bereich könnte ich genauer werden? |
AW: Schiffe versenken programmieren
Zitat:
Woher sollen wir wissen ob du dich überhaupt schon mal mit Delphi beschäftigt hast. Ich hoffe hab jetzt nicht zu viel gesagt und jemand verärgert. gruss |
AW: Schiffe versenken programmieren
1. ist immer noch falsch. Zuerst die Logik, dann die Darstellung. Ob das letztendlich ein StringGrid wird, ein Array of TPanel oder ein TSchießMichTot, ist doch erst einmal vollkommen irrelevant.
|
AW: Schiffe versenken programmieren
KI hört sich gewaltig an, aber schon eine if Abfrage ist ein KI.
Zitat:
Zitat:
|
AW: Schiffe versenken programmieren
Isses denn so schwer? Ein Spielfeld, auf das so lange geballert wird, bis alle Schiffe versenkt sind, zurückgeschossen wird nicht. Das entspricht zwar nicht dem klassischen Schiffe versenken, ist aber zumindest ähnlich.
|
AW: Schiffe versenken programmieren
Du triffst es genau ! :D
|
AW: Schiffe versenken programmieren
Liste der Anhänge anzeigen (Anzahl: 3)
Hier mal ein paar Ablaufdiagramme (und immer noch nix mit Programmierung)
Anhang 40527 Anhang 40528 Anhang 40529 (BTW: erstellt mit dem PAP-Designer) |
AW: Schiffe versenken programmieren
Ja eine Vereinfachung meiner Art. Warum bekomm ich das nicht gleich so konstant und gut hin ^^
Also ich denke damit sollte meine Planung insgesamt durch Ablaufplan + Ablaufdiagramme vollendet sein (: |
AW: Schiffe versenken programmieren
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:20 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