Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von schweito
Thema: Algorithmus für Jeder-gegen-Jeden
Am im Forum: Grundlagen von C#

Liebe C-sharp-Community,

ich habe gestern versucht Eure Anregungen umzusetzen und Teile neu geschrieben. Nun habe ich zwei Probleme:

1.) Fehlermeldung: "Der Index darf nicht kleiner als die Sammlung sein"
Kommt bei Zeile 67 in der die Datei erstellt oder erweitert werden sollte.

2) Der zweite Fehler : Kämpfe gegen sich selbst sind nun leider möglich.(Lt. Dateiinhalt)


Ich bin wie folgt vorgegangen:

Der aktuelle Kämpfer wird als Datei angelegt und dann temporär in ein Dictionary gespeichert und von der Liste entfernt. Ich dachte damit, die Abfrage wie
k==start_pos weglassen zu können, da der aktuelle Kämpfer nicht mehr in der Liste ist und somit nicht gegen sich selbst kämpfen kann. Nachdem die Liste einmal durchgegangen wurde und die Paarungen fertig sind, wird das Element wieder in die Liste zurückgeschrieben und der Inhalt der List ist wieder wie vorher. Das scheint so aber nicht zu gehen. Der bisherige Vorteil ist, dass die Komplexität heruntergegangen ist er bricht aber bei element=7 lt. Debugger ab.


public static void CreateHistory()
    {

        List<string> fighter = new List<string>() { "Johnson", "Peters", "Lidell", "McCall", "Jackson", "Henderson", "Clark", "Monroe" };
        Dictionary<string, int> ExcludedFighter = new Dictionary<string, int>(); //Enthält den zu entfernenden Kämpfer
        int element = 0, opponent, result;

        
        

        while (element < fighter.Count)
        {

            // ----------------------------------------------------------------------------------------------------------------------
            //| In diesem Abschnitt wird die Liste "fighter" durchgegangen und das aktuelle Element (der aktuelle Kämpfer)
            //| temporär in einem Dictionary gespeichert inkl. der Position, um diesen Kämpfer aus der Liste der Gegner zu nehmen.
            //| So sollen Kämpfe mit sich selbst vermieden werden.
            //|-----------------------------------------------------------------------------------------------------------------------

            ExcludedFighter.Add(fighter[element], element); //Dictionary: Aussortierter Kämpfer und Index

            
            fighter.RemoveAt(element); //Entferne temporär den aktuellen Kämpfer aus der Liste

            for (int i=0;i<fighter.Count;i++) //Gehe durch die Liste der Kämpfer
            {
                opponent = GetRandomNumber(0,fighter.Count); //Gegner wird zufällig ermittelt
                result = GetRandomNumber(0, 4); //Resultat wird zufällig ermittelt
                
                using (StreamWriter w = File.AppendText("C:/Users/korre/Documents/source_modified/source/repos/BoxingManager/BoxingManager/Data/"+fighter[element] + ".txt")) //Schreibe die Kämpferdatei
                {
                    w.WriteLine(fighter[opponent]+","+result);
                }

                using (StreamWriter w = File.AppendText("C:/Users/korre/Documents/source_modified/source/repos/BoxingManager/BoxingManager/Data/" + fighter[opponent] + ".txt")) //Schreibe die Gegnerdatei
                {
                    if (result == 0)
                    {
                        w.WriteLine(fighter[element] + "," + "2");
                    }

                    if (result == 1)
                    {
                        w.WriteLine(fighter[element] + "," + "3");
                    }

                    if (result == 2)
                    {
                        w.WriteLine(fighter[element] + "," + "0");
                    }

                    if (result == 3)
                    {
                        w.WriteLine(fighter[element] + "," + "1");
                    }
                    if (result == 4)
                    {
                        w.WriteLine(fighter[element] + "," + "4");
                    }

                }


            }


            foreach (var pair in ExcludedFighter) //Ermittele das gelöschte Element in der Dictionary
            {
                fighter.Insert(pair.Value, pair.Key);  //Schreibe das temporär gelöschte Element zurück in die Liste
            }
            ExcludedFighter.Clear();
            element++;

        }
    }

