C# und WinForms am Beispiel Schiffe versenken (Battleship) mit KI-Gegner



  • Ich habe in einem C# / WinForms Tutorial ein Beispiel mit dem Thema Schiffe versenken (Battleship).
    https://www.henkessoft.de/Windows Forms/Windows Forms Csharp - 1.htm#Jetzt_spielen_wir_Schiffe_versenken_gegen_einen_KI-Gegner0

    Der KI-Gegner wehrt sich bereits raffiniert. Vielleicht interessant für Leute, die mit C# / WinForms einfache 2D Spiele basteln wollen bzw. an interessanten Beispielen in C# einsteigen wollen.

    Gibt es andere Vorschläge dieser Art für dieses C# WinForms Tutorial?



  • Du willst den Anfängern doch nicht zumuten, daß diese die Buttons (2 * 100) von Hand im Designer platzieren und auch noch richtig benennen sollen???

    Schreib doch einfach eine Methode, welche einen Button erzeugt (CreateButton(...)) und diese in einem Raster platziert - und dann kannst du diese auch gleich in dem 2D-Array (bzw. einer verschachtelten Liste) speichern (ohne Controls.Find benutzen zu müssen) - also Änderung deiner bisherigen InitializeGame()-Methode.

    Und die Ship-Klasse sollte keine Referenzen auf die Buttons haben, sondern nur die Grid-Indizes (x,y): Trennung von UI und Logik!
    Dies solltest du gleich konsequent durchführen, also verschiedene Klassen für Spiellogik und UI (anstatt alles in einer großen Form-Klasse)!

    Und du solltest das Projekt zum Download anbieten und nur den relevanten Code auf der Seite anzeigen und erklären (das ist bisher viel zu unübersichtlich).

    PS: Und auch beim Tic-Tac-Toe-Projekt solltest du das manuelle Ändern der Designer-Datei nicht zeigen, denn dies geht auch alles über den Designer (für die Events den "Blitz"-Button benutzen)!

    PS: Die Standardnamen (wie Form1) solltest du dann auch anpassen (ich nenne es bei mir einfach immer MainForm - habe aber auch meist die UI-Funktionalität dann in passend benannten UserControls untergebracht) - kannst es z.B. auch GameForm oder BattleShipForm nennen.



  • @Erhard-Henkes

    Moin,

    ich habe mir deinen Code angeschaut und mir fallen da ein paar Punkte auf:

    • Dein Klassendesign ist nicht gut und spiegelt sich in deiner Webseite wieder. Ehrlich gesagt erschlägt deine Webseite mich. Es fehlen Inhaltsverzeichnis, eine klare Strukturierung und eine Feingliederung. Stattdessen erklärst du direkt deine Ship Klasse.
    • Trenne bitte deine KI von der GUI. Sonst mutiert deine GUI zur eierlegenden Wollmilchsau. Ich würde vorschlagen eine abstrakte Klasse SinkShipsStrategyInterface einzuführen, s.d. du verschiedende Strategien testen kannst. Die Implementierung könnte man z.B. SimpleStrategy nennen. So kannst du auch direkt Interfaces erklären.
    • Du hast dir viel Mühe mit der Dokumentation gemacht. Warum nutzt du kein Doxygen oder ähnliches, s.d. die Dokumentation an dem Code gebunden ist? Doxygen akzeptiert auch Markdown, s.d. du ruhig eine Readme.md anbieten kannst. Gitlab lässt grüßen.
      • Dadurch stünde z.B. bei der Klasse SimpleStrategy folgende Dokuementation: Einfache Strategie, welche per Zufall Schüsse plaziert.
      • Oder es könnte auch eine Klasse MapStrategy mit der folgenden Dokumentation geben: Strategie welche eine Karte nutzt. In dieser Karte stehen alle bisherigen platzierten Schüsse und alle Punkte wo definitiv keine Schiffe sein können. Alle Schüsse sind zufallsbedingt, berücksichtigen aber die Karte und sind normalverteilt.

    Ein Beispiel für Dokumentation findest du unter:

    https://download.autodesk.com/global/docs/mayasdk2012/en_us/index.html



  • @Quiche-Lorraine sagte in C# und WinForms am Beispiel Schiffe versenken (Battleship) mit KI-Gegner:

    Du hast dir viel Mühe mit der Dokumentation gemacht

    Die Dokumentation lasse ich durch KI erstellen, übernehme nur das Fein-Tuning.

    Danke für die Rückmeldungen zum Klassendesign.



  • @Th69 sagte in C# und WinForms am Beispiel Schiffe versenken (Battleship) mit KI-Gegner:

    Du willst den Anfängern doch nicht zumuten, daß diese die Buttons (2 * 100) von Hand im Designer platzieren und auch noch richtig benennen sollen

    Ja, das ist richtig. Daher biete ich einen Download an.
    http://www.henkessoft.de/Windows Forms/WindowsFormsApp_BattleShip.rar

    Mir geht es um die Beschäftigung mit dem Spielablauf und der implementierten KI.

    Für Anfänger ist dieser Konsolenkurs geeigneter:
    https://www.henkessoft.de/Csharp/Csharp - 1.htm



  • Den Download (bzw. die Navigation zu deiner Hauptseite) solltest du aber auch dann auf deiner Seite direkt verlinken (wenn du diese schon als Tutorial-Link hier veröffentlichst).

    Mir geht es um die Beschäftigung mit dem Spielablauf und der implementierten KI.
    Für Anfänger ist dieser Konsolenkurs geeigneter:
    ...

    Als Vorzeigeprojekt (gerade auch für Fortgeschrittene) sollte dann erst recht die KI auch komplett unabhängig von der UI sein (und nur auf der Spiellogik basieren).

    PS: Wenn du schon den Code auf englisch hast, dann solltest du auch AI (statt KI) benutzen...

    Und noch ein Fehler:
    Du verwendest mehrfach in den einzelnen KI-Methoden

    Random rand = new Random();
    

    Dies sollte man nur einmalig machen - du hast doch extra eine private Membervariable dafür erstellt:

    private readonly Random rand = new Random();
    

    Und statt dem (Oneshot) Timer solltest du einfacher await Task.Delay(500) (in Verbindung mit async) verwenden.



  • @Th69 sagte in C# und WinForms am Beispiel Schiffe versenken (Battleship) mit KI-Gegner:

    Den Download (bzw. die Navigation zu deiner Hauptseite) solltest du aber auch dann auf deiner Seite direkt verlinken (wenn du diese schon als Tutorial-Link hier veröffentlichst).

    Ja, der Link ist auf der Seite ganz am Ende.

    Danke für deine weiteren Tipps.

    Übrigens habe ich bisher kein anderes vergleichbares BattleShip in C# / WinForms gefunden.



  • @Erhard-Henkes sagte in C# und WinForms am Beispiel Schiffe versenken (Battleship) mit KI-Gegner:

    Ja, der Link ist auf der Seite ganz am Ende.

    OK, jetzt habe ich es gefunden. Ist aber ziemlich versteckt, da danach nochmals Code kommt (ein weiterer Punkt bzgl. "Übersichtlichkeit" ;-).

    Edit:
    Auf deutsch habe ich auch kein WinForms-"Schiffe versenken" gefunden, aber auf GitHub:

    Und dann noch dieses englische Tutorial: C# Tutorial – Create a Simple Battle Ship Game in Visual Studio (es verwendet leider auch im Designer platzierte Buttons - aber wenigstens ist die Seite übersichtlicher gestaltet, gerade auch die Darstellung des Codes).

    In einigen anderen Ländern gibt es anscheinend nur 4x4 anstatt 10x10 große Felder.



  • Danke für deine Sucharbeit.

    Ich habe das Projekt vielleicht etwas zu früh publiziert, werde es demnächst überarbeiten.



  • Das erste Projekt davon gefällt mir persönlich ganz gut (bes. auch der Projektaufbau). Die dazugehörige BattleshipsEngine gibt es unter feluelle / battleships-engine.



  • Creating a Battleship game using C# and WinForms can be a fun and educational project, especially if you want to implement AI opponents. Below is a simple example that outlines how to structure the project and some key components you can include.

    Overview of the Game
    Battleship is a strategy game where players take turns guessing the locations of each other's ships on a grid. For the AI opponent, we can implement a simple algorithm to make guesses.

    Key Components
    Game Board

    A grid to represent the game board where players can place their ships and make guesses.
    Ship Placement

    Logic to allow players and AI to place their ships on the board.
    Guessing Mechanism

    Players and AI take turns guessing the location of ships.
    AI Logic

    A simple algorithm for the AI to make guesses (random or more sophisticated).
    Step-by-Step Implementation

    1. Set Up Your WinForms Project
      Open Visual Studio and create a new WinForms App (.NET Framework) project.
    2. Design the UI
      Use a DataGridView or multiple Buttons to represent the game board for both the player and AI.
      Include buttons for starting the game, placing ships, and making guesses.
      Add labels or text boxes for displaying messages (e.g., "Hit!", "Miss!", "AI's Turn").

Anmelden zum Antworten