Spiel auf WinForms + C # in 16 Jahren (2 Teil)

Hintergrund


Seit dem Schreiben des vorherigen Artikels ist eine Weile vergangen. Wie versprochen habe ich den zweiten Teil geschrieben. Ich möchte mich bei allen bedanken, die in den Kommentaren Ratschläge gegeben haben, von allen konnte ich etwas Neues lernen. Für diejenigen, die das Projekt sofort sehen möchten, gibt es hier einen Link zum GitHub-Projekt.

Ich möchte nur darauf hinweisen, dass alles, was in dieser Version hinzugefügt und geändert wurde, mit einem sehr gemacht wurde
viel arbeit, viele fehler. Mein Google war mit einer großen Anzahl von Anfragen gefüllt, die von den Funktionen der Implementierung von MVP bis zu asynchronen Methoden reichten.

Bild


Aktualisierungen


  1. Eigenen Karteneditor hinzugefügt (wie im Originalspiel).
  2. Sounder implementiert.
  3. Die Fähigkeit, den Donk und das Drehen zu fangen, wurde hinzugefügt.
  4. Viele Fischarten hinzugefügt.
  5. Stark verbesserte Projektleistung.
  6. Eine große Anzahl von Fehlern wurde behoben.
  7. Auch eine deutliche Verbesserung der Architektur der Anwendung (genauer gesagt ihres Erscheinungsbildes).
  8. Das Speichern des Spielerprofils wurde hinzugefügt.
  9. Realisierte Trophäen.
  10. Tag- und Nachtwechsel hinzugefügt.
  11. Reise hinzugefügt.
  12. Implementierte ein Lebensmittelgeschäft.
  13. Implementierte das MVP-Muster.
  14. Implementierte ein System von Ereignissen im Spiel
  15. Eingesetzter Köder, der Zutaten mischen kann
  16. Sprachausgabe hinzugefügt
  17. Animationen hinzugefügt
  18. Der Verschleiß der Ruten ist abhängig von der Größe des Fisches und der Überlebenszeit

Ich werde der README Git-Projektdatei weitere Änderungen hinzufügen.

Wie der Code eines anderen in die Irre geführt hat.


Bild

Im Screenshot sehen wir den Karteneditor zum Angeln, nämlich das Tiefenraster für jeden Ort (Dies sind Beschriftungselemente mit FormBorderStyle = 0, um den Rahmen anzuzeigen). Der Screenshot wurde übrigens mit meiner eigenen Schere gemacht. Was war das problem

Quellcode
for (int x = 0; x < 51; x++){ for (int y = 0; y < 18; y++){ Point between = new Point(Game.CastPoint.X - LVL.Deeparr[x, y].Location.X, Game.CastPoint.Y - LVL.Deeparr[x, y].Location.Y); float distance = (float)Math.Sqrt(between.X * between.X + between.Y * between.Y); if (distance < 20){ if (Player.getPlayer().lure != null){ Game.gui.DeepLabel.Text = LVL.Deeparr[x, y].Tag.ToString(); Sounder.setY(x); Sounder.setX(y); } } Game.Deep = Convert.ToInt32(Game.gui.DeepLabel.Text); } } 



Hier sehen wir einen einfachen Durchgang durch ein zweidimensionales Array (und nicht das richtige). Dann berechnen wir die Hypotenuse nach dem Satz von Pythagoras, und wenn sie <20 ist, bestimmen wir die gewünschte Zelle. Aber diese Methode funktioniert auch mit einem Quadrat sehr schlecht. Und hier sind die Rechtecke. Daher wird die Zelle häufig falsch erkannt. Zu meiner Verteidigung kann ich sagen, dass ich diesen Code von YouTube genommen habe.

Wir müssen also feststellen, in welcher Zelle sich der Cursor befindet. Dazu können Sie diesen Quellcode verwenden:

