![]() |
Delphi-Version: 5
Schiffe versenken programmieren
Guten Tag Liebe Delphi-Community,
Ich muss momentan ein Programm für den Informatikunterricht erstellen. Meine Aufgabe ist ,,Schiffe versenken'' zu programmieren. Jedoch hab ich dafür bis jetzt wirklich sehr wenig vorkenntnisse und weiß ehrlich gesagt nicht wie ich anfangen soll und es systematisch aufbauen soll. Ich bin total überfragt, da ich auch im Internet noch nichts konkretes gefunden habe /: Meine Aufgaben: - Spielfeld 12x12 + Schiffe generieren mit zufallsfunktion - Eingabe und Auswertung eines Spielerzuges - Speichern und Laden eines Spielzuges Ich hoffe ihr könnt mir weiterhelfen, da ich wirklich nicht weiß wie ich das anstellen soll. :? |
AW: Schiffe versenken programmieren
Herzlich Willkommen in der DP.
Um dir helfen zu können müsstest du uns noch etwas mehr mitteilen: Wenig Vorkenntnisse heißt jetzt genau was? (Wenn du so gut wie gar nichts weißt, dann können wir dir auch nicht helfen, außer den Hinweis auf ein Delphi-Einsteiger-Tutorial zu geben) Nichts konkretes im Internet gefunden heißt? (Ich habe auf Anhieb x Treffer und bei den ersten 10 soger ein komplettes Projekt mit Source - noch konkreter geht irgendwie nicht, oder?) Um etwas zu programmieren, muß man die Thematik (Schiffe versenken) verstanden haben und kann sich dann Gedanken machen, was muss wie gemerkt (gespeichert) werden. Hier hilft auch schon mal ein Zettel mit einer Skizze, wie das Spielfeld zur Mitte des Spiels stehen könnte (einfach mal durchspielen). Schon sieht man, welche Informationen man braucht um das auch so letztendlich auf den Bildschirm zu bringen. So fängt man also an :) |
AW: Schiffe versenken programmieren
Schon mal Danke für deine Zeit mir das zu schreiben (:
Wenig Vorkenntnisse heißt jetzt genau was? Ich habe schon einige Vorkenntnisse , also behersche die Grundlagen der Programmierung. Also brauch jetzt keine Hilfe wie und was ich machen soll, sodern bräuchte einen Ansatz. Nichts konkretes im Internet gefunden heißt? Ich habe auch einige Treffer bekommen, jedoch war dies meist sehr Unterschiedlich und hat mir nicht geholfen? Hättest du ein bestimmten Link dieser Seiten bzw. Projekte? Zur Programmierung: Ich hab keine Idee wie ich die Felder erstelle um auf denen dann zufällige Schiffe zu generieren. Außerdem hab ich keine Lösung um die ''getroffen'' Schiffteile anzuzeigen sobald man ein bestimmtes Feld geklickt hat.. Gibt es vllt Strktuogramme oder ähnliches, was mir dabei helfen könnte? Danke im Vorraus! (: |
AW: Schiffe versenken programmieren
![]() Nimm ein Blatt Papier, male das Spielfeld auf. Dann nimm dir 4 Würfel und würfel damit die Koordinaten zusammen und platziere die Schiffe. (Achtung auf Platzierungsregeln achten, wenn es nicht geht, dann erneut würfeln) Wenn alle Schiffe platziert sind, dann fang an zu schießen. Schreib dir dabei auf, was du wie und warum so gemacht hast, dass muss auch das Programm so machen. |
AW: Schiffe versenken programmieren
Mensch auf die Idee , dass zu googeln bin ich ja noch garnicht gekommen :wink:
Natürlich habe ich mir schon alles durchgelesen in den meisten foren aber ich bin noch immer nicht auf eine lösung gestoßen.. /: Ich bräuchte lediglich geeignete vorbetrachtungen die mir dabei helfen, da mir einfach der Ansatz fehlt.. Bin momentan echt überfragt.. :? |
AW: Schiffe versenken programmieren
Du solltest dir vielleicht überlegen, wie du dein Spielfeld aufbauen willst und was alles angezeigt werden soll (und wie es angezeigt werden soll). Du könntest für das Spielfeld z. B. ein StringGrid nehmen (FixedCols und FixesRows geben die Koordinaten an) oder das gesamte Spielfeld selbst zeichnen.
Dann musst du dir darüber im Klaren sein, wie ein Spielzug ablaufen soll. Hat man zwei Spielfelder (normal so üblich zumindest so wie ich es kenn) und siehst die Schiffe des Gegners auf dem einen und die beschossenen Punkte und auf dem anderen die eigenen Schiffe und die vom Gegner getroffenen Punkte ... Willst du deine Schiffe per Drag&Drop auf das Spielfeld ziehen können, oder gibtst du in einem Feld die Koordinaten an, auf denen das Schiff platziert werden soll? Die Schiffe dürfen nachdem das Spiel gestartet wurde nicht mehr bewegt werden können usw. Ich hoffe ich konnte dir wenigstens ein paar Denkanstöße geben, die du möglicherweise auch mit den gefundenen Suchergebnissen kombinieren kannst. Einfach mal der Kreativität freien Lauf lassen und dann an die Struktur des Programmes gehen und alle/die meisten Eventualitäten berücksichtigen. |
AW: Schiffe versenken programmieren
Und das hier
![]() hast du nicht gefunden (10. Treffer der Suche) Den Link zum Source in dem Beitrag findest du? Da ist ein fertiges Schiffe versenken |
AW: Schiffe versenken programmieren
Also mein Ziel ist es ein Feld 12x12 zu generieren auf dem:
- 1 4er Schiff - 2 3er Schiffe - 2 2er Schiffe - 2 1er Schiffe zufällig angeordnet sind.. Dann soll mit jedem Klick ein Zähler laufen bis das Spiel gewonnen wurde um die Züge zu ermitteln.. Frage die sich mir jetzt zuerst aufwirft.. Wie mache ich das mit einem StringGrid? |
AW: Schiffe versenken programmieren
Zitat:
Doch zum Einstieg in die Problematik dürfte man hier erstmal reichlich Anschauungsmaterial finden. Der TE scheint mir aber nicht so weit zu sein, damit wirklich was anfangen zu können ... |
AW: Schiffe versenken programmieren
Zitat:
Zitat:
Delphi-Quellcode:
?) für das Spielfeld und welche Werte sind dort möglich.
array
Die Ausgabe in ein StringGrid ist dann Spaziergang. |
AW: Schiffe versenken programmieren
ja ich würde das mit einem array [1-...] machen..
|
AW: Schiffe versenken programmieren
Und was für ein Datentyp
Delphi-Quellcode:
?
array[1..12,1..12] of ???
Und welche Werte können dort auftreten? |
AW: Schiffe versenken programmieren
welcher waere für dieses programm am besten?
|
AW: Schiffe versenken programmieren
Zitat:
|
AW: Schiffe versenken programmieren
Ich bin grad dabei das Feld mithilfe von StringGrid zu erstellen..
Brauche umbedingt Hilfe da ich es einfach nicht schaffe das Programm zu erstellen.. Mir würde momentan auch erstmal eine Projektplanung reichen? :? Bin das erste mal überfragt.. /: Danke im Vorraus |
AW: Schiffe versenken programmieren
Wo hängt es denn genau? Was hast du bisher? Form schon fertig und am Code hängt es jetzt? Bekommst du das Grid nicht so hin wie du es gerne hättest? Konkretisiere deine Frage doch bitte noch etwas, sonst wird er schwierig dir zu helfen. :roll:
|
AW: Schiffe versenken programmieren
Also ich habe gestern schon etwas angefangen aber nichts passte so wie es sollte.. Habe jetzt neu angefangen..
Wie sollte ich am Besten anfangen? /: Mit dem Programm hab ich noch 2 Monate Zeit aber bräuchte jetzt schon die Projektplanung /: |
AW: Schiffe versenken programmieren
Zitat:
Nein -> dann kann ich dich verstehen, das könnte ich auch nicht (und will ich auch nicht) Ich habe mittlerweile die Vermutung, du willst hier etwas Fertiges haben frei nach dem Motto "Lass doch mal die Anderen arbeiten". Dann bist du aber in der falschen Rubrik gelandet. Stell die Anfrage in ![]() |
AW: Schiffe versenken programmieren
Nein so ist das nicht.. Ich hab halt nur die Grundlagen in Info gelernt und in die Richtung waren wir noch nicht gegangen.. Ich hba halt das Problem , dass ich überhaupt nicht weiß wie ich anfangen soll bzw wie ich mit dem StringGrid arbeiten soll etc.. /:
|
AW: Schiffe versenken programmieren
Zitat:
|
AW: Schiffe versenken programmieren
Ich würde mir vielleicht erst mal
![]() |
AW: Schiffe versenken programmieren
Ok habe ich jetzt gemacht..
12x12 Spielfeld aufgezeichnet .. Ist bloß scheiße wenn die Schiff zufällig drauf sein sollen /: |
AW: Schiffe versenken programmieren
@leodinho
Meine Frage zu diesem Zeitpunkt ist: welche Programmierkenntnisse habt ihr? Die Frage ist wichtig, denn ein Problem kann man verschieden anpacken. Man kann z. B. eine TSchiffeVersenken Klasse erstellen. Nur stellt sich die Frage ob der Lehrer dir das dann auch abnimmt. Hat ihr das schon durchgekommen? Oder ohne Klasse. Soll alles einfach oder bunt sein, usw. |
AW: Schiffe versenken programmieren
So langsam bekomme ich lust Schiffe versenken zu programmieren...
1:1 über tcp/ip in Firemonkey 3d und so... :stupid: Sollen wir einfach mal? Mavarik |
AW: Schiffe versenken programmieren
Zitat:
Suche dir einen zufälligen Punkt und eine zufällige Richtung (links, oben, rechts, unten). Jetzt versuchen das Schiff anhand der Vorgabe zu platzieren. Wenn das nicht geht, dann neuer Punkt neue Richtung Wenn das geht dann zum nächsten Schiff |
AW: Schiffe versenken programmieren
@ Mavarik
Kannst du gerne machen jedoch hilft mir das auch nicht weiter, wenn ich ein fertiges Programm oderso hätte.. @ Popov Wir haben halt alle Grundlagen von Algorhtymenstrukturen zu Variablen bis hin zu Schleifen und Verkettunken und noch am Ende Sortier und Such - Algorythmen.. Das Problem: Viele aus meiner Klasse müssen halt nur eine Datenbank eines Sportvereins etc erstellen , was nicht so schwer ist.. Ich hab halt die Aufgabe bekommen ein Programm zu programmieren /: |
AW: Schiffe versenken programmieren
Ich hab hier ein Ansatz, ein Spielfeld. Benötigt wird eine PaintBox. Das habe ich mal für Tic Tac Toe erstellt. Ich hab es nur auf 12 Felder erweitert. Das Feld ist simpel und die Ansteuerung ist simpel. Vielleicht bringt es dich auf eine Idee.
Delphi-Quellcode:
const
MaxFelder = 12; //Breite der Zelle function CellWidth(Canvas: TCanvas): Integer; begin with Canvas do Result := (ClipRect.Right - ClipRect.Left) div (MaxFelder + 1); end; //Höhe der Zelle function CellHeight(Canvas: TCanvas): Integer; begin with Canvas do Result := (ClipRect.Bottom - ClipRect.Top) div (MaxFelder + 1); end; //Rect-Bereich der Zelle function CellRect(Canvas: TCanvas; x, y: Integer): TRect; begin with Canvas do Result := Rect(x * CellWidth(Canvas), y * CellHeight(Canvas), (x + 1) * CellWidth(Canvas), (y + 1) * CellHeight(Canvas)); end; //Text in Zelle mittig plazieren (horizontal und vertikal) procedure CellRectText(Canvas: TCanvas; x, y: Integer; Text: String); var a, b: Integer; begin with Canvas do begin //Vermittelt Text in Höhe und Breite a := (CellWidth(Canvas) div 2) - (TextWidth(Text) div 2); b := (CellHeight(Canvas) div 2) - (TextHeight(Text) div 2); with Canvas do TextRect(CellRect(Canvas, x, y), (x * CellWidth(Canvas)) + a, (y * CellHeight(Canvas)) + b, Text); end; end; procedure DrawMatrix(Canvas: TCanvas); var x, y: Integer; s: String; begin with Canvas do begin Font.Color := clBlack; Font.Style := [] + [fsBold]; //X-Koordinaten-Beschriftung zeichnen (1, 2, 3, ...) y := 0; for x := 1 to MaxFelder do begin s := IntToStr(x); CellRectText(Canvas, x, y, s); end; //Y-Koordinaten-Beschriftung zeichnen (A, B, C, ...) x := 0; for y := 1 to MaxFelder do begin s := Chr(y + 64); //64 ist das Ascii-Zeichen für @, ein Zeichen vor A CellRectText(Canvas, x, y, s); end; //Beispiel CellRectText(Canvas, 3, 5, 'X'); CellRectText(Canvas, 6, 9, 'X'); CellRectText(Canvas, 4, 7, 'O'); //Gitter zeichnen Canvas.Brush.Style := bsClear; for x := 1 to MaxFelder do for y := 1 to MaxFelder do begin Pen.Color := clGray; Rectangle(CellRect(Canvas, x, y)); end; end; end; procedure TForm1.Button1Click(Sender: TObject); begin with PaintBox1 do DrawMatrix(Canvas); end; |
AW: Schiffe versenken programmieren
@Popov
Das ist aber der Teil der zum Schluß kommt. Der TE hat aber bis jetzt nur den linken Fuß gehoben. Von losgehen oder Schluß in Sicht kann man hier nicht sprechen. Von daher trägt dein Beitrag im Moment nur zur Verwirrung bei. Zu einem späteren Zeitpunkt wird dieser Beitrag sehr hilfreich sein. |
AW: Schiffe versenken programmieren
Ja ich wollte es auch grad schreiben..
Ich bin mir unschlüssig wie ich nun das Feld erstellen soll.. Soll ich es mit einer Imagekomponente oder mit einem StringGrid machen? Ich weiß einfach nicht wie ich anfangen soll.. Aufgemalt habe ich auch schon alles aber hilft auch nicht /: |
AW: Schiffe versenken programmieren
@Sir Rufo
Da bin ich vorläufig einer anderen Meinung. Im Grunde würde ich die evtl. zustimmen, aber unter anderen Umständen. Ich weiß auf was du hinaus willst. Zuerst zwei Arrays erstellen, Schiffe platzieren und das Ganze trocken abspielen. Und wenn alles funktioniert, kümmern wir uns um die Ausgabe. Auf der anderen Seite fragt der TE schon seit zwei Tagen und bis auf warme Worte hat er bisher nichts bekommen, d. h. der hat noch nicht mal den ersten Schritt gemacht. Der Code oben ist ein mögliches Ziel. Er kann sich auch ein anderes entwickeln, aber es ist vorläufig ein Ziel. Ein Feld von 12x12. Auf das hin kann er hinarbeiten. Wenn du aber meinst, dass kein professioneller Programmierer so arbeitet, er ist kein professioneller Programmierer. @leodinho Als der Lehrer Aufgaben verteilte hast du vermutlich gedacht eine leichtere Aufgabe ergattert zu haben. Das war vermutlich kein guter Gedanke. Du überlegst nun das Ganze mit einem StringGrid zu lösen, weil es ja schon das typische Feld hat. Ich denke nicht, dass das ein guter Gedanke ist. Es hat Vorteile, man muss nichts zeichnen, aber das Beispiel oben zeigt, dass das Zeichnen das kleinste Problem ist. Die Nachteile die ein StringGrid mit sich bringt kommen später. |
AW: Schiffe versenken programmieren
So das wäre momentan mein Entwurf , es kann auch erfolgreich kompiliert werden jedoch kommt eine Meldung wenn ich dann gestartet habe /:
Meldung: Projekt project1 hat Exception Klasse >> External:SIGSEGV << ausgelöst. In Datei ''grids.pas'' in zeile 4891 Würde gern eine Meinung zum Quellcode (:
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Grids; type { TForm1 } TForm1 = class(TForm) StringGrid1: TStringGrid; StringGridSpielfeld: TStringGrid; procedure FormCreate(Sender: TObject); private { private declarations } public { public declarations } end; const COLS = 12; ROWS = 12; var Form1: TForm1; SpielfeldIntern :array[1..COLS, 1..ROWS] of integer; implementation {$R *.lfm} { TForm1 } procedure TForm1.FormCreate(Sender: TObject); begin StringgridSpielfeld.ColCount:=COLS; StringgridSpielfeld.RowCount:=ROWS; end; end. |
AW: Schiffe versenken programmieren
Zitat:
Delphi-Quellcode:
Da COLS immer ROWS ist, würde ich dafür eine Konstante nutzen.
const COLS = 12;
ROWS = 12; Wie ich schon sagte, StringGrid erscheint im ersten Moment die beste Wahl, aber bedenke, dass du mehrere Informationen verwalten musst. Welches Schiff ist es, welcher Teile getroffen wurden, ist es versunken? |
AW: Schiffe versenken programmieren
Ja aber mit der Imagekomponente bekomm ich es erst garnicht hin ein Spielfeld zu entwerfen /:
|
AW: Schiffe versenken programmieren
@Popov
Eine Textaufgabe löst man, indem man den Sinn versteht, in einzelnen logischen Teile zerlegt und sich den passenden Rechenweg überlegt. Dann fängt man an zu rechnen. So sollte man das eigentlich gelernt haben. Warum das beim Programmieren anders sein soll oder auf einmal nur professionellen Programmierern vorbehalten ist, hört sich fast nach Lobotomie bei den nicht- professionellen Programmierern an. |
AW: Schiffe versenken programmieren
Ich glaub du solltest erstmal alle deine Mitschriften im Unterricht nochmal genau lesen, speziell zu Arrays, Klassen und deren Eigenschaften und Methoden. Danach solltest du dir ueberlegen wie du das umsetzen willst und Schritt fuer Schritt programmieren. Wieviel Zeit hast du denn dafuer?
|
AW: Schiffe versenken programmieren
Mal ne Frage (auch an Popov):
Habt ihr das Spiel "Schiffe versenken" verstanden? Meines Wissens nach gibt es für die Platzierung folgende Regeln:
Als Datenstruktur reicht somit Folgendes vollkommen aus
Delphi-Quellcode:
BTW: Das Spiel ist beendet, wenn es keine Felder mehr mit dem Status
TEnvironmentState = (esWasser, esSchiff, esDaneben, esTreffer);
TEnvironment = array[1..12,1..12] of TEnvironmentState;
Delphi-Quellcode:
gibt.
esSchiff
Zitat:
|
AW: Schiffe versenken programmieren
Mein Problem ist halt dass ich bis dienstag meine Projektplanung fertig haben muss und dann noch 2 Monate um Programm und die Extras zu erstellen.. /:
Jedoch ist mir nicht ganz klar wie ich mir für dieses Projekt ein Plan aufschreiben kann /: |
AW: Schiffe versenken programmieren
Indem man das Problem analysiert und dabei z.B. feststellt, dass jedes Zelle in dem Spielfeld 4 Zustände annehmen kann.
Bei einem Schuss auf ein Feld wird der Status des Felds verändert und bei einem Treffer werden die Nachbarzellen untersucht, ob das Schiff versenkt wurde. Sind nach dem Schuss (mit einem Treffer) keine Felder mehr mit dem Status Schiff vorhanden, dann ist das Spiel beendet. |
AW: Schiffe versenken programmieren
Guten Abend,
die Regeln zum Schiffeversenken: ![]() Was verstehst Du bzw. Dein Lehrer unter Projektplanung? Grüße Klaus |
AW: Schiffe versenken programmieren
Projektplanung:
- grober Aufbau / Ablauf - wenn es geht Struktogramme (obwohl ich jetzt nicht wüsste wie ich dazu Struktogramme erstellen könnte) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz