Zum Inhalt springen

C# kleines Spiel, bitte um Hilfe


Tician

Empfohlene Beiträge

Ihr habt alle recht. Ich habe mich nach dieser Ableitung gerichtet aber WhizZard du musst zugeben ds deine Ansprüche echt hoch sind.
https://scottlilly.com/learn-c-by-building-a-simple-rpg-index/

Ich will das durchziehen, aber ich will es auch verstehen und ich bin zu stur um mit etwas kleinerem zu starte.

Ja ich programmiere auch im Betrieb und diese Programme werden auch produktiv eingesetzt aber sie sind alle so klein das ich überhaupt keinen Sinn sehe da gros mit OOP rum zu machen. Und es kennt sich keiner der Kollegen mit c# geschweige denn mit OOP aus.

Ich fürchte mir rennt die Zeit davon um dieses Projekt so hinzukrieen das es annehmbar aussieht, aber ich habe j auch eine Ersatzlösung. Die hatten wir im forum schon auseinander genommen :)

 

Edit: Ich programmiere gerne, das sollte nicht nur ein Schulprojekt werden sondern hinterher auch als privates Projekt herhalten :)

Bearbeitet von Tician
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor einer Stunde schrieb Tician:

Ihr habt alle recht. Ich habe mich nach dieser Ableitung gerichtet aber WhizZard du musst zugeben ds deine Ansprüche echt hoch sind.

Ich habe keine hohen Ansprüche. Das Problem ist einfach, dass dir nicht klar ist, was du da eigentlich tust und das wird zu Frustration führen. Du willst auch nichts dazu lernen, indem du dich strikt weigerst neue Dinge zu lernen und mit deinem Laienwissen bist du noch nicht so weit, ansatzweise sowas aufbauen zu können.

Das fängt schon damit an, dass du Klassen und Membervariablen static machst, ohne den Sinn dahinter zu verstehen und was das bedeutet, wenn du diese static machst.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 7 Minuten schrieb Whiz-zarD:

Du willst auch nichts dazu lernen, indem du dich strikt weigerst neue Dinge zu lernen und mit deinem Laienwissen bist du noch nicht so weit, ansatzweise sowas aufbauen zu können.

Das fängt schon damit an, dass du Klassen und Membervariablen static machst, ohne den Sinn dahinter zu verstehen und was das bedeutet, wenn du diese static machst.

Ich gebe dir mit allem recht, dass mit dem nichts lernen wollen finde ich aber etwas übertrieben. Sie hat nicht mal mehr eine Woche Zeit. Meiner Meinung nach fehlt es überhaupt an Planung. Es sieht so aus, als hätte man eine gute Idee gehabt, und die Plannung war "by the run". 

@Tician du solltest vlt. wirklich deine Alternative verwenden, und dieses Projekt hier privat machen.                                         

Edit: Evlt. solltest du diesen Link vergessen und dir andere Quellen zum lernen suchen.

Bearbeitet von KeeperOfCoffee
Link zu diesem Kommentar
Auf anderen Seiten teilen

Wie soll man etwas planen, wenn man fehlendes Wissen zu dem entsprechenden Thema hat?
Man sieht ja schon im Ansatz, dass die grundlegenden Prinzipien des OOP's nicht eingehalten werden bzw. richtig verstanden wurden. Wenn man sich dann an ein solches RPG setzt, welches durchaus schon komplexer ist (gerade der Aufbau der Logik, Kampfsystem, Polymorphie, Vererbung etc.) stößt man schnell an seine Grenzen.
Und da gebe ich Whizzard Recht, so frustriert man schnell. Ich erinnere mich an mein erstes größeres Projekt, wo ich genau das versucht habe, was Tician versucht. Nach einigen Tagen habe ich mich an Kleinigkeiten aufgehangen, weil das Projekt in sich nicht stimmig aufgebaut war und ich nicht wirklich verstanden habe was ich mache.

Und sich etwas falsch beizubringen, hilft auch nichts, da man solche schlechten Angewohnheiten, sich mühsam wieder abgewöhnen muss. Deshalb gilt immer noch meine Empfehlung - fang mit etwas simpleren an oder nimm dir unsere Vorschläge zu Herz und versuch sie umzusetzen. Dann wird es aber mit der restlichen Zeit nicht hinhauen.

