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-Gegner0Der 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 (ohneControls.Find
benutzen zu müssen) - also Änderung deiner bisherigenInitializeGame()
-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ßenForm
-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 immerMainForm
- habe aber auch meist die UI-Funktionalität dann in passend benanntenUserControls
untergebracht) - kannst es z.B. auchGameForm
oderBattleShipForm
nennen.
-
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.
- Dadurch stünde z.B. bei der Klasse
Ein Beispiel für Dokumentation findest du unter:
https://download.autodesk.com/global/docs/mayasdk2012/en_us/index.html
- 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
-
@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.rarMir 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
(stattKI
) benutzen...Und noch ein Fehler:
Du verwendest mehrfach in den einzelnen KI-MethodenRandom 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 einfacherawait Task.Delay(500)
(in Verbindung mitasync
) 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:- feluelle / battleships
- bogosorted / WindowsFormsBattleShip (UI-Sprache ist aber portugiesisch)
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 BoardA grid to represent the game board where players can place their ships and make guesses.
Ship PlacementLogic to allow players and AI to place their ships on the board.
Guessing MechanismPlayers and AI take turns guessing the location of ships.
AI LogicA simple algorithm for the AI to make guesses (random or more sophisticated).
Step-by-Step Implementation- Set Up Your WinForms Project
Open Visual Studio and create a new WinForms App (.NET Framework) project. - 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").
- Set Up Your WinForms Project