Viele Grüße und vielen Dank bislang, Ich habe das Gefühl als habe ich ein bisschen was gelernt bisher auch wenn es wohl nicht danach aussieht.
schweito

Thema: Algorithmus für Jeder-gegen-Jeden
Am im Forum: Grundlagen von C#

Hallo @alle,

vielen Dank - ich werde mir die Antworten und Ideen zu Herzen nehmen und den Code neuschreiben - er ist eh unübersichtlich.

Viele Grüße,
schweito

Thema: Algorithmus für Jeder-gegen-Jeden
Am im Forum: Grundlagen von C#

Hallo @all,

danke für die schnelle Antworten - ich sehe das auch so - die Logik ist noch ein bisschen fehlerhaft. Ich werde die Links lesen - eine Frage vorab - wie sollte ich denn sonst ausschließen, dass der Kämpfer nicht gegen sich selbst kämpft, wenn nicht mit der Prüfung start_pos==k ?

Viele Grüße,
schweito

Thema: Algorithmus für Jeder-gegen-Jeden
Am im Forum: Grundlagen von C#

Liebe C#-Gemeinde,

leider ist mein Titel ein wenig diffus - aber ich wollte eben alle Seiten "meines" aktuellen Problems nennen. Ich arbeite aktuell an einem Algorithmus der folgende bewerkstelligen soll:


Erstellen einer beliebigen Anzahl an Kämpfern
- Jeder Kämpfer wird als Objekt in einer Schleife generiert.
- Jeder Kämpfer bekommt eine "Kampfhistorie" in der er gegen zufällige Gegner kämpft.
- Gewinnt der Kämpfer wird es bei ihm entsprechend vermerkt - und beim Gegner entsprechend invertiert.
- Der Kämpfer darf nicht gegen sich selbst kämpfen dürfen (Ich habe versucht, dies durch ein inkrement zu lösen : k++).


Ich habe aktuell das Problem, dass die Paarungen und Resultat nicht korrekt gespeichert werden. Manchmal kommt das Problem das in der Datei : "Jack" zb. dreimal der Gegner
"Mike" gelistet wird. Bei Mike stehen aber nur zweimal "Jack".

Anbei der Code, ich weiß aktuell nicht, wie ich es besser beschreiben könnte:


 public void Generate_History()
    {
        String fighter1, fighter2; //Kämpfer, Gegner
        int result; //Resultat
        int start_pos = 0;   //Erster Kämpfer der Liste
       
        int k; //Späterer Index für die Gegnerwahl
        Opponent[] fighter = new Opponent[9]; //Erstelle 9 Kämpfer
        
        
        string path = @"C:/Users/korre/Documents/source_modified/source/repos/BoxingManager/BoxingManager/Data/";
        
        for (int i = 0; i < 8; i++) //Erstelle zum Testen 9 Kämpfer
        {
            fighter[i] = new Opponent();
        }

        while (start_pos < 8)
        {
            for (int i = 0; i < 8; i++) // Solange noch nicht jeder gekämpft hat
            {
                k = GetRandomNumber(0, 8);  //Zufällige Gegnerwahl
                result = GetRandomNumber(0, 4); //Zufälliges Resultat
                if (k == start_pos) //Kämpfer und Gegner dürfen nicht gleich sein. Prüfen und k ändern: Idee k++
                {
                    
                    k ++;

                }
                else //Kämpfer und Gegner sind ungleich
                {
                    
                    //Schreibe den aktuelle Kämpfer (linken Teil der Paarung) in die Variable fighter1 / Start_pos beschreibt den Index für den linken Teil der Paarung und ändert sich 
                   //nachdem gegen ein bestimmter Boxer gegen alle Kämpfer der Liste gekämpft hat
                  
                     fighter1 = fighter[start_pos].firstNames[start_pos] + " '" + fighter[start_pos].nickNames[start_pos] + "' " + fighter[start_pos].lastNames[start_pos];

                    //Schreibe den zufälligen Gegner (rechten Teil der Paarung) in die Variable fighter2 / k ist zufällig und wird durch GetRandomNumber ermittelt.
                   
                    fighter2 = fighter[k].firstNames[k] + " '" + fighter[k].nickNames[k] + "' " + fighter[k].lastNames[k];
                    


                    
                    //Kämpfer: Es wird die Datei mit dem Dateinamen des Kämpfer angelegt und als Inhalt der Gegnername und das Resultat gespeichert.
                    
                    using (StreamWriter sw = File.AppendText(path + fighter[start_pos].firstNames[start_pos] + "_" + fighter[start_pos].nickNames[start_pos] + "_" +   
                    fighter[start_pos].lastNames[start_pos]+".txt"))
                    {
                        sw.WriteLine(fighter2 + "," + result); //Schreibe bei Kämpfer den Namen des Gegners und das Resultat

                    }
                    //Gegner: Es wird die Datei mit dem Dateinamen des Gegners angelegt und als Inhalt der Kämpfers und das Resultat gespeichert.
                    
                    using (StreamWriter sw = File.AppendText(path + fighter[k].firstNames[k] + "_" + fighter[k].nickNames[k] + "_" + fighter[k].lastNames[k]+".txt"))
                    {
                        if (result == 0) // 0: Gewonnen nach Punkten Kämpfer  ; 2: Verloren nache Punkten Gegner
                        {
                            result = result + 2;
                            sw.WriteLine(fighter1 + "," + "2"); //Schreibe beim Gegner, den Namen des Kämpfers uns das Resultat (Invertiertes Resultat)
                        }

                        if (result == 1)  // 1; Gewonnen durch KO Kämpfer; 3: Verloren durch KO Gegner
                        {
                            result = result + 2;
                            sw.WriteLine(fighter1 + "," + "3"); 
                        }

                        if (result == 2) // 2: Verloren nache Punkten Kämpfer  ; 0: Gewonnen nach Punkten Gegner
                        {
                            result = result - 2;
                            sw.WriteLine( fighter1 + "," + "0");
                        }

                        if (result == 3) //3: Verloren durch KO Kämpfer; 1: Gewonnen durch KO Gegner
                        {
                            result = result - 2;
                            sw.WriteLine(fighter1 + "," + "1");
                        }

                        if (result == 4) // 4: Unentschieden
                        {
                            sw.WriteLine(fighter1 + "," + "4");
                        }
                    } 

                }   
             };

           

            start_pos++; //Nehme einen neuen Kämpfer 
        }

        



    }

Ich finde meine Fehler aktuell nicht und wäre denkbar, für etwaige Denkanstöße, oder Vereinfachungen.

Viele Grüße und vielen Dank,
schweito

Thema: Probleme beim Erstellen einer Liste aus Objekten mit zufälligen Eigenschaften
Am im Forum: Grundlagen von C#

Liebe Forengemeinde,

ich möchte folgendes realisieren:


Ich habe eine Klasse Boxer, die logischerweise eine Spielfigur vom Typ Boxer
abbilden soll, mit zufälligen Eigenschaften. Um das zu bewerkstelligen habe ich
im Konstruktor die Randomfunktion für alle zufälligen Werte implementiert:



public boxer() //Konstruktor mit Zufallswerten
        {
            Random rnd = new Random();
      
            bGewicht = rnd.Next(60, 120);
            bAusdauer = rnd.Next(10, 35);
            bKraft = rnd.Next(10, 25);
            bSchnelligkeit = rnd.Next(10, 25);
            bZaehigkeit = rnd.Next(10, 80);
            bMeidverhalten = rnd.Next(10, 20);
            bPraezision = rnd.Next(10, 20);
            bAlter = rnd.Next(18, 27);
            bWBARating = 100;
            bWBCRating = 100;
            bIBFRating = 100;
            checkWeightClass();  //Gewichtsklasse wird ermittelt
            generateName();     // Namen wird zufällig zusammengestellt

           

    }



Die beiden Funktionen checkWeightClass() und generateName() sind auch in der
Klasse Boxer definiert:

Die Funktion für die Namensgenerierung:



   public void generateName()
        {
            Random indexVorname = new Random(); //190
            Random indexNachname = new Random(); //190
            Random indexKampfname = new Random(); //190
            Random indexZufall = new Random();
            bVorname = indexVorname.Next(0, 189);
            bNachname = indexNachname.Next(0, 189);
            bKampfname = indexKampfname.Next(0, 189);
            //bName = "";
            int zufall = indexZufall.Next(0, 4);

            if (zufall ≥ 2)
            {
                bName = vorname[bVorname] + " " + "'" + kampfname[bKampfname] + "'" + " " + nachname[bNachname];
            }

            if (zufall < 2)
            {
                bName = "'" + kampfname[bKampfname] + "'" + " " + vorname[bVorname] + " " + nachname[bNachname];
            }

Die Funktion für die Gewichtsklasse:



public void checkWeightClass()
        {

            if (bGewicht < 65)
            {

                bGewichtsklasse = "Juniorfliegengewicht";

                bGroesse = rnd2.Next(160, 170);

            }

            if (bGewicht ≥ 65 && bGewicht < 75)
            {
                bGewichtsklasse = "Leichtgewicht";

                bGroesse = rnd2.Next(170, 178);
            }

            if (bGewicht ≥ 75 && bGewicht < 85)
            {
                bGewichtsklasse = "Mittelgewicht";

                bGroesse = rnd2.Next(178, 185);
            }
            if (bGewicht ≥ 85 && bGewicht < 95)
            {
                bGewichtsklasse = "Halbschwergewicht";

                bGroesse = rnd2.Next(185, 191);
            }

            if (bGewicht ≥ 95 && bGewicht < 105)
            {
                bGewichtsklasse = "Schwergewicht";

                bGroesse = rnd2.Next(191, 198);
            }

            if (bGewicht ≥ 105)
            {
                bGewichtsklasse = "Superschwergewicht";

                bGroesse = rnd2.Next(198, 210);
            }



        }


Wird nun ein Button geklickt wird bei jedem Klick ein zufälliges Objekt
erzeugt.


 boxer spieler = new boxer();


Nun zu meine eigentlichen Problem. Ich möchte nachdem ein Boxer gewählt wurde
50 weitere Boxer erstellen - alle auch mit Zufallswerten. Also dachte ich, ich mache
eine Liste mit 50 Objekten - da im Konstruktor alles zufällig ermittelt wird, sollte
es ja gehen ...


 List<boxer> WBACircuit = new List<boxer>();      //Liste aus Objekten erstellen

                for (int i = 0; i < 49; i++)                 //50 neue Boxer in die Liste aufnehmen
            {
                WBACircuit.Add(new boxer());
                
            }

            foreach (var element in WBACircuit)                //Boxer ausgeben und Eigenschaften ausgeben
                Console.WriteLine(element.getbName(),element.getbKraft().ToString(),
                                  element.getbZaehigkeit().ToString(),
                                  element.getbAusdauer().ToString(),
                                  element.getbSchnelligkeit().ToString(), 
                                  element.getbMeidverhalten().ToString(),
                                  element.getbPraezision().ToString());        
                
               

            

        }

Leider zeigt die Console nun 50 mal den gleichen Namen an und die andere Daten
werden gar nicht angezeigt, obwohl ich diese in der foreach ja angegeben habe.
Sollte in der Schleife nicht 50 mal der Konstruktor aufgerufen werden, und somit 50
unterschiedliche Objekter erstellt werden? Klicke ich auf den Button der obige Funktion enthält,
kommt immer eine neue Ausgabe mit 50 gleichen Namen ...

Mache ich irgendwas falsch? Entschuldigung , für das lange Posting ich wollte mein
Problem nur verständlich darstellen - Projekt ist dem Posting anhängend...

Viele Grüße und vielen Dank für etwaige Antworten...
Timo