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