Code
 for (var y = 0; y < CurLvl.Height; y++) { for (var x = 0; x < CurLvl.Widgth; x++) { var r = new Rectangle(CurLvl.DeepArray[x, y].Location, new System.Drawing.Size(LabelInfo.Width, LabelInfo.Height)); if (r.IntersectsWith(new Rectangle(point, new System.Drawing.Size(1, 1)))) { //SomeCode } } } 


Hier nehmen wir die Koordinaten des Cursors, fügen sie in einen PointToClient ein und übergeben sie an den Rectangle-Konstruktor. Geben Sie die Größen 1 und 1 an. Dann verwenden wir die Standardmethode IntersectsWith, die Cursor-Schnittmenge und die Beschriftung. Wir können auch nicht nur einen Klick auf eine Beschriftung verarbeiten, da ein Formular mit diesen nicht angezeigt wird.
Außerdem durfte es Unterstützung für 3 Angelruten implementieren.

Fischgeneration


Der Hauptteil des Spiels ist also die Erzeugung von Fischen. Es tritt in mehreren Phasen auf:
1.Bei der Eingabe des Standorts kommen wir aus einer Zeile wie:
Goldfisch: 25 250-400 [Käse, Wurm, Made, Mais] Wo ist die Fischgröße als Prozentsatz des Maximums, der minimalen Tiefe, der maximalen Tiefe und einer Liste von Ködern erhalten wir das Fischobjekt (Vergessen Sie nicht, die Linie durch reguläre Ausdrücke vorab zu überprüfen). Für die Schönheit des Codes habe ich einen Operator definiert, der einen String zum Fischen wirft.

 public static explicit operator Fish(FishString fs) { return fs.GetFishByStr(); } 


Infolgedessen können wir mit diesem Ansatz schreiben:

 Fish fish = (Fish)new FishString(" : 25 250 - 400 [ , , ,  ]"); 

Der Code dient als Beispiel und ist im Projekt in dieser Form nicht enthalten.

2.Nun müssen wir warten, bis die Angelruten geworfen wurden, danach starten wir die Zeitschaltuhr (unsere eigene für jede Angelrute) mit einer zufälligen Bisszeit und folgen dann dem Häkchen der Zeitschaltuhr aus unserer Liste mit Fischen mit einer Größe von 1000 Einheiten. Wählen Sie die Fische aus, deren Lebensraumtiefe die Tiefe umfasst Angelruten.

3. Wählen Sie aus dieser Liste zufällig einen Fisch aus. Wir prüfen, ob der gesetzte Köder gefressen werden kann und ob die Tageszeit der Aktivität des Fisches der aktuellen Zeit im Spiel entspricht.

4. Wenn der Fisch den Köder fressen kann, greifen wir den Köder an. Anhand der Wahrscheinlichkeit des Abstiegs des installierten Hakens berechnen wir, ob und nach welcher Zeit ein Abstieg erfolgt. Wenn der Fisch den Köder nicht fressen kann, radeln wir durch den aktuellen Köder (falls vorhanden). Wir überprüfen, ob sich in der Nähe ein Fisch befindet, der auf den Köder picken kann, und wiederholen dasselbe.

Dank des Generierungsprozesses bin ich ein selbstbewusster LINQ-Benutzer geworden.

Spiel selbst



Lebensmittel

Screenshot des Lebensmittelladens.

Seine Quelle kann im Repository angezeigt werden. Dort sind die MouseEnter- und MouseLeft-Handler zum Ändern von Lebensmittelbildern recht interessant ausgeführt.

Bild

Screenshot des Reiseformulars. (Alle Gewässer sind Tests und ihre Namen sind nicht echt.)

Bild

Screenshot des Spiels

Pläne


  1. Machen Sie einen Client-Server für das Spiel
  2. Junior FPGA (FPGA) Entwickler
  3. Gesichtserkennung per Webcam (Ich suche Literatur, die nützlich sein kann)
  4. Ersetzen einer normalen ListView durch eine ObjectListView

Am Ende des vorherigen Artikels schrieb ich, dass ich einen Job bekommen möchte. Nun, im September schloss ich mein erstes TOR mit SNMP, allerdings in C.

Fazit


Das Projekt ist ziemlich umfangreich geworden, mit zumindest einer idealen, aber sehr anständigen Codebasis, die einfach zu warten ist. An manchen Stellen kann es zu Verstößen gegen die SOLID-Prinzipien kommen, dies liegt jedoch daran, dass das Projekt sehr lang war. Wenn Sie ein Anfänger-Entwickler sind und nach einem Projekt suchen, an dem Sie teilnehmen können, können Sie auch Commits für dieses Repository vornehmen. Die Liste der erwarteten Änderungen finden Sie in der README-Datei des Projekts.

Ich möchte auch erwähnen, dass ich keine Aussichten auf eine Karriere als C # -Entwickler sehe, oder eher etwas, das näher an der Hardware liegt, und deshalb versuche ich, untergeordnete Sprachen zu lernen.

Vielen Dank an alle, die bis zum Ende gelesen haben, jede Kritik am Quellcode ist willkommen und wird sofort berücksichtigt.

Source: https://habr.com/ru/post/de479864/


All Articles