Da das Kind schon in den Brunnen gefallen ist, versuch das beste daraus zu machen und setz dich in Zukunft nochmal vernünftig mit den Basics auseinander.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mein Tipp wäre ja, wenn du wirklich dieses Projekt beibehalten willst, @Tician, dass du erst einmal weg gehst von der grafischen Umsetzung. Die kann ganz am Ende immernoch kommen.

Ich denke, wenn du die Logik richtig runter programmierst, kannst du das Projekt immernoch abgeben und bewerten lassen.

Bei der Entwicklung von Programmen sollte die Oberfläche in dem das Programm laufen soll, austauschbar sein. Diesen Punkt hast du leider von Anfang an nicht eingehalten und das ist, in meinen Augen, genau das, was dich letzten Endes zu sehr aufhält.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 6 Minuten schrieb Rienne:

Mein Tipp wäre ja, wenn du wirklich dieses Projekt beibehalten willst, @Tician, dass du erst einmal weg gehst von der grafischen Umsetzung. ....

.... und dieser Seite (https://scottlilly.com/learn-c-by-building-a-simple-rpg-index/). Sorry ich habe mir die Seite mal angeguckt und was sie macht ist 1 zu 1 das gleiche. Das ist wie ein Copy&Paste Tutorial mit einigen Anpassungen. Man muss sich nur die GitHub File zu dem Tutorial ansehen.

Bei sowas lernt man meiner Meinung nach nichts. Klar kann man den Text dazu lesen. Den hat man aber am nächsten morgen schon vergessen...

Bearbeitet von KeeperOfCoffee
Link zu diesem Kommentar
Auf anderen Seiten teilen

Warum ignorierst du meine Aussage das ich verstehe was ich da mache?

Wir haben ein Schach und ein Sudoku im Unterricht angeschaut, wir haben gelernt "So erstellst du eine Klasse, so funktioniert Vererbung, so macht man ein Objekt daraus, das macht ein Konstruktor und so 'übergibt' man Objekte über das was in der Klammer steht".

Das ist das was wir in der Schule als OOP bezeichnen. Und die letzte Aussage war "Wenn man von einem Objekt nicht mehrere hat dann geht auch static".

Oder was ist der Grund warum ich bei der Console.WriteLine nicht erst ein Objekt "Console" erzeuge und das static ist? Ich bin frustriert weil Wikipedia über OOP ist einfach grausam zu lesen, ich möchte etwas in einfachen Worten verstehen und nicht mit Fachbegriffen zugebombt werden.

@Rienne Ich denke ein Konsoleprogramm ist eine gute idee. Wenn ich das jetzige Projekt also in ein Konsolen-Projekt umwandel, was mache ich mit der World-Klasse falsch? Wo sollen sonst sämtliche Elemente entstehen? Mach ich es einfach zur nicht-statischen Klasse?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bis ich mit einem Theoriebuch durch bin ist ein Jahr vergangen und dann habe ich auch wieder alles evrgessen. Gibt es nichts kürzeres?

Zitat

Allerdings dürfen Sie sich von der Objektorientierung nicht Antworten auf alle Probleme und Aufgabenstellungen der Softwareentwicklung erwarten. Die Erwartungen an die Möglichkeiten dieser Vorgehensweise werden in vielen Projekten zu hoch gesteckt.

Zum einen führt die Nutzung objektorientierter Basismechanismen und objektorientierter Programmiersprachen nicht automatisch zu guten Programmen. Zum anderen adressiert die Objektorientierung einige Problemstellungen gar nicht oder bietet nur unvollständige Lösungsstrategien dafür.

Zitat aus dem Buch. Also: Wo benutze ich sie nicht und was kann ich damit nicht machen? Das mal so als neugierige Frage weil hier jeder so sehr darauf rumhämmert und ohne wohl alles schlecht ist.

Bearbeitet von Tician
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Minuten schrieb Tician:

Ich denke ein Konsoleprogramm ist eine gute idee.

So habe ich es gar nicht gemeint. ^^

Aber das kannst du natürlich machen. Mein Vorgehen wäre gewesen erst einmal zu schauen, was ich für Klassen brauche, welche Methoden und Eigenschaften diese haben müssen und wie die Beziehungen untereinander sein müssen.

Die einzelnen Werte/Ausgaben kannst du später dann immernoch entweder einer Konsole übergeben oder eben den Komponenten in einer Form bzw aus diesen bekommen. Das ändert aber an ihrem eigentlichen Aufbau erst einmal nichts. (Dafür arbeitet man ja mit Parametern und Rückgabewerten)

vor 16 Minuten schrieb Tician:

"Wenn man von einem Objekt nicht mehrere hat dann geht auch static"

Ich glaube das Problem ist, dass viele, die meinen sie hätten OOP verstanden, es irgendwie doch nicht getan haben. Beziehungsweise es auch verschiedene Ansätze gibt mit unterschiedlichen Vor- und Nachteilen und man daher auch gerne hin und wieder von den strikteren OOP-Ansichten abweicht.

Erst einmal bedeutet static ja einfach, dass keine Instanzen dieser Klasse erzeugen kann/muss. Auf diese Grundsatzdiskussion wann man sie tatsächlich braucht, möchte ich hier nicht wirklich eingehen, da hier 1. von einem Schulprojekt die Rede ist und 2. Tician auch keine Anwendungsentwicklerin werden möchte. Aber ich habe zum Beispiel auch in einem Schulprojekt die Menüsteuerung einer Konsolenanwendung in eine statische Klasse gepackt, da sie lediglich der Steuerung anderer Klassen/Methoden dient.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 12 Minuten schrieb Tician:

Zitat aus dem Buch. Also: Wo benutze ich sie nicht und was kann ich damit nicht machen? Das mal so als neugierige Frage weil hier jeder so sehr darauf rumhämmert und ohne wohl alles schlecht ist.

Versuch mal ein Programm in Assembler objektorientiert zu schreiben. Kleinere Projekte lassen sich auch schneller prozedual realisieren, da die OOP immer einen gewissen Overhead mit sich bringt.

Grundsätzlich gilt die OOP als state-of-the-art.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dann also nochmal: Wenn ich das projekt als Konsolenprojekt versuche (was mir zumidnest mal den Ärger mit den Form-Elementen erspart) was würde ich mit der World-Klasse machen? Ich bin mir ziemlich sicher selbst wenn ich sie nicht statisch mache das die Idee es als "Klasse in der alle anderen Objekte erzeugt werden" falsch ist?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dazu kann ich dir leider nicht viel sagen, da mir der Einblick fehlt. Mir würde da, wie oben erwähnt, ein Klassendiagramm mit den Beziehungen helfen.

Aber, solange du keine Instanz der Klasse benötigst, sehe ich zumindest kein Problem darin, dass du die Klasse auch statisch lässt.

Nur dadurch, dass du die Klasse nicht mehr statisch machst, ändert sich an der Idee ja nichts. Du kannst also auch einfach in der Main-Methode dann ein welt1 = new World() machen.

Bearbeitet von Rienne
Link zu diesem Kommentar
Auf anderen Seiten teilen

Genau das war mein Gedanke, warum es sich so viel ändern würde. Ich versuche mal eine bessere Planung zu machen und ein UML-Klassendiagramm zu erstellen. Mein Problem ist das wenn ich dann programmiere merke das mir einiges fehlt. Aber jetzt habe ich zumindest schon einiges programmiert udn auch mal eine idee bekommen was ich brauche.

Ich versuch das bis später hin zu kriegen.

 

Das ist mein Alternativ-Projekt zur Vorstellung für den unterricht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also ich verzweifel gerade. Mir mangelt es vermutlich an logischem Denken, mir fällt nichts ein um das ganze Zeug zu verbinden, ich weiß nicht wo was hingehört, ich weiß nicht was noch benötigt wird.

Kurzum: Ich bin zu dumm, ich habe keine Ideen. Ich weiß wie mein Spiel aussehen soll und könnte es programmieren (ja, es würde grausam aussehen und ich würde in kürzester Zeit an den Erweiterungen verzweifeln), aber ich bekomme keine Planung zustande.

Habe vorher noch nie ein Diagramm erstellt, alles was wir gemacht haben war aus dem Code ein Diagramm erstellt oder aus einem Diagramm den Code geschrieben.

Hier das was ich hinbekommen habe, mehr fällt mir nicht ein.

 

Unbenannt.PNG

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du das Gefühl hast, nicht mehr weiter zu kommen, versuch das Problem in so viele kleine Teile zu zerlegen, bis du ein Teil gefunden hast, an dem du ansetzen und weiter machen kannst.

Wie ich vor einiger Zeit schonmal geschrieben hab, lass dich nicht verrückt machen wegen den ganzen Programmier-Paradigmen, das kommt alles mit der Zeit.

Irgendwie ist die ganze Diskussion sehr abstrakt, wo genau liegt eigentlich im Moment akut das Problem, an dem du nicht weiter kommst?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Ursprüngliche Problem war, dass eines der Panel die Buttons (Controls) nicht hatte die automatisch angelegt werden sollten. Vermutlich weil die Buttons keine unterschiedlichen Namen haben.

Aber wie mir bestätigt wurde sieht mein Programm trotz aller Bemühungen wie Kraut und Rüben aus und das was in einem Tutorial steht ist wohl alles falsch, also ist jetzt

vor 15 Stunden schrieb Whiz-zarD:

so ziemlich alles falsch, was man nur falschmachen kann

Um aus diesem ganzen Mist jetzt ein Konsolenprogramm zu schreiben (von dem ich hoffe das es einfacher wird weil ich mich nicht mit den ganzen Buttons und Panels aufhalten muss) wollte ich ein Klassendiagramm erstellen, aber mir fällt nichts mehr ein, für mich wäre das fertig und ich weiß nicht wie richtig das ist, dass komplett alles über die Main-Methode abläuft und aufgerufen wird. Auch habe ich jetzt noch keine Vorstellung was noch fehlen könnte.

Das das bis Donnerstag fertig wird bezweifel ich, deswegen wird es jetzt ein Freizeit-Projekt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

https://pastebin.com/3krETNbs

Der soweit spielbare Code (die Form1.Designer) mal weg gelassen. Keiner will vermutlich eine .exe-Datei ausführen, von daher lass ich die auch mal weg.

Einiges werde ich jetzt übers Wochenende auch slebst anpassen, mir passt dieses halb-Form halb-Player nicht, aber ich wusste mir nicht zu helfen, ich werde wohl (weil ich nicht weiß wie ich die Form-Elemente von anderen Klassen aus verändern kann) alles in der Form1-Klasse machen. Außerdem sind viele DInge doppelt wie das "richTextBox1.ScrollToCaret();" das ich überall ran hängen muss, was auch doof ist.

Wie gesagt auch einiges anderes, aber das wollte ich erstmal hier lassen.

Tut mir einen Gefallen und versucht mir nicht den Kopf runter zu reißen^^ Konstruktive Kritik gerne gesehen, bitte auch mit Erklärung, ich möchte nur kein "Geh zurück zu den Basics" hören, das geht mir auf die Nieren und nimmt mir die Freude am programmieren.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Mal völlig unstrukturierte Gedanken zu deinem Code:

  • Du hast zu den Locations jeweils eigene Methoden in deinem Formular. Es wäre einfacher, wenn du eine Basisklasse Location hättest, die die Methoden "Explore" und "Wait" hätte. Z.b. so:
    public class Location
    {
    	public virtual Name { get; } = "Generic Location";
      	public abstract string Explore();
      	public abstract string Wait();
      	// weitere sinnvolle Methoden, die alle Locations betreffen
    }

    Die Rückgabe "string" ist hier dafür gedacht, dass du den Text dann in dem Formular in die Textbox schreiben kannst. So muss die Location nichts von dem Formular wissen und du könntest sie bspw. in einer Konsolenanwendung wiederverwenden.

  • Noch besser als "string" als Rückgabetyp wäre es, wenn du in die Methode ein Objekt reingibst, das sich um die Ausgabe kümmern kann (alternativ in den Konstruktor der Location):

    public interface IOutput
    {
    	void Print(string message);
    }
    
    public RichTextBoxOutput : IOutput
    {
    	private RichTextBox textBox;
    	public RichTextBoxOutput(RichTextBox box)
    	{
    		textBox = box;
    	}
    	public void Print(string message)
    	{
    		box.AppendText(message);
    	}
    }
    
    // in der Location:
    public void Wait(IOutput output)
    {
    	output.Print("Du wartest 1h..."); 
    }

    Das grundsätzliche Prinzip nennt sich Inversion of Control und ist eine der fünf Säulen von SOLID (um mal Stichwörter zu nennen, falls du etwas lesen möchtest ;) ).

  • Deine Methoden an sich sind ganz ok für einen Anfänger. Was eben tatsächlich sehr aufstößt, ist, dass sich das alles in einer Klasse befindet.

  • Was du mal probieren könntest, ist, Player und Monster von einer gemeinsamen Basisklasse abzuleiten. Denn grundsätzlich teilen die sich ja viele Funktionalitäten. Das könnte irgendwie so aussehen:
// "abstract" bedeutet, dass du von dieser Klasse keine Objekte erzeugen kannst
// dafür sind die abgeleiteten Klassen (hier: Monster / Player) da
public abstract class Entity
{
	public int Id { get; private set; }
  	public string Name { get; private set; }
  	public int MaximumHitPoints { get; private set; }
  	public int CurrentHitPoints { get; private set; }
  	public int Strength { get; private set; }
  	public int Experience { get; private set; }
  	public int Gold { get; private set; }
  	public int Level { get; private set; }
  
  	public abstract void Attack(Entity target);
}

public class Monster : Entity
{
  	public void Attack(Entity target)
	{
    	if(target is Monster)
        {
        	// Monster greifen keine anderen Monster an!! (oder vielleicht doch?!)
        }
      	else
        {
        	target.CurrentHitPoints -= Strength;
          	// ...
        }
    }
	// eigenschaften / methoden, die nur auf monster zutreffen; "ki"
}

public class Player : Entity
{
 	// eigenschaften / methoden, die nur auf den Spieler zutreffen; bspw. Steuerung 
}

 

  • Kleiner Hinweis, was Namen von Variablen, Klassen usw. angeht: In C# ist es Usus, für Klassen, Methoden und Properties im sog. PascalCase zu schreiben. 
  • Deine Klasse heißt "Places", obwohl es sich doch um einen einzelnen Platz handelt, oder?
