OOP Prinzip so iO?



  • Hallo,

    ich fang grad an mit C#, und habe mal eine kleine Übung (Nimmspiel) geshrieben, und wollte mal wissen, ob es so in Ordnung ist, und was ich verbessern oder beachten sollte!

    player.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace GameCore
    {
        //Klasse darf nur in assembly verwendet werden
        internal class Player
        {
            private string strName;
    
            //Konstruktor
            public Player(string Name)
            {
                this.Name = Name;
            }
    
            //Eigenschaft Name setzen und lesen
            public string Name
            {
                get { return strName; }
                set
                {
                    if (value.Length > 0)
                        strName = value;
                    else
                        strName = "Undefiniert";
                }
            }
    
            //Münzen vom Stapel ziehen
            public int Ziehen(int iMin,int iMax)
            {
                int iTemp;
                do
                {
                    Console.WriteLine("Bitte Muenzen wegnehmen (Mindestens:{0} und Maximal:{1}", iMin, iMax);
                    iTemp = Convert.ToInt32(Console.ReadLine());
                }
                while (iTemp < iMin || iTemp > iMax);
                return iTemp;
    
            }
    
        }
    }
    

    KI.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace GameCore
    {
        //KLasser darf nur in assembly verwendet werden
        internal class KI
        {
            private string strName;
    
            public KI(string Name)
            {
              this.Name = Name;    
            }
    
            public string Name
            {
                get { return strName; }
                set
                {
                    if (value.Length > 0)
                        strName = value;
                    else
                        strName = "Undefiniert";
                }
            }
    
            public int Ziehen(int iAktuell,int iMin, int iMax)
            {
                int iTemp = 0;
                //Zufallsgenerator starten
                Random myRand = new Random(iAktuell);
    
                //"KI"
                switch(iAktuell)
                {
                    case 1: iTemp = 1;break;
                    case 2: iTemp = 2;break;
                    case 3: iTemp = 3;break;
                    case 4: iTemp = myRand.Next(iMin, iMax); break;
                    case 5: iTemp = 1; break;
                    case 6: iTemp = 2; break;
                    default: iTemp = iAktuell % iMax; break;
                }
                if (iTemp == 0)
                    iTemp = 1;
                return iTemp;
            }
        }
    }
    

    Game.cs

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace GameCore
    {
        public class Game
        {
    
            private int iMuenzen = 0;
            private String strWinner;
            private bool bAutoMuenzen = false;
            private Player plSpieler;
            private KI kiGegner;
            private int iMin;
            private int iMax;
    
            //Spiel mit allen nötigen Infos instanziieren
            public Game(int AnzahlMuenzen,int MindestAnzahlZug,int MaxAnzahlZug,string Spieler,string KI)
            {
                if (AnzahlMuenzen > 5)
                {
                    iMuenzen = AnzahlMuenzen;
                    bAutoMuenzen = false;
                }
                else
                {
                    iMuenzen = 10;
                    bAutoMuenzen = true;
                }
    
               //Teilnehmerklassen instanziieren
                plSpieler = new Player(Spieler);
                kiGegner = new KI(KI);
                iMin = MindestAnzahlZug;
                iMax = MaxAnzahlZug;
            }
    
            public bool Play()
            {
                if (bAutoMuenzen == true)
                    Console.WriteLine("Es wurden automatisch {0} Münzen ausgelegt!", iMuenzen);
    
                Console.WriteLine("Es liegen {0} Münzen da!", iMuenzen);
    
                iMuenzen = iMuenzen - plSpieler.Ziehen(iMin, iMax);
                if (iMuenzen == 0)
                {
                    strWinner = plSpieler.Name;
                    return true;
                }
    
                iMuenzen = iMuenzen - kiGegner.Ziehen(iMuenzen, iMin, iMax);
                Console.WriteLine("Gegner zieht: Es liegen {0} Münzen da!", iMuenzen);
                if (iMuenzen == 0)
                {
                    strWinner = kiGegner.Name;
                    return true;
                }
                return false;
            }
    
            public string Winner
            {
                get { return strWinner; }
            }
        }
    }
    

    Verwenden kann man sie zB so:
    GameTester

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace NImmGame
    {
        using GameCore;
        class Program
        {
            static void Main(string[] args)
            {
                Game myGame = new Game(20, 1, 3, "Sebastian", "Rico");
                bool finished = false;
                do
                {
                    finished = myGame.Play();
                }
                while (finished == false);
    
                Console.WriteLine("Der Gewinner ist {0}", myGame.Winner);
                Console.ReadLine();
    
            }
        }
    }
    

    is das so in Ordnung?
    Was könnte ich besser machen?

    Wie kann ich den Zufallsgenerator mit der aktuellen Zeit starten?
    Und wie kann ich überprüfen, ob eine eingegeben zahl wirklich eine zahl ist?
    (ähnlich IsNumeric aus VB)

    Danke schonmal



  • keine ne antwort für nen anfänger?



  • Ich bin nicht gerade der erfahrenste Programmierer, aber bevor dir gar keiner antwortet kann ich ja versuchen dir zu helfen.
    Überprüfen ob ein char eine zahl ist, kannst du mit der Funktion: char.IsNumber(c)
    Das aktuelle Datum und die aktuelle Zeit bekommst du mit: System.DateTime.Now;
    Der Rest sah schon recht gut aus, aber besser wäre es wenn es sich jemand mit etwas mehr Erfahrung anschauen würde. 😉



  • Zum Zufallsgenerator: Der nimmt die Zeit als Initialisierer, wenn Du dem Konstruktor keine Parameter übergibst.

    Den myRandom würde ich übrigens in die Klasse packen, dann wird er beim konstruieren selbiger initialisiert (mit der Zeit s.o.) und liefert dann eine schöne Folge von Zufallszahlen. Bei Deinem bisherigen Ansatz würde bei jedem Aufruf von Ziehen mit gleichen iAktuell, iMin und iMax die gleiche Zufallszahl rauskommen.



  • "Überprüfen ob die Eingabe auch eine Zahl ist"´:

    string input;
    int result;
    if (!Int23.TryParse(input, out result))
    {
      Console.WriteLine("Falsche Eingabe");
    
    }
    
    /*
    würde dann so aussehen
    */
      public int Ziehen(int iMin,int iMax)
      {
        int iTemp;
    
        do
        {
          Console.WriteLine("Bitte Muenzen wegnehmen (Mindestens:{0} und Maximal:{1}", iMin, iMax);
        }
        while (!Int23.TryParse(Console.ReadLine(), out iTemp) || iTemp < iMin || iTemp > iMax);
        return iTemp;
      }
    


  • sicher das es die funktion IsNumber() gibt, weil ich find die nicht!



  • Ja ganz sicher. Du musst es genau so hinschreiben wie ich es jetzt habe (nur ohne Kommentar 🤡 ).

    System.Char/*Hier NICHT deine char-variable eintragen!*/.IsNumber(c /*Hier kommt deine char-Variable rein*/);
    

    Ich weiß nicht ob du da irgendwo einen Fehler gemacht hast, aber ich weiß ganz sicher das es diese Methode gibt. 😉


Anmelden zum Antworten