Tician Geschrieben 29. Juni 2017 Autor Geschrieben 29. Juni 2017 (bearbeitet) 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 29. Juni 2017 von Tician JimTheLion reagierte darauf 1 Zitieren
Whiz-zarD Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 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. KeeperOfCoffee reagierte darauf 1 Zitieren
KeeperOfCoffee Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 (bearbeitet) 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 29. Juni 2017 von KeeperOfCoffee Zitieren
thereisnospace Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 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. Zitieren
Rienne Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 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. Zitieren
KeeperOfCoffee Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 (bearbeitet) 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 29. Juni 2017 von KeeperOfCoffee Zitieren
Tician Geschrieben 29. Juni 2017 Autor Geschrieben 29. Juni 2017 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? Zitieren
thereisnospace Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 vor 2 Minuten schrieb Tician: Warum ignorierst du meine Aussage das ich verstehe was ich da mache? Weil man anhand deiner Aussagen erkennt, dass du es nicht verstanden hast. Wikipedia ist auch nicht die beste Source dafür. Wie wäre es hiermit?http://openbook.rheinwerk-verlag.de/oop/ Zitieren
Whiz-zarD Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 vor 6 Minuten schrieb Tician: 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". Und das ist schon falsch... Zitieren
Tician Geschrieben 29. Juni 2017 Autor Geschrieben 29. Juni 2017 (bearbeitet) 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 29. Juni 2017 von Tician Zitieren
Rienne Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 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. Zitieren
thereisnospace Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 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. Zitieren
Rienne Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 vor 4 Minuten schrieb Gottlike: Grundsätzlich gilt die OOP als state-of-the-art. Darüber kann man lange diskutieren und das wird es ja auch immer wieder. Es gibt viele, die auch das Paradigma der funktionalen Programmierung als das bessere ansehen. Zitieren
thereisnospace Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 Ich würde trotzdem behaupten, dass die meisten Projekte, die heutzutage durchgeführt werden, in OOP realisiert sind. Wobei ich mich hier nur auf meiner persönlichen (beschränkten) Erfahrung stütze. Zitieren
Tician Geschrieben 29. Juni 2017 Autor Geschrieben 29. Juni 2017 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? Zitieren
Rienne Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 (bearbeitet) 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 29. Juni 2017 von Rienne Zitieren
Tician Geschrieben 29. Juni 2017 Autor Geschrieben 29. Juni 2017 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. Zitieren
Tician Geschrieben 29. Juni 2017 Autor Geschrieben 29. Juni 2017 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. Zitieren
Kleinrechner Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 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? JimTheLion reagierte darauf 1 Zitieren
Tician Geschrieben 29. Juni 2017 Autor Geschrieben 29. Juni 2017 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. Zitieren
Kleinrechner Geschrieben 29. Juni 2017 Geschrieben 29. Juni 2017 Das klingt so, als hätten dich die vielen Kommentare einfach sehr verunsichert, versuch am besten erstmal deine Gedanken zu ordnen. Dann such dir ein konkretes Problem und beschäftige dich mit dem. Zitieren
Tician Geschrieben 29. Juni 2017 Autor Geschrieben 29. Juni 2017 Hey, es funktioniert! Das einzige Problem war das ich "CreateControls" noch vor den "CreatePlaces" aufgerufen habe und deswegen die Liste der Places leer war. Ich mach mal weiter, dann dürft ihr den Code nach herzenslust auseinander nehmen. arlegermi reagierte darauf 1 Zitieren
Tician Geschrieben 30. Juni 2017 Autor Geschrieben 30. Juni 2017 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. Zitieren
arlegermi Geschrieben 30. Juni 2017 Geschrieben 30. Juni 2017 (bearbeitet) 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 30. Juni 2017 von arlegermi Tician reagierte darauf 1 Zitieren
Whiz-zarD Geschrieben 30. Juni 2017 Geschrieben 30. Juni 2017 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. Tician reagierte darauf 1 Zitieren
Empfohlene Beiträge
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.