Laden...

Wie kann ich mehrere Schleifen schachteln (Würfelspiel)?

Letzter Beitrag vor 6 Jahren 4 Posts 3.561 Views
Wie kann ich mehrere Schleifen schachteln (Würfelspiel)?

Moin.

Bin ein c# Einsteiger und habe folgende Aufgabe als Übung durchgeführt:
Pseudozufallszahlen generieren, einen Würfel simulieren und ausgeben (mit % Angabe wie oft welches Auge gewürfelt wurde)

Habe es umsetzen können, würde jedoch das Programm erweitern, sodass der Nutzer
eingeben kann wie viele Würfel gewürfelt werden sollen.

Nun, da habe ich eine Lücke beim verstehen wie ich das verschachteln kann mittels Schleifen (zB for schleifen)?

Hier der Code für einen Würfel, mit n Würfen.


C#:

using System; 
  
using System.Threading; 
  
  
//.......... 
//......... 
//Mir ist unklar, egal wie, bei der Verschachtelung der Schleifen 
//Wie ich die ineinander zusammenführe.. 
//..das Abfangen für die Falscheingaben ist nicht im Code 
//Obwohl gelöst, bringt aber nix 
  
  
namespace ExcersiseMultiDices_JL 
{ 
    class DiceRoll 
    { 
  
        static void Main(string[] args) 
        { 
  
  
            //Fragt den Benutzer ab wie oft die Würfelsimulation.. 
            Console.WriteLine("Wie oft soll gewürfelt werden ?"); 
            int numberRepeats = int.Parse(Console.ReadLine()); 
          /*  Console.WriteLine("Bei wie vielen Würfeln ?"); 
            int numberDice = int.Parse(Console.ReadLine()); */ 
  
            var DiceRandomGenerate = new Random(); 
            int[] Die = new int[7]; 
          
      
            int z; 
  
            var resAndNumber = new int[6]; 
        
            
  
            for (z = 1; z < numberRepeats; z++) 
            { 
                Die[DiceRandomGenerate.Next(1, 7)]++; 
        
                
            } 
  
            //..Den Würfel mittels for werfen soll,inkrementiert den Zähler 
            //Und erfasst die Ergebnisse im Array 
            for (int i = 0; i < numberRepeats; i++) 
            { 
                
                       var rolledResult1 = DiceRandomGenerate.Next(1, 7); 
                       resAndNumber[rolledResult1 - 1]++; 
                
                
            } 
            
            
            //Die folgende for-Schleife berechnet die.. 
            //..Prozentzahl der im Array erfassten Würfe. 
            //Diese werden, gemeinsam mit der Anzahl wie oft ein Würfelauge vorkam, in der Konsole ausgegeben. 
            for (int i = 0; i < 6; i++) 
            { 
          
  
                double Percentage1 = 100.0 * resAndNumber[i] / numberRepeats; 
                
                
  
                Console.WriteLine("Würfelauge {0} vom 1. Würfel  wurde {1} mal gewürfelt. ({2}%)", i + 1, resAndNumber[i], Percentage1);    //Welchen Algorithmus für 1+ Würfeln? 
            } 
            
            //Nach dem Durchlaufende wird das Konsolenfenster offen gehalten, damit der Nutzer 
            //..Die Ausgabe betrachten und mit einem beliebigen Tastendruck beenden kann 
            Console.WriteLine("Beliebige Taste drücken um das Programm zu beenden."); 
            Console.ReadKey(); 
  
      
  
            
  
  
  
        } 
       /* static int GenerateNumber(Random random) 
        { 
            return random.Next(1, 7); 
        }*/ 
    } 
}	

Weiss.. ist eig. unkompliziert zu lösen, gerade blockt aber alles bei mir und man kommt nicht weiter. :S


--.--------.--------
-o_._o-

Hallo,

leider hast Du nicht genau beschrieben was Du willst.

Wenn Du einfach nur die einzelnen Würfel betrachten willst, brauchst Du nichts zu schachteln.
Dann reicht es, die Anzahl der Würfel mit der Anzahl Wiederholungen zu multiplizieren, weil es keinen Unterschied macht, bei welcher Wiederholung ein Würfel geworfen wurde.

Wenn Du die Summen der einzelnen Wiederholungen zählen willst, musst Du für zwei Dinge sorgen:1.Das Objekt (bei Dir das Array), in dem die Anzahl gespeichert wird, muss groß genug sein, um alle möglichen Summen aufnehmen zu können. Dann eignet sich statt einem Array ggf. besser ein Dictionary<int,int>. 1.Du musst dafür sorgen, dass für jede Wiederholung (äußere Schleife) soviele Würfe addiert werden, wie es Würfel gibt (innere Schleife).

Also sowas in der Art (nicht getestet):

           var resAndNumber = new Dictionary<int,int>();

            // für jede Wiederholung...
            for (int i = 0; i < numberRepeats; i++)
            {
                // ...rolle Anzahl Würfel und addiere Ergebnisse
                int rolledResult = 0;
                for (int i = 0; i < numberDice; i++)
                {
                    rolledResult1 += DiceRandomGenerate.Next(1, 7);
                }

                // wenn diese Summe noch nicht geworfen wurde, einen Eintag dafür im Dictionary anlegen
                if(!resAndNumber.ContainsKey(rolledResult))
                {
                    resAndNumber[rolledResult1] = 0;
                }

                // bisherige  Anzahl für diese Summe hochzählen
                resAndNumber[rolledResult1]++;
            }


Bei der Ausgabe dann mit foreach das ganze Dictionary durchlaufen (sechsmal reicht ja dann nicht mehr).

Finde ich übrigens sehr gut, dass Du als Einsteiger erst mal auf der Konsole arbeitest statt Dich direkt auf grafische Oberflächen zu stürzen 👍 (persönliche Meinung)

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

@MarsStein

Danke Marsianer. 😄

Werde es später genauer ansehen wenn ich die Zeit dazu hab.
Am liebsten jetzt. x)

Irgendwie wäre es, m. M. n., nicht sinnvoll sich eines schlechtes Verständnis als Anfänger anzueignen.
Deswegen die Entscheidung mal ganz klein zu beginnen.


--.--------.--------
-o_._o-

Wäre es nicht sinnvoller, erst mal die Grundlagen von C# komplett zu lernen?
Es gibt tolle Bücher! Ich will keine Werbung machen, aber schau dir mal von Andreas Kühnel 'C#6 mit Visual Studio 2015' an - das wirst du nie bereuen!

OO gibts seit Platon - hatte der auch C#?