Bearbeitet von arlegermi
Link zu diesem Kommentar
Auf anderen Seiten teilen

Ein weiterer Tipp: Solche Konstruktoren, wie z.B.

public Player(int curHP, int maxHP, int gold, int curExp, int maxExp, int level, int attack)
{
    ...
}

Sind unter C# nicht nötig und auch beim Aufruf schlecht lesbar. Keiner wird auf den ersten Blick verstehen, welche Parameter was ist:

private Player _player = new Player(20, 20, 0, 0, 10, 1, 2);

Man muss den Konstruktor kennen, um zu wissen, was z.B. die letzte 2 bedeutet. C# bietet hier den Objectinitializer, der das Ganze lesbarer macht:

private player = new Player 
{
	CurHP = 20,
	MaxHP = 20,
	Gold = 0,
	CurExp = 0,
	MaxExp = 10,
	Level = 1,
	Attack = 2
};


Anstatt eine List<Monster> zu nehmen, um darüber dann zu iterieren, um das jeweilige Monster mit der Id herauszusuchen, verwendet ein Dictionary<int, Monster>. Beispiel:

public Dictionary<int, Monster> monsters = new Dictionary<int, Monster>
{
  { monster_id_wolf, new Monster(monster_id_wolf, "Wolf", 10, 10, 1, 10, 2, 1) },
  { monster_id_bee, new Monster(monster_id_bee, monster_id_bee, "Bee", 1, 1, 1, 1, 1, 1) }
}

Dann brauchst du die MonsterById()-Methode nicht mehr, sondern kannst direkt mit monsters[monster_id_wolf] darauf zugreifen. Natürlich kannst du auch hier den oben genannten Tipp mit dem Konstruktor nehmen.

Ansonsten ist da noch sehr viel, was man anders machen sollte aber darüber zu reden bringt wohl nichts.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...