Zum Inhalt springen

Gewinde

Mitglieder
  • Gesamte Inhalte

    71
  • Benutzer seit

  • Letzter Besuch

Alle Inhalte von Gewinde

  1. Ich habe die Variante, welche du als erstes beschrieben hast genommen und werde diese auch so für weitere Projekte weiter verfolgen. Ich habe im gleichen Atemzug die Abfrage des Charakternamens überarbeitet um die Dauerschleife dort gleich mit zu entfernen. Meine switch-Anweisung ist allerdings die weniger elegantere geworden, einfach weil ich erstmal das Grundprinziep zwecks Verständnis beibehalten möchte. Ich habe diese auch als eigene Methode in die Klasse integriert und nicht static gemacht, wobei mir der Sin der dahinter steckt bewußt ist und auch einleuchtet. Ich werde die Klasse einfach mal posten, denn diese sollte soweit fertig sein, bis auf die spätere Serialisierung, die fehlt im moment noch. Bei dieser wollte ich erstmal Binaryformatter benutzen, obwohl ich gelesen habe das man diesen nicht mehr verwenden sollte/darf. Im Internet habe ich etwas über json oder auch xml gelesen, wobei ich damit noch komplett keine Erfahrung gemacht habe. Ich wüßte bei den vielen Möglichkeiten derzeit auch noch nicht was das sinvollste wäre, in meinem Fall soll es sich ja süäter erstmal nur um ein kleines Konsolen Textadventure handeln. XAML wollte ich erst nach Abschluss dieses Projekts beginnen. Ich danke euch nochmal für eure tolle Hilfe internal class CharacterCreator : StartMenu { //Einleitung der Menüführung public override void DisplayMenu() { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("************************"); Console.WriteLine("* *"); Console.WriteLine("* Charaktererschaffung *"); Console.WriteLine("* *"); Console.WriteLine("************************\n"); Console.ResetColor(); CreateCharacter(); } //Erstellung eines neuen Charakters private Character CreateCharacter() { string charName = GetName(); Breed charBreed = GetBreed(); Character character = new Character(charName, charBreed); return character; } //Abfrage der Namenseingabe des Benutzers private string GetName() { string input = ""; bool correctInput = false; while (!correctInput) { Console.WriteLine("Wie soll dein Charakter heißen?\n"); Console.Write("Eingabe: "); input = Console.ReadLine(); ValidateName(input); if (ValidateName(input)) { correctInput = true; } else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("FEHLER: Ungültiger Name"); System.Threading.Thread.Sleep(500); Console.ForegroundColor = ConsoleColor.White; } } return input; } //Namenseingabe wird auf Existens und Sonderzeichen überprüft private bool ValidateName(string name) { if (CharacterManager.CheckIfCharacterExists(name)) return false; foreach(char c in name) { if (!char.IsLetterOrDigit(c)) { return false; } } return true; } //Abfrage der Breed Eingabe private Breed GetBreed() { Breed? breedChoice = null; string? userInput; while(breedChoice == null) { Console.WriteLine(); Console.WriteLine("Welcher Rasse gehört dein Charakter an?\n"); Console.WriteLine("[1] Mensch"); Console.WriteLine("[2] Troll"); Console.WriteLine("[3] Ork"); Console.WriteLine("[4] Elf"); Console.WriteLine("[5] Zwerg\n"); Console.Write("Eingabe: "); userInput = Console.ReadLine(); breedChoice = SelectBreed(userInput); if(breedChoice == null) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Fehler: Ungültige Eingabe"); System.Threading.Thread.Sleep(500); Console.ResetColor(); } } return breedChoice.Value; } //Breed Eingabe auf korrektheit und nullwert überprüft private Breed? SelectBreed(string? userInput) { Breed? breedChoice; switch (userInput) { case "1": breedChoice = Breed.Mensch; break; case "2": breedChoice = Breed.Troll; break; case "3": breedChoice = Breed.Ork; break; case "4": breedChoice = Breed.Elf; break; case "5": breedChoice = Breed.Zwerg; break; default: breedChoice = null; break; } return breedChoice; }
  2. Super, dankeschön an euch beide. Das mit der Schleife habe ich in den Übungsaufgaben in meinem Programmierkurs so gelernt. Allerdings muss ich zugeben klingt deine Variante sehr wohl sinniger und auch eleganter. Nullable hatte ich versucht, bin aber leider daran verzweifelt, wobei ich darüber noch nicht viel gelernt habe und wahrscheinlich darum auch nicht damit zur Lösung gekommen bin. Ich hatte noch eine Idee gehabt und wollte meinen Post editieren (auch um Rechtschreibfehler zu minimieren) hatte aber irgendwie nicht funktioniert. Ich hatte überlegt dem Enum eine weitere Option hinzuzufügen und damit die breedChoice als Diverse zu initialisieren und hinterher dann mit dem Switchblock abzuändern und dann als nicht diverse zu übergeben. Ob das so korrekt gewesen wäre, bzw. ob dies sauberer Code gewesen wäre weiß ich allerdings nicht. Der Compiler wäre damit zumindest zufrieden gewesen. Ich werde die Idee mit nullable mal ausarbeiten und die angegebenen möglichkeiten von euch aufnehmen und für mich übernehmen. Danke an euch für die schnelle und gute Hilfe 👍, wenn es soweit ist werde ich das ergebnis hier mal zur Schau stellen. 🙂
  3. Hallo zusammen, ich verwende für mein derzeitiges Problem mal einfach meinen alten Post. Da ich mittlerweile leider nur sehr selten zum lernen komme, bin ich in meinem Wissensstand auch nur sehr wenig weiter gekommen. Also folgendes, das Problem an sich wurde oben schon beschrieben und die Lösung dazu ist mir soweit auch bekannt. Wenn ich eine Variable habe, welche z.B. über eine switch Anweisung inizialisiert werden soll, muss ich sicherstellen, daß diese am Ende der Anweisung auch wirklich eine Inizialisierung erhalten hat. Meine while-Schleife ist ein Teil einer Methode, in welcher der Nutzer nach seiner gewünschten Rasse abgefragt werden soll. in der Methode werden am Anfang die Variablen string userInput, bool correctInput = true und Breed breedChoice deklariert. Am ende der Schleife soll das ganze in einer anderen Methode verarbeitet und dort zur Erstellung eines neuen Character objects verwendet werden. In meinem Switchblock wird die variable breedChoice verarbeitet und über die Eingabe zugewiesen. Da der ein oder andere Nutzer sicher mal die falsche Taste drücken wird, soll über default sichergestellt werden, das die Abfrage so lange dauert, bis dem Benutzer ein Licht aufgeht und er nur Zahlen von 1-5 nutzt. Logischerweise wird im defaultblock keine Zuweisung getätigt, das es sich dabei ja um keine korrekte Zuweisung handelt. Dadurch gibt es im return auch einen Fehler zwecks nicht zugewiesener Variable. Meine Lösung war es nun, die breedChoice Variable im default einfach die Zuweisung Mensch zugeben ( da die while-Schleife eh weiterlaufen würde, müsste diese Zuweisung eh solange geändert werden, bis ein korrekte eingabe getätigt wurde.) Damit ist dann zumindest der compiler zufrieden. Für mich stellt sich jetzt die Frage, ob ich damit zufrieden sein kann, da es ja eigentlich nicht wirklich mein Gedankenansatz wäre (bzw. saubere Programmierung wäre.). Ich habe in microsoft.docs einen Verweis auf die Nutzung von delegaten gelesen, allerdings bin ich mir auch da nicht wirklich sicher ob dies die korrekte Lösung wäre. while (true) { Console.WriteLine("Welcher Rasse gehört dein Charakter an?\n"); Console.WriteLine("[1] Mensch"); Console.WriteLine("[2] Troll"); Console.WriteLine("[3] Ork"); Console.WriteLine("[4] Elf"); Console.WriteLine("[5] Zwerg\n"); Console.Write("Eingabe: "); userInput= Console.ReadLine(); switch (userInput) { case "1": breedChoice = Breed.Mensch; break; case "2": breedChoice = Breed.Troll; break; case "3": breedChoice = Breed.Ork; break; case "4": breedChoice = Breed.Elf; break; case "5": breedChoice = Breed.Zwerg; break; default: correctInput = false; Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("FEHLER: Ungültige Eingabe"); System.Threading.Thread.Sleep(500); Console.ForegroundColor = ConsoleColor.White; break; } if (correctInput) { break; } } return breedChoice; }
  4. Danke für die schnelle Antwort, also habe ich in diesem Fall einfach nur den else Teil unterschlagen und das führt zu einem ? für den Compiler? Dann versuche ich das morgen nochmal mit einem else Teil. Dankeschön für die Hilfe.
  5. Guten Abend, so da bin ich mal wieder. Ich gehe derzeit einiges aus meinem Grundkurs nochmal durch, um etwas mehr Sicherheit im Umgang mit Code zu bekommen. Wärend meiner Übungen merkte ich immer wieder, dass ich zwar die einzelnen Möglichkeiten welche mir C# bietet verstehe, diese allerdings in einem komplexen Programm nicht wirklich anwenden konnte. Wie auch im Handwerk ist die Praxis dann meist doch schwerer als die Theorie. Bei meinen Übungen mit Delegaten bin ich auf ein kleines Problem gestoßen. VS gibt mir bei diesem Code immer den Fehler calculate nicht zugewiesen (im code unterstrichen). In meinem Buch oder auch in anderen Büchern wird dies allerdings auch genau so angegeben und bei denen soll der code so funktionieren. Ich weis das man mit Variablen bezüglich Klammern acht geben muss, doch in meinen Augen müsste dieser Code eigentlich so funktionieren. Ich bekomme den Code nur zum Laufen, wenn der gesamte untere Teil in die einzelnen if statements rutscht (außer die Methoden natürlich). in meinen Augen wird calculate oben declariert und in den if statements inizialisiert und dann unten in der variable result gespeichert und über console.writeline ausgegeben. public delegate int Calculation(int num1, int num2); internal class Program { static void Main(string[] args) { Calculation calculate; int result; string input; Console.Write("Zahl1: "); int num1 = Convert.ToInt32(Console.ReadLine()); Console.Write("Zahl2: "); int num2 = Convert.ToInt32(Console.ReadLine()); Console.Write("Add [1] Sub [2]"); input = Console.ReadLine(); if(input == "1") { calculate = new Calculation(Addition); } else if(input == "2") { calculate = new Calculation(Subtraction); } result = calculate (num1, num2); Console.WriteLine(result); Console.ReadKey(); } static int Addition(int num1, int num2) { return numb1 + numb2; } static int Subtraction(int num1, int num2) { return num1 - num2; } dankeschön
  6. Der Test mit dem hinzufügen der Verweise und der usingdirektive in VS2022 war ebenso erfolgreich. Komischerweise funktiniert das mit dem Kopieren bei mir nicht, aber das wird wohl eher an meiner Wenigkeit liegen. Ich versuche es noch etwas bis ich auch das raus habe. Ich danke euch allen wiedermal für eure erstklassige Hilfe. 👍
  7. Hallo zusammen, habe meine Idee zum einfacheren Verständnis mal etwas vereinfacht nachgestellt und es hat wie gesagt funktioniert. Ich habe jetzt meine Klasse im Zweiten Namensraum public gemacht und den Zugriff auf die interne Variable sex mittels einem private setter internal gelassen. Ich hoffe damit habe ich die Problematik verstanden. Das mit dem hin und her kopieren muss ich dann als nächstes mal versuchen. using System; using ZweiterNamespace; namespace ErsterNamespace { internal class Program { static void Main(string[] args) { Character character = new Character(); string input; Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Geschlecht eingeben: "); Console.WriteLine(); Console.WriteLine("[1] Neuter"); Console.WriteLine("[2] Male"); Console.WriteLine("[3] Female"); Console.ForegroundColor = ConsoleColor.White; Console.WriteLine(); input = Console.ReadLine(); character.SetSexInput(input); Console.WriteLine(character.ToString()); Console.ReadKey(); } } } namespace ZweiterNamespace { public enum Geschlecht { Neuter, Male, Female} public class Character { internal Geschlecht sex; public Geschlecht Sex { get { return sex; } internal set { sex = value; } } public Character() { } public void SetSexInput(string input) { switch (input) { case "1": this.Sex = Geschlecht.Neuter; break; case "2": this.Sex = Geschlecht.Male; break; case "3": this.Sex = Geschlecht.Female; break; } } public override string ToString() { return "Das Geschlecht des Objekts ist " + Sex; } } }
  8. Danke für die schnelle Antwort. Ich habe gerade nochmal nachgesehen und habe auf dem einen Rechner tatsächlich public gewählt und auf dem anderen Rechner internal. Allerdings habe ich bei der Variante mit dem internal Zugriffsmodifizierer für alle Klassenmember public getter und setter sowie einen public Konstruktor integriert. Ist es zwingend notwendig alle dort im Namespace befindlichen Klassen Öffentlich zu gestalten? Ich hatte diese bei der zweiten Version ja bewusst internal gewählt um den Zugriff nur über die implementierten getter und setter zu ermöglichen. Auf meinem Laptop ( da wo der Zugriff auch funktioniert) habe ich mir eine CharClass.dll erstellt und mittels using den Namespace integriert, allerdings sind es weiterhin einzelne Projekte. Wie fügt man denn beide Projekte in ein Projekt zusammen, so das ich auf den gesamten Code beider Projekte zugreifen kann?
  9. Hallo zusammen, ich hätte mal eine Frage zum arbeiten mit eigenen Namensräumen und eigenen Klassenbibliotheken. Da ich jetzt meinen OnlineGrundkurs in c# fast fertig habe, würde ich gerne ein kleines Abschlussprojekt erstellen. Hierbei handelt es sich um eine kleine Konsolenanwendung, welche später in ein kleines Text Rollenspiel enden soll. Wenn ich mich etwas sicherer im Umgang mit Code fühle soll daraus eventuell eine etwas hübschere Variante in verbindung mit Xaml werden. Jetzt stoße ich allerdings erstmal auf ein kleines Problem, welches nicht wirklich mit dem Code ansich zu tun hat, sondern eher mit der Verwaltung von Projekten in VS2022. Ich habe mir eine kleine Klassenbibliothek erstellt, in welcher ich die einzelnen Characterklassen verarbeite. Diese möchte ich nun in meinem Hauptprogramm mit einbinden. Im Netz habe ich dazu gesehen, dass ich mir eine dll Datei erstelle und diese dann unter verweise mit einbinde. Soweit so gut, nach dem Einbinden sehe ich diese Dll auch unter den Verweisen in meinem Hauptcode. Ich kann jedoch nicht darauf zugreifen. Auf einem anderen Rechner hatte dies allerdings funktioniert, ich habe allerdings keinen blassen Schimmer woran es auf meinem StandPC scheitert, außer das auf dem anderen Rechner VS2019 läuft (ich möchte einfach bezweifeln das es daran liegt). Darauf hin habe ich mir gedacht, einfach meinen eigenen Namespace mit einzubinden. In diesem Namespace befindet sich ja meine Klassenbibliothek. Allerdings funktioniert auch dieser Versuch nicht wirklich. Selbst wenn ich die Hilfe aus dem Netz von Microsoft selber nutze und alles wie dort beschrieben durchführe, schaffe ich es nicht beide Projekte mit einander zu verbinden. Kann mir vielleicht jemand von euch helfen, wie es möglich wird meine Klassenbibliothek bzw. einen von mir erstellten Namensraum in einem anderen projekt nutzbar zu machen oder generell 2 Projekte in ein Projekt umzuwandeln? freundliche Grüße Gewinde 🙂
  10. Ich glaube in manchen Situationen denke ich noch zu kompliziert. Manchmal ist die Lösung eigentlich recht simpel. Ich werde Diese Lösung so weiter verfolgen und in den Code integrieren. Allerdings dauert es bis dahin noch etwas, habe auf euer Raten nochmal die Grundkenntnisse mittels Videolernkurs vertieft und beginne gerade erneut mit der oop. Danke vielmals 🙂
  11. Hallo, mein Beispiel ist im Zuge einfacher Tests zustande gekommen. Viele möglichkeiten sind für einen Laihen relativ schwer verständlich erklärt. Später soll eine ähnliche Methode in meinem Programm integriert werden, allerdings nicht so wie dort geschrieben (was die Variablen u.s.w. angeht), aber du hast diesbezüglich natürlich recht. Ich versuche mich demnächst mehr an die Konventionen zu halten. 🙂 In meiner Vorstellung, wird ein Objekt Character bei dem Versuch eine Waffe anlegen zuwollen, immer eine Waffenprobe durchführen müssen. Objekt Character vs. Objekt RngdWeapon oder Objekt Character vs. Objekt MeleeWeapon. Es sollen dabei aber nicht alle Werte der Objekte verglichen werden, sondern nur diese, welche für eine Probe wichtig sind. Daher bestand meine Idee darin, eine Methode in die Klasse zu integrieren, welche festgelegte Werte der beiden verschiedenen Klassen vergleicht. Wenn ich Objekt mit Objekt vergleiche, dann würde ich für mein Verständniss versuchen Werte des Objektes Character mit den nicht vorhandenen Werten im Objekt RngdWeapon zu vergleichen. Einen Wert Runspeed würde es z.B. im Objekt RngdWeapon nicht geben. Allerdings würde es eventuell die Werte z.B. RngdWeaponSpeed in beiden Objekten geben, welche aber nicht verglichen werden sollen. Daher kam meine Idee mit dem Arrey zustande. Structs wurden in meinem Tutorial noch nicht durchgenommen, ich beginne jetzt mich langsam in die oop einzuarbeiten. Lieben Gruß Gewinde
  12. Guten Abend zusammen, da ich im Netz keine wirklich zufriedenstellende Lösung auf meine Frage gefunden habe, wende ich mich wieder mal an dieses Forum. Wer es vielleicht noch weiss, verfolge ich ein gewisses Lernprojekt in Form eines Computerspiels. Logischerweise gehören zu meinem Spiel auch Waffen. Bevor ein Spieler eine Waffe allerdings anlegen kann, soll er eine Waffenprobe ablegen. In meinem Beispiel habe ich 3 Werte genommen, welche der Spieler als auch die Waffe besitzten. Sollte ein Wert des Spielers zu gering für die gewünschte Waffe sein, so wird die Waffenprobe fehlschlagen und dem Spieler verwert die Waffe zu tragen. In meiner Idee habe ich die Werte des Spielers sowie die Werte der Waffe jeweils in ein Arrey gepackt, welche dann mittels Methode auf jeden einzelnen Index überprüft werden. Die meisten Antworten im Netz beziehen sich meist auf einen Vergleich der beiden Arreys (gleiche Größe u.s.w.). In meinem Fall muss allerdings jeder Index gegeneinander geprüft werden. In meinem code funktioniert dies auch soweit sehr gut, allerdings bin ich mir bei dem Lösungsweg nicht 100% sicher. Vielleicht bin ich bisher auch noch nicht weit genug fortgeschritten mit meinem Wissen, dennoch kommt mir der erschaffene code etwas sehr "rustikal" vor. namespace ArreyTrainig { class Program { static void Main(string[] args) { int _strength = 10; int _agilty = 25; int _knowledge = 20; int _wstrength = 10; int _wagility = 25; int _wknowledge = 40; int[] playerArrey = { _strength, _agilty, _knowledge }; int[] weaponArrey = { _wstrength, _wagility, _wknowledge}; WeaponCheck(playerArrey, weaponArrey); bool _checked = WeaponCheck(playerArrey, weaponArrey); if (_checked) { Console.WriteLine("Waffenprobe erfolgreich"); } else Console.WriteLine("Waffenprobe fehlgeschlagen"); Console.ReadKey(); } static bool WeaponCheck(int[]player, int[] weapon) { bool arreyCheck = false; for(int i = 0; i < player.Length; i++) { for(int j = 0; j < weapon.Length; j++) { if (player[0] >= weapon[0] && player[1] >= weapon[1] && player[2] >= weapon[2]) { arreyCheck = true; } } } return arreyCheck; } } } Ich würde gerne eure fachmännische Meinung dazu hören bzw. eventuelle elegantere Lösungsansätze kennenlernen um mein Wissen diesbezüglich zu erweitern. mit freundlichen Grüßen Gewinde 🙂
  13. Jetzt wo ihr mich mit der Nase drauf drückt fällt mir das natürlich auch ins Auge. Ja die GetMethoden sollten natürlich SetMethoden sein. Bei dem return fehlt wahrscheinlich noch die variable. int healthbar; public int Healthbar {get{ return healthbar;} set{.....} denke das meintest du damit. Ja da fällt mir wohl jedesmal die wenige Praxiszeit auf die Füße. Ich komme leider nur sehr selten dazu mein Hobby weiterzuentwickeln, weshalb natürlich Lücken entstehen. Als Grundkurs benutze ich https://produkte.programmieren-starten.de Vielleicht sollte ich nochmal von vorne anfangen um gelerntes zu festigen und halbgelerntes besser zu verstehen. Mit der OOP wird das ganze auch wesentlich komplexer als mit den einfachen Variablen. Selbige zählt für das Arrey, so wie du es schreibst macht es mehr sinn. Danke für eure Kretik bzw. Tipps, ich habe den Code nochmal mit Setmethoden umgewandelt: static void Main(string[] args) { BasicCharacter character = new BasicCharacter(); character.SetName(); character.SetGenus(); character.SetSex(); character.SetHealth(character.Toughness); character.SetPsionic(character.Psionic, character.Intelligent); //Console.WriteLine(character.ToString()); BasicCharacter[] characters = new BasicCharacter[1]; characters[0] = character; for(int i = 0; i < characters.Length; i++) { Console.WriteLine(characters[i].ToString()); } Console.ReadKey(); } Und den Code in der Klasse selbst: class BasicCharacter : IPopulation { public enum Genus { Human, Psionic, Experimental } public enum Sex { neuter, Male, Female } //Attribues... public string Name { get; set; } public int Healthbar { get; set; } public int Psipool { get; set; } public int Toughness { get; set; } public int Strength { get; set; } public int Agility { get; set; } public int Intelligent { get; set; } public int Sense { get; set; } public int Psionic { get; set; } public Genus CharGenus { get; set; } public Sex CharSex { get; set; } //Methodes... public void SetGenus() { int genusChoice = 0; do { Console.WriteLine("Bitte suche den Genustyp deines Charakters aus...\n"); Console.WriteLine("Soll dein Charakter ein Mensch sein, dann drücke die (1)"); Console.WriteLine("Soll dein Charakter ein Psioniker sein, dann drücke die (2)"); Console.WriteLine("Wenn dein Charakter im Labor erschaffen wurde, dann drücke die (3)"); genusChoice = Convert.ToInt32(Console.ReadLine()); switch (genusChoice) { case 1: CharGenus = Genus.Human; Toughness = 200; Strength = 200; Agility = 200; Intelligent = 100; Sense = 200; Psionic = 200; break; case 2: CharGenus = Genus.Psionic; Toughness = 150; Strength = 150; Agility = 150; Intelligent = 200; Sense = 200; Psionic = 400; break; case 3: CharGenus = Genus.Experimental; Toughness = 500; Strength = 500; Agility = 200; Intelligent = 50; Sense = 150; Psionic = 50; break; } if(genusChoice < 1 || genusChoice > 3) { Console.WriteLine("Ups, da ist wohl gerade ein Fehler aufgetreten. Versuchen sie es bitte noch einmal..."); } }while(genusChoice < 1 || genusChoice > 3); } public void SetSex() { if(CharGenus == Genus.Experimental) { CharSex = Sex.neuter; return; } int sexChoice = 0; do { Console.WriteLine("Soll dein Charakter männlich oder weiblich sein?\n"); Console.WriteLine("Für einen männlichen Charakter drücke bitte die (1)"); Console.WriteLine("Für einen weiblichen Charakter drücke bitte die(2)"); sexChoice = Convert.ToInt32(Console.ReadLine()); if (sexChoice == 1) { CharSex = Sex.Male; break; } else if (sexChoice == 2) { CharSex = Sex.Female; break; } else if (sexChoice < 1 || sexChoice > 2) { Console.WriteLine("Da hat wohl etwas nicht funktioniert, bitte versuchen sie es noch einmal..."); } } while (sexChoice < 1 || sexChoice > 2); } public void SetName() { Console.Write("Gebe bitte einen Namen für deinen Charakter ein: "); Name = Console.ReadLine(); } public int SetHealth(int _toughness) { if(CharGenus == Genus.Human) { Healthbar = _toughness * 10; } else if(CharGenus == Genus.Experimental) { Healthbar = _toughness * 50; }else if(CharGenus == Genus.Psionic) { Healthbar = _toughness * 10; } return Healthbar; } public int SetPsionic(int _psionic, int _intelligent) { if (CharGenus == Genus.Human) { Psipool = (_psionic + _intelligent) * 5; } else if (CharGenus == Genus.Experimental) { Psipool = (_psionic + _intelligent) * 2; } else if (CharGenus == Genus.Psionic) { Psipool = (_psionic + _intelligent) * 8; } return Psipool; } public override string ToString() { string message = "Dein Charakter ist ein " + CharGenus + " und sein Geschlecht ist " + CharSex + " und sein Name ist " + Name + ".\n" + "Deine Attribute sind:\nHealthbar: " + Healthbar + "\nPsipool: " + Psipool + "\nToughness: " + Toughness + "\nStrength: " + Strength + "\nAgility: " + Agility + "\nIntelligent: " + Intelligent + "\nSense: " + Sense + "\nPsionic: " + Psionic; return message.ToString(); } } Als nächstes werde ich mir eure antworten aber erstmal zu herzen nehmen und nochmal ein paar Schritte zurück springen.
  14. Bei meinen Versuchen ist noch ein weiteres Problem aufgetreten. Ich habe in meinem Code die Methode GetHealth() eingefügt, welche mir wärend der Erstellung die Lebenspunkte des Charakters errechnen soll und diese natürlich in dem Attribute Healthbar abspeichern soll. Im Moment funktioniert die Methode folgendermaßen: class BasicCharacter : IPopulation { ....... public int Healthbar { get; set; } ........ public int GetHealth(int _toughness) { Healthbar = _toughness * 5; return Healthbar; } Dieses Ergebnis stellt mich allerdings noch nicht zufrieden, da ich für diese Methode etwas anderes im Sinn hatte. Mit dieser Methode sollen die Lebenspunkte des Charakters in Abhängigkeit der Rasse (Genus) berechnet werden und dann im Attribute Healthbar gespeichert werden. Meine Idee dazu war folgende gewesen. public int Healthbar { get { return Healthbar;} set { GetHealth(Toughness);} public int GetHealth(int _toughness) { if(CharGenus == Genus.Human) { Healthbar = _toughness * 10; } else if(CharGenus == Genus.Experimental) { Healthbar = _toughness * 50; }else if(CharGenus == Genus.Psionic) { Healthbar = _toughness * 10; } return Healthbar; } Allerdings führt diese Variante immer zu einer StackOverflowException. Wärend ich hier geschrieben habe, konnte ich das Problem lösen. Die Methode GetHealth(character.Touhgness) wird nun nach dem Konstruktor aufgerufen und ausgeführt. Der Getter und Setter der Eigenschaft Healthbar bleibt automatisch. Ich bin mir allerdings immer noch nicht sicher ob ich diese Variante zufrieden stellt (auch wenn ich mich freue wie Bolle). In meiner Vorstellung sollte der (private) Setter das Ergebnis der Methode automatisch abholen. Ohne das ich den Aufruf direkt in static void Main(string[] args) einfügen muss. Ich hoffe es ist einigermaßen verständlich was ich meine. Die angesprochenen Waffen vone bene98 werden demnächst in Angriff genommen, ich stelle mir dabei eine kleine Auswahl an Waffen vor, vielleicht mittels Waffenschnittstelle. Welche dann mittels Angriffsmethode verwendet werden können. Danke euch alle.
  15. Guten Tag zusammen, ich habe mal wieder etwas rumgewerkelt und einige Vorschläge versucht in meinem Code einzubringen. Dieses Mal habe ich die angesprochene ToString() eingefügt und eine Schnittstelle verwendet. Außerdem habe ich die Verarbeitung der Charaktere mittels Arrey eingebunden. Bei der ToString() gibt es soweit keine weiteren Fragen, ich denke diese ist leicht verständlich und funktioniert auch wunderbar in meinem Code. Hier lasse ich mir zum Schluss den Erschaffenen Charakter mit Namen und Eigenschaften ausgeben. Mit dem Arrey habe ich noch so meine Probleme, welche allerdings eher auf noch nicht verstandenen Lernstoff zurückzuführen ist. Wenn ich einen Charakter in ein Arrey speichere und diesen dann mittels For-Schleife und ToString() ausgeben lassen möchte, wird mir dieser auch ausgegeben, allerdings ohne dabei die Werte des Charakters zu verarbeiten. BasicCharacter character = new BasicCharacter(); character.GetName(); character.GetGenus(); character.GetSex(); character.GetHealth(character.Toughness); //Console.WriteLine(character.ToString()); BasicCharacter[] characters = new BasicCharacter[1]; characters[0] = new BasicCharacter(); for(int i = 0; i < characters.Length; i++) { Console.WriteLine(characters[i].ToString()); } Das Ergebnis ist wie folgt: Dein Charakter ist ein Human und sein Geschlecht ist neuter und sein Name ist . Deine Attribute sind: Healthbar: 0 Psipool: 0 Toughness: 0 Strength: 0 Agility: 0 Intelligent: 0 Sense: 0 Psionic: 0 Eigentlich sollten dort Rasse, Geschlecht, Name und die berechneten Werte stehen. Wenn ich den Code ohne Arrey und nur mittels ToString() laufen lasse, sieht das Ergebnis folgendermaßen aus: Dein Charakter ist ein Human und sein Geschlecht ist Male und sein Name ist Testfigur. Deine Attribute sind: Healthbar: 1000 Psipool: 0 Toughness: 200 Strength: 200 Agility: 200 Intelligent: 100 Sense: 200 Psionic: 200 Genau so sollte er nach euren vorgaben eigentlich auch aussehen. Daher denke ich, dass die ToString() funktiniert und bei den Arreys noch Nachholbedarf besteht.
  16. Hallo zusammen, ich habe die Tage etwas an meinem Projekt getüfftelt und dabei sind natürlich mal wieder einige Fragen aufgetreten. Die eine Frage dreht sich um das besagte Arrey oder die besagte Liste. Erstmal wollte ich diesbezüglich nochmal nachfragen ob ich bene98 Antwort richtig verstehe. Da ich mittels Konstruktor ohnehin immer eine neues ( anders) Objekt als das vorherige erzeuge, ist ein Arrey/List zur erstellung vieler verschiedener Character gar nicht nötig? Ich möchte dieses Problem (auch wenn gar nicht erforderlich) gerne weiter verfolgen, einfach um dadurch zu lernen und zu verstehen. Ich habe z.B. ein Arrey erstellt welches zur Probe genau 1 index hat (index 0), in dieses habe ich ein Objekt gespeichert und habe mir zur überprüfung das Objekt mittels for-Schleife ausgeben lassen. PlayerCharacter[] player = new PlayerCharacter[1]; player[0] = new PlayerCharacter(); PlayerCharacter population = new PlayerCharacter(); // einzelne Methodenaufrufe.... for(int i = 0; i < player.Length; i++) { Console.WriteLine(player[i]); } Das Ergebnis ProjektTerra.PlayerCharacter finde ich etwas wenig aussagekräftig und daher bin ich mir jetzt nicht wirklich sicher ob der Versuch auch funktioniert hat. Bedeutet diese Ausgabe das die Speicherung erfolgt ist?
  17. Hallo zusammen, ich habe mir mal einige Gedanken gemacht und erstmal mit der Basisklasse begonnen und etwas mit dem code gespielt. Leider kann ich den gesamten code nicht anhängen, daher mal wieder als schriftliche Ausgabe: namespace TerraProjekt { enum Breed { Human , Psionic , Experimental} enum Gender { neuter , Male , Female} class MainPopulation { private int strength; public int Strength { get { return strength; } set => strength = value; } private int Stamina { get; set; } public MainPopulation (int creatureStrength, int creatureStamina) { Strength = creatureStrength; Stamina = creatureStamina; } public void WertAusgabe() { Console.WriteLine("Deine Werte sind: {0} {1}" , strength , Stamina); } } } Ausführung in der Main Methode: static void Main(string[] args) { MainPopulation player = new MainPopulation(50, 100); player.WertAusgabe(); Console.ReadKey(); } Die enums im Namespace einfach nicht beachten, die sind für später vorgehalten. Als nächstes versuche ich eine Vererbung in die erste Unterklasse und danach dann als weiteres Experiment die Problematik mehrerer Objekte dieser Klasse. Da ich nicht für jeden Quark ein neues Thema aufmachen möchte, werde ich hier alle Schritte mit eventuellen Fragen u.s.w. reinwerfen und daraus mein ProjektThema machen. Ich hoffe das ist i.O. für euch. Ich würde mich darüber freuen wenn ihr einfach mal drüber schaut und mir ggf. verbesserungsvorschläge geben könntet. Getter und Setter habe ich zwei verschiedene Varianten zum üben benutzt, eigentlich sollte ein Automatischer ja ausreichen. Meine Frage hierzu wäre, wenn man eine Variable direkt über den Konstruktor anspricht (this.strength = creatureStrength). Kann dann der Getter und Setter gänzlich weggelassen werden, da die Zuweisung ja über das Schlüsselwort this erfolgt?
  18. Hallo zusammen, da mir in diesem Forum beim letzten mal so gut geholfen wurde, wende ich mich mit einer Frage zur oop nochmal an euch. Mein Testprojekt zur oop soll eine Art Spiel werden, wobei das Spiel ansich nicht erstellt werden soll, sondern nur die Idee der Character Erschaffung. Es soll möglich sein mehrer Character aus verschiedenen Rassen und verschiedenen Klassen zu erstellen. Welche dann (wenn ich mich mit dem Speichern von Datein befasst habe), auch abgespeichert und wieder geladen werden können. In einem Online Rollenspiel ist es zum Beispiel möglich mehrere Character zu erstellen, vielleicht sogar mit verschiedenen Rassen und eventuell sogar diese mit Unterschiedlichen Klassen. Dazu kommen auch noch andere Spieler, welche genauso wie Spieler1 Character aus verschiedenen Rassen mit verscheidenen Klassen erstellen können. namespace Klassenprojekt2 { class Program { static void Main(string[] args) { PlayerCharacter playerCharacter = new PlayerCharacter(); Console.Write("Bitte den Charakternamen eingeben: "); playerCharacter.name = Console.ReadLine(); Console.Write("Bitte das Alter deines Charakters eingeben: "); playerCharacter.age = int.Parse(Console.ReadLine()); Console.WriteLine(playerCharacter.name + " " + playerCharacter.age); Console.ReadKey(); } } class PlayerCharacter { public string name; public int age; } } Nach meinem Verständnis erstelle ich in meinem Beispiel allerdings nie ein Neues Objekt, außer beim ersten mal. Jedes mal, wenn ich ein Objekt playerCharacter erstelle, wird das vorherige playerCharacter Objekt ersetzt. Im Internet habe ich gelesen, dass man viele verschiedene Objekte durch die Erstellung einer <List> oder eben einem Arrey erzeugen kann. Wobei in meinem Fall ein Arrey nicht praktikabel wäre, da es ja begrenzt wäre. Meine Frage besteht jetzt darin, ob es der richtige Gedanke wäre, nun das Objekt folgendermaßen zu erzeugen. class Program { static void Main(string[] args) { List<PlayerCharacter> playerCharacter = new List<PlayerCharacter>(); } } Mein erster Versuch endete darin das mir eine Fehlermeldung Ausgegeben wurde. Leider habe ich diesen Versuch natürlich nicht gespeichert und kann diese jetzt nicht vorzeigen. Freundliche Grüße Gewinde 🙂
  19. Hallo zusammen, meine Frage beruhte auf einem Denkfehler. Wie 121233 hier geschrieben hat, besitzt mein Arrey nur einen string, ich wollte diesen string immer rückwärts ausgeben. Dies macht er natürlich nicht, da das Arrey ja nur das gesamte Arrey rückwärts ausgibt. In meinem fall hätte dies ein rückwärts durchlaufenes charArrey sein müssen. Ich habe gerade eben unabhängig von dem hier zuletzt geschriebenen Post diesen Code geschrieben und dabei ist mir dann auch mein Fehler bewußt geworden. static void Main(string[] args) { string[] testArrey = new string[] { "Mario", "Gunna" }; for(int text = testArrey.Length-1;text >= 0; text--) { Console.WriteLine(testArrey[text]); } Console.ReadKey(); } Ich musste zweimal hinsehen um es zu bemerken. Mein Arrey wird rückwärts durchlaufen und auch ausgegeben (0=Mario,1=Gunna / Ausgabe lautet 1=Gunna, 0=Mario). Also hat es funktioniert. In meiner Idee hätte es annuG und oiraM werden müssen, was ja falsch wäre. Für diese Ausgabe hätte ich die Strings als Char Arreys durchlaufen müssen. In meinem Text ein Stück weiter oben wurde dies ja auch umgesetzt, allerdings wurde die Variable auch aus dem Arrey in eine neue Variable gespeichert (ein Arrey aus Char ist entstanden) und wurde dann rückwärts ausgegeben. Da mir dies recht kompliziert vorkam, dachte ich das es nicht vorgesehen ist ein Arrey direkt rückwärts auszugeben @Whiz-zarD(mein Denkfehler). Die Reversmethode ist mir auch bekannt, ich wollte es allerdings zum besseren Verständnis einfach ohne diese durchführen. Linq kommt erst ca. 300 Seiten Später dran. Ich möchte mich bei euch allen sehr herzlich bedanken, ich bin begeistert von diesem Forum. Lieben Gruß Gewinde
  20. Danke für eure schnellen Antworten. Das mit dem Index (beginnend mit 0) war mir bekannt, allerdings weisen so ziemlich alle Bücher in einigen Bereichen diverse Lücken auf. Z.B. Dachte ich vorher, die -1 hinter dem arrey.Length läßt das Arrey von hinten durchlaufen, da dies nie wirklich erklärt wurde. Das buch was ich habe ist sehr gut, allerdings wird dies dort auch einfach nur als "sollte bekannt sein" hingenommen. Durch ein Javaforum habe ich erfahren, das die -1 durch den Index 0 zustande kommt. Eure Antworten haben mich etwas umdenken lassen und mich anscheinend zum Ziel geführt. Nur für mein Verständnis nochmal die Frage. Ist es in c# nicht vorgesehen das man einfach so ein Stringarrey rückwärts durchläuft, oder liegt es daran, dass ein Stringarrey eigentlich ein Arrey von Arreys ist. Streng genommen ist ein String ja schon ein Arrey von Chars. Hier nochmal mein neuer Code: class Program { static void Main(string[] args) { string[] textArrey = new string[] { "Hallo" }; for(int text = 0; text < textArrey.Length; text++) { string newText = textArrey[text]; for(int i = newText.Length-1; i >= 0; i--) { Console.Write(newText[i]); } } Console.ReadKey(); } }
  21. Hallo zusammen, ich versuche mir c# mit Hilfe von Büchern und Videokursen selber beizubringen. Derzeit befinde ich mich noch bei den Grundlagen der Programmiersprache. Ich versuche eine for-Schleife zu programmieren, welche ein Arrey von Strings durchläuft und den Inhalt dann rückwärts über die Konsole wieder ausgibt. Nach meinem Verständnis, gebe ich der Laufvariable am Anfang der Schleife die Länge des Arreys an, diese soll dann das Arrey von hinten nach vorne durchlaufen und dabei in jedem Umlauf um 1 verringert werden. Danach soll dieses dann über die Variable ausgegeben werden. Leider wird mir immer eine "System.IndexOutOfRangeException: "Index was outside the bounds" ausgegeben. Könnte mir vielleicht jemand behilflich sein und meine Denkfehler aufzeigen? vielen Dank. class Program { static void Main(string[] args) { string[] names = new string[] { "Hannes" }; for(int x = names.Length; x > names.Length -1; x--) { Console.Write(names[x]); } Console.ReadKey(); } }

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...