Za duzo ifow

0

Witam.
Odkopałem ostatnio "grę" konsolową która napisałem podczas początków mojej nauki javy;) I pierwsze co rzuciło mi się w oczy to wielka ściana ifów. Czy da się to jakość skrócić ewentualnie rozpisać to tak, żeby było czytelnie?

 public void walka(Gracz g,Przeciwnik p){
        Random r = new Random();
        double mojwalka, mojatak, mojobrona;
        double jegowalka, jegoatak, jegoobrona;
        double mojtrafienie, mojranienie;
        double jegotrafienie, jegoranienie;
        double moj, jego, mojsra, jegosra;

        mojwalka = g.getWalka();
        mojatak = g.getAtak();
        mojobrona = g.getObrona();

        jegowalka = p.getWalka();
        jegoatak = p.getAtak();
        jegoobrona = p.getObrona();

        mojtrafienie = mojwalka / jegowalka / 2;
        jegotrafienie = jegowalka / mojwalka / 2;
        mojranienie = mojatak / jegoobrona / 2;
        jegoranienie = jegoatak / mojobrona / 2;

        if(mojtrafienie>0.9){
            mojtrafienie=0.9;
        }
        if(jegotrafienie>0.9){
            jegotrafienie=0.9;
        }
        if(mojranienie>0.9){
            mojranienie=0.9;
        }
        if(jegoranienie>0.9){
            jegoranienie=0.9;
        }
        if(mojtrafienie<0.1){
            mojtrafienie=0.1;
        }
        if(jegotrafienie<0.1){
            jegotrafienie=0.1;
        }
        if(mojranienie<0.1){
            mojranienie=0.1;
        }
        if(jegoranienie<0.1){
            jegoranienie=0.1;
        }

        int mtra=0, jtra=0,mra,jra;
        int mojwynik, jegowynik;
        mojwynik=0;
        jegowynik=0;
        for(int i=0; i<10; i++){
            mtra=0; 
            jtra=0;
            mra=0;
            jra=0;
            System.out.println("\nRunda: "+(i+1));
            moj = r.nextInt((100)+1);
            jego = r.nextInt((100)+1);

            moj=moj/100;
            jego=jego/100;

            mojsra = r.nextInt((100)+1);
            jegosra = r.nextInt((100)+1);

            mojsra=mojsra/100;
            jegosra=jegosra/100;

            if(moj<mojtrafienie){
                mtra=1;
                if(jego<jegotrafienie){
                    jtra=1;
                    if(mtra==1 && jtra==1){
                        System.out.println("Rownoczese trafienie czyli nikt. Wynik: "+mojwynik+" - "+jegowynik);
                    }
                }
                if(mtra==1 && jtra==0){
                    if(mojsra<mojranienie){
                        mra=1;
                        mojwynik++;
                        System.out.println("Trafilem i ranilem. Wynik: "+mojwynik+" - "+jegowynik);
                    }
                    if(mojsra>mojranienie){
                        System.out.println("Trafilem nie ranilem. Wynik: "+mojwynik+" - "+jegowynik);
                    }
                }
            }
            if(jego<jegotrafienie){
                jtra=1;
                if(moj<mojtrafienie){
                    mtra=1;
                    if(mtra==1 && jtra==1){
                        //System.out.println("Rownoczese trafienie czyli nikt. Wynik: "+mojwyn+" - "+jegowyn);
                    }
                }
                if(mtra==0 && jtra==1){
                    if(jegosra<jegoranienie){
                        jra=1;
                        jegowynik++;
                        System.out.println("Przeciwnik trafil i ranil. Wynik: "+mojwynik+" - "+jegowynik);
                    }
                    if(jegosra>jegoranienie){
                        System.out.println("Trafil nie ranil. Wynik: "+mojwynik+" - "+jegowynik);
                    }
                }
            }
            if(mtra==0&&jtra==0){
                System.out.println("Nikt nie trafia. Wynik: "+mojwynik+" - "+jegowynik);
            }
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
            }
        System.out.println("\nWynik: "+mojwynik+" - "+jegowynik);

        boolean wygrana=false,remis=false;
        double exp;

        if(mojwynik>jegowynik){
            wygrana=true;
        }else if(mojwynik==jegowynik){
            remis=true;
        }

        exp = (g.getLvl() / 2) + (p.getLvl() / 3) + 1;

        if (wygrana) {
            exp += p.getLvl() + 2;
        }
        if (remis) {
            exp += p.getLvl() / 2 + 1;
        }
        if (jegowynik==0&&mojwynik>0) {
            exp+=g.getLvl()/2;
        }
        if ((mojwynik-jegowynik)>=5) {
            exp += g.getLvl();
        }
        if (g.getLvl()<p.getLvl()) {
            exp+=g.getLvl();
        }
        int koniecexp=(int)exp/2;
        System.out.println("Zyskano: " + koniecexp+" pkt exp");
        g.zmienExp((int)koniecexp);

    }

PS Zmienna mojsra pochodzi od moja szansa ranienia ;)

0

Lepiej i szybciej będzie napisać ten algorytm od początku.

0

To sie domyslilem ;) a jakieś porady jak?

0
                double moj;
                ...
                moj = r.nextInt((100)+1);
                moj=moj/100;

Coś tu nie gra, powinno być:

                double moj;
                ...
                moj=100;
                moj=moj+1;
                moj=r.nextInt(moj);
                moj=moj/100;

albo tak:

                double moj=r.nextInt((100)+1)/100.0;

bo twoje pośrednie rozwiązanie jest jakieś mdłe

0

Cały ten mój kod jest taki mdły ;) Tylko prosze o jakies wskazówki jak to od początku sensownie napisac ;)

0

średnio Ci ktoś pomoże - trzeba by przeanalizować ten kod i napisać nowy. A z tego co widzę w walce ująłeś nawet motyw oddawania stolca
"mojsra, jegosra"

Szybciej już by było jakbyś napisał jak kod ma działać

Ale na przykład tę drabinkę:

 if(mojtrafienie>0.9){
                        mojtrafienie=0.9;
                }
                if(jegotrafienie>0.9){
                        jegotrafienie=0.9;
                }
                if(mojranienie>0.9){
                        mojranienie=0.9;
                }
                if(jegoranienie>0.9){
                        jegoranienie=0.9;
                }
                if(mojtrafienie<0.1){
                        mojtrafienie=0.1;
                }
                if(jegotrafienie<0.1){
                        jegotrafienie=0.1;
                }
                if(mojranienie<0.1){
                        mojranienie=0.1;
                }
                if(jegoranienie<0.1){
                        jegoranienie=0.1;
                }

możesz zamienić na:

mojtrafienie = clamp(mojtrafienie, 0.1, 0.9);
jegoranienie = clamp(jegoranienie, 0.1, 0.9);
jegotrafienie = clamp(jegotrafienie, 0.1, 0.9);
mojranienie = clamp(mojranienie, 0.1, 0.9);

gdzie clamp to funkcja:

double clamp(double value, double min, double max) {
  return Math.max(Math.min(value, max), min);
}

co dalej jest brzydkie, ale żeby poprawić to bardziej, trzeba się wgłębić w działanie kodu

w ogóle część logiki powinieneś imo przenieść do klas, np do metody zaatakuj - ta funkcja nie powinna być taka długa, na pewno nie powinna mieć też tylu zmiennych

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0