Switch Methode macht Code kaputt

visar77

Mitglied
Ich versuche einen Elo-Simulator zu programmieren. Durch die Kommentare am Anfang (sorry fürs schlechte Englisch) hab ich kurz und knapp erklärt was das Programm so tut. Ich versuche nun Elo-Tiers hinzufügen, damit ich weiß wie viele Spiele ich ungefähr spielen muss um die z.b Platinum 2 zu erreichen. Wenn ich aber die SwitchMethoden hinzufüge, dann funktioniert mein Code nicht mehr.

Java:
import java.util.Random;
import java.util.Scanner;
public class EloSimulator {
    /*This Code will simulate:
     * -The player starting at a specific amount of LP to 100
     * -If the player reaches 100 LP he will do his promo
     * -If he wins his promo he will add it to PromosWon/if he loses nothing happens and the simulations goes to the next player
     * -After that process the simulation restarts with another player with the same amount of LP
     * -The Player will not demote he will have negative Lp but he wont demote because I didn't take it into account so dont hate pls
     */
    
    public static void main(String[]args) {
        //Editable/you can edit the code underneath this comment
        int TRank = 0;
        int TRank2 = 0;
        int AmountofSimulations = 1000;
        int maxLPWON = 24;
        int minLPWON = 17;
        int maxLPLOST = 17;
        int minLPLOST = 13;
        int Winrate = 49;
        int StartingLP = 0;
        //not editable/you shouldn't edit the code underneath this comment
        int Simulations = 0;
        int PromosWon = 0;
        int[] GArray = new int[AmountofSimulations+1];
        Scanner sc = new Scanner(System.in);
        System.out.println("Rank:");
        String Rank = sc.next();
        System.out.println("Tier:");
        int Tier = sc.nextInt();
        System.out.println("Rank:");
        String Rank2 = sc.next();
        System.out.println("Tier:");
        int Tier2 = sc.nextInt();
        switch(Rank) {
        case "Iron":
                 TRank=0;
            break;
        case "Bronze":
                 TRank=4;
            break;
        case "Silver":
                TRank=4;
            break;
        case "Gold":
                TRank=12;
            break;
        case "Platinum":
                TRank=16;
            break;
        case "Diamond":
            TRank=20;
            break;
            default:
                System.out.println("Fehler");
                break;
        
        }
        switch (Tier) {
        case 1:
            TRank=TRank+3;
            break;
        case 2:
            TRank=TRank+2;
            break;
        case 3:
            TRank=TRank+1;
            break;   
            default:
                TRank=TRank+0;
                break;
        }
        switch(Rank2) {
        case "Iron":
                 TRank2=0;
            break;
        case "Bronze":
                 TRank2=4;
            break;
        case "Silver":
                TRank2=4;
            break;
        case "Gold":
                TRank2=12;
            break;
        case "Platinum":
                TRank2=16;
            break;
        case "Diamond":
                TRank2=20;
            break;
        default:
            System.out.println("Fehler");
            break;
        
        }
        switch (Tier2) {
        case 1:
            TRank2=TRank2+3;
            break;
        case 2:
            TRank2=TRank2+2;
            break;
        case 3:
            TRank2=TRank2+1;
            break;
        default:
            TRank2=TRank2+0;
            break;
        }
        while(Simulations<AmountofSimulations) {
            int Games = 0;
            int LP = StartingLP;
            do {
                double Winrate2 = Math.random()*100;
                int LPLost= new Random().nextInt((maxLPLOST-minLPLOST)+1)+minLPLOST;
                int LPWIN = new Random().nextInt((maxLPWON-minLPWON)+1)+minLPWON;
                if(Winrate2<Winrate) {
                    LP=LP+LPWIN;
                }
                else {
                    LP=LP-LPLost;
                }
                Games++;
                
            }
        
            while(LP<100);
            Simulations++;
            GArray[Simulations] = Games;
            if(LP>=100) {
                int PromoGamesWON = 0;
                do {
                    if(TRank % 4 ==3) {
                        for(int i=1; i<5; i++) {
                        double Winrate2 = Math.random()*100;
                        if(Winrate2<Winrate) {
                            PromoGamesWON++;
                            Games++;
                            if(PromoGamesWON==3) {
                                TRank++;
                            }
                        }
                        
                    }
                    }
                    else {
                        for(int i=1; i<3; i++) {
                            double Winrate2 = Math.random()*100;
                            if(Winrate2<Winrate) {
                                PromoGamesWON++;
                                Games++;
                                if(PromoGamesWON==2) {
                                    TRank++;
                                }
                            }
                    }
                }
                
            }
                while(TRank!=TRank2);
            
                
            }
        }
        
        int x = 0;
        for(int i:GArray) {
            x=x+i;
        }
        
        double y = AmountofSimulations*10/10;
        x=x/GArray.length;
        System.out.println("Average Games: "+x);
        System.out.println("Percentage of Promos won: "+(PromosWon/y)*100+"%");
    }
}

Wenn ich die Switchmethoden weglasse, dann klappt der restliche Code.
Kann mir jemand erklären, was ich denn falsch mache.
Danke im Voraus.

Lg,
Visar
 
Kannst Du einmal im Detail erläutern, was "funktioniert mein Code nicht mehr" heißt. Was für Fehler / Verhalten treten auf und was wäre das erwartete Verhalten?
 
Kannst Du einmal im Detail erläutern, was "funktioniert mein Code nicht mehr" heißt. Was für Fehler / Verhalten treten auf und was wäre das erwartete Verhalten?
Also wenn ich dieses Programm ohne Switch ausführe, dann bekomme ich die "Average Games" raus . Wenn ich die Switch methoden hinzufügen kommt absolut nichts raus. Einfach nichts. (Ich benutze Eclipse)
 
Definiere "Funktioniert nicht"? Wo kommt was falsches raus. Welche Variablen haben dann den falschen Wert? Wo läuft was schief? (Ich hab wenig Lust mir derartig viel, relativ unstruktrierten Code anzusehen und zu verstehen was da passieren soll)
 
Also wenn ich dieses Programm ohne Switch ausführe, dann bekomme ich die "Average Games" raus . Wenn ich die Switch methoden hinzufügen kommt absolut nichts raus. Einfach nichts. (Ich benutze Eclipse)
Zeig doch mal den Code ohne Switch, so wie er noch funktioniert und erkläre uns dann, was du mit dem switch erreichen möchtest (wenn der Code vorher doch funktioniert hat).
 
Entweder nutze einen Debugger oder setze zwischen den einzelnen switch Gruppe ein paar Ausgaben (z.B. TRank, dann siehst du auch den zugewiesenen Wert), damit du siehst wo du hängen bleibst.
 
Du hast lauter Magic Numbers im Code, die kein außenstehender versteht.

Warum ist bei Bronze und Silber TRank 4? Warum überhaupt 4er Schritter? Was ist TRank und TRank2 überhaupt? Was tun die? Dein Code ist - so wie er dasteht - leider für einen Aißenstehende schlicht unverständlich. Schau mal mit einem Debugger rein, was passiert, aber von außen ist das schwer.

Außerdem wäre es hilfreich, bei "funktioniert nicht" mal genau anzugeben:
* Was hast du als Eingabe eingegeben
* Was kommt als Ausgabe raus
* Was sollte als Ausgabe rauskommen

Und zwar konkret nicht "Es sollte was berechnetes rauskommen - sondern was genau für Werte"
 
Diese Ranks und Tiers sind einfach Ranks und Tiers aus League of Legends. Niedrigster Rank ist iron, höchster Diamond und niedrigstes Tier ist 4 und höchstes Tier ist 1. Heißt wenn ich Iron 3 als erstes Rank eingebe und Gold 1 als zweitens, heißt es dass ich ausrechnen will wie viele Spiele es dauert bis ich von Iron 3 zu Gold 1 komme.
 
Was machst Du denn für Eingaben? Mal in einem Debugger ausgeführt? Mal die Variablen TRank und TRank2 in der do/while Schleife ausgeben?

Wenn TRank2 < TRank sein sollte, dann ist es eine Endlosschleife, da TRank immer nur erhöht wird, wenn ich das richtig gesehen habe ...
 
Wenn TRank2 < TRank sein sollte, dann ist es eine Endlosschleife, da TRank immer nur erhöht wird, wenn ich das richtig gesehen habe ...
[/QUOTE]
Es ist kompliziert. Bei einer Promo (also alles in der if(LP<=100) muss man 3 oder 5 promospiele (wenn man im 1.Tier ist) spielen. Wenn man 2/3 Spiele gewinnt steigt man auf, deswegen TRank++;
 
Da du der einzige bist, der überhaupt versteht, worum es hier geht, mach einfach was dir vorgeschlagen wurde und baue ein paar Ausgaben dazwischen ein und versuche dem dadurch auf die Spur zu kommen.

Oder nutze den Debugger.
 
Zusammenfassung:
- Dieses Programm soll eine durschnittliche Anzahl an Spielen ausgeben, die man braucht um von einem Rank und Tier (TRank) zum anderen kommt (TRank2)
- Man fängt immer bei einer Anzahl von 0 LP. Danach wird durch Zufall bestimmt ob man gewinnt oder verliert. Wenn man gewinnt, gewinnt man LP. Wenn man verliert dann umgekehrt. Bis zu einer Anzahl von 100 LP
- Danach kommt man in die Promos (Promotion), wo man 3/5 (im 1.Tier) Promo-Spiele spielen muss. Gewinnt man 2/3 (im 1.Tier), dann steigt man mit dem Rank auf, deswegen TRank++;

Sorry, dass ich vergessen habe euch richtig zu informieren.
 
Also ich habe es mal mit Deinen Eingaben laufen lassen un es ist eine Endlosschleife, denn er erhöht TRank maximal nur 2 Mal.
1 Mal wenn PromoGamesWON == 2 und einmal wenn es == 3 ist.

Dadurch wird TRank niemals TRank2 so der Unterschied > 2 ist. (Bei deinen Werten waren die Werte 1 und 15 oder so ...)
 
In der Programmlogik stecken wohl noch mehr Ungereimtheiten (Eclipse, Java10, Variable markieren, Vorkommen visuell aufstöbern):
Java:
...int PromosWon = 0; ...(letzte Zeile)  System.out.println("Percentage of Promos won: "+(  ___PromosWon___  /y)*100+"%");
oder
Code:
  double y = AmountofSimulations*___10/10___;
. Wobei es zu diesen Ausgaben auf der Konsole aber gar nicht erst kommt.
 

Neue Themen


Zurück
Oben