Aplikacja problem z wyświetlaniem informacji przy użyciu Scanner

0

Cześć robię sobie hobbystycznie aplikację Mortal Kombat, będzie to docelowo prosta gra w klikanie, ale jeszcze szczegółów nie mam, bo się dopiero uczę javy, a podobno najlepiej się uczyć robiąc przy okazji własny program.
Mam problem z klasą Game.java zrobiłem tam Scanner i chcę zrobić tak, że gdy użytkownik wybierze cyfrę wyświetli mu się informacja o danej postaci z Mortal Kombata (informacje są w klasie Encyclopedia). W klasie Game.java zrobiłem ten wybór cyfr używając switch case i chciałem tam wcisnąć printInfo, ale nie wchodzi. Czy wiecie dlaczego?
Oto klasa ze Scanner(tam jeszcze jej nie dokończyłem jej dla wszystkich przypadków, bo mi to printInfo nie wchodzi i nie wiedziałem czy jest sens) - Game.java

package data;

import java.util.Scanner;

public class Game {
	public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        int number;

        System.out.println("Wybierz zawodnika:");
        System.out.println("1. Raiden");
        System.out.println("2. Shao Kahn");
        System.out.println("3. Liu Kang");
        System.out.println("4. Shang Tsung");
        System.out.println("5. Quan Chi");
        System.out.println("6. Scorpion");
        System.out.println("7. Johnny Cage");
        System.out.println("8. Mileena");
        number = input.nextInt();

        switch (number) {
        case 1:
            System.out.println("Wybrałeś Raidena");
            raiden.printInfo();
            break;
        case 2:
            System.out.println("Wybrałeś Shao Kahna");
            shao_kahn.printInfo();
            break;
        default:
            System.out.println("Witaj nieznany użytkowniku!");
        }

        input.close();
    }
}

Klasa, gdzie mamy wszystkie informacje o zawodnikach - Encyclopedia.java

package data;

public class Encyclopedia {
	public static void main(String[] args){
		Fighter raiden = new Fighter("Raiden", "Królestwo Ziemi", "Raiden jest Bogiem Gromu i Obrońcą Królestwa Ziemskiego. Nieśmiertelność oraz wrodzona mądrość dała możliwość prowadzenia ziemskich śmiertelników w niekończącym sie boju z siłami ciemności. W momencie kiedy Shao Kahn cesarz Outworld, zapragnął podbić Królestwo Ziemskie, Raiden porozumiał się ze świątynią światła, która wierzyła, że do rozstrzygania sporów turniej jest lepszy niż wojna. Raiden przedstawił reguły i zasady organizacji turnieju starszym bogom, prosząc o danie szansy Królestwu Ziemskiemu. W ten sposób narodził się Turniej Mortal Kombat. Przez wiele pokoleń wojownicy obu światów zmagali się w walce, nie śniąc nawet że jeden ze światów mógłby zwyciężyć kolejnych 10 turniejów. Wówczas Imperator Zaświatów przysłał Shang Tsunga, wniósł on do Mortal Kombat czarną magie, oraz czterorękiego księcia Goro. Turniej stał się rozpaczliwą walką o ocalenie Królestwa Ziemskiego. Niestety dziewięć ostatnich porażek na korzyść Goro, rozmyły wiarę o ocalenie tej pięknej krainy jaką jest Ziemia. Zdeterminowany Raiden by zapobiec wizji jaką wysłał mu jego imiennik z przyszłości, próbuje zrobić wszystko by nie dopuścić do najgorszego. ",
				130, 120, 2500, 3000);
		Fighter shao_kahn = new Fighter("Shao Kahn", "Pozaświat", "Imperator i władca Zaświatów. Żądza władzy cesarza Shao Kahna równa się jedynie jego bezwzględności. Tysiące lat temu obalił Onagę znanego jako Dragon King, pierwotnego władcę Zaświatów i od tego czasu podbił wiele innych światów. Jednym z ostatnich do podbicia jest Królestwo Ziemskie. Turniej Mortal Kombat uniemożliwia przejęcie świata inwazją - wymaga bowiem 10 zwycięstw armii Imperatora w turnieju. Ziemia będzie pod władaniem Shao Kahna o ile jego czempioni, Shang Tsung oraz książę Goro nie zawiodą go. ",
				120, 130, 3000, 2500);
		Fighter liu_kang = new Fighter("Liu Kang", "Królestwo Ziemi", "Liu Kang został osierocony w bardzo młodym wieku, jest uduchowionym mnichem z klasztoru Shaolin. Prezentuje doskonałe zgranie wszystkich swoich umiejętności. Kang jest chyba najbardziej wszechstronnym zawodnikiem. Jego potencjał zauważył opiekun Królestwa Ziemskiego, Raiden widząc w nim przyszłego obrońcę ziemian w turnieju Mortal Kombat. Raiden wysłał młodego mnicha na szkolenie do mistrza Bo' Rai Cho. Po ciężkich treningach Liu Kang pokonał wszystkich przeciwników i zdobył wielki zaszczyt reprezentowania klasztoru Shaolin w turnieju Mortal Kombat. Następnie razem z Raiden'em wyruszyli ku przeznaczeniu na wyspę Shang Tsunga, gdzie zostanie rozegrany turniej Mortal Kombat. ",
				150, 100, 2300, 3200);
		Fighter shang_tsung = new Fighter("Shang Tsung", "Pozaświat", "Shang to zdradziecki czarnoksiężnik przywłaszczający dusze pokonanych wojowników. Był gospodarzem ostatnich dziewięciu turniejów Mortal Kombat w Królestwie Ziemskim. Jest wielce oddany dla swego pana Shao Kahna, cesarza Outworld. Shang pochodzi z Ziemi i niegdyś reprezentował Królestwo Ziemskie w Turnieju Mortal Kombat, lecz jego wielka chęć poznania czarnej magii zaprowadziła go do Zaświatów. To tam sprzymierzył się z Imperatorem Outworld i przyrzekł walczyć przy jego boku, za zagłębienie się w czarną magię. Sheng jest wielce oddany Shao Kahnowi wykonując jego polecenia. Jeżeli nie spełni misji jaką jest zdobycie Królestwa Ziemskiego, czeka go wielka kara z rąk cesarza",
				125, 125, 2750, 2750);
		Fighter quan_chi = new Fighter("Quan Chi", "Czeluść", "Netherealm przyniósł wiele podłych istot, lecz żadna nie mogła równać się z magiem Quan Chi. Wykorzystuje demony Netherealm, wskrzesza zmarłych wojowników, aby móc wykorzystać ich w swoich diabelskich planach. Na czele ich stoi Udręczany ninja Shirai Ryu przydomek Scorpion. Który jest jego osobistym assassinem. Quan Chi buduje właśnie z takich upiorów armie. Niewiadomo jeszcze do jakich nikczemnych planów chce ją wykorzystać. Kolejną tajemnica czarnoksiężnika jest udział w turnieju Mortal Kombat w którym wynik turnieju nic nie wniesie dla NetherRealm. Sytuacja ta prowadzi niektórych obserwatorów do rozważań nad obecnością maga w turnieju. ",
				110, 140, 2900, 2600);
		Fighter scorpion = new Fighter("Skorpion", "Królestwo Ziemi, Czeluść", "Hanzo Hasashi był niegdyś członkiem japońskiego klanu ninja Shirai Ryu. Przybrał imię Scorpion ze względu na swoją szybką, zabójczą umiejętność walk. Jego życie było obdarzone wspaniałą walką w imię jego Wielkiego Mistrza. Lecz gdy jego rodzina oraz klan został brutalnie wyrżnięty przez Sub-Zero i członków Lin Kuei, bytowanie Scorpiona stało się wieczną torturą. Wskrzeszony przez złowrogiego czarnoksiężnika Quan Chi, przystąpił do turnieju Mortal Kombat, by pomścić swoich bliskich zabitych przez Sub-Zero.",
				140, 110, 2600, 2900);
		Fighter johnny_cage = new Fighter("Johnny Cage", "Królestwo Ziemi", "Nie ma większej gwiazdy sztuk walki niż Johnny Cage. Filmy takie jak Dragon Fist, Time Smashers, Citizen Cage uczyniły z niego jednego z najbardziej opłacanych aktorów w Hollywood. Ale w Johnnym jest coś więcej, coś czego sam nie wie. Cage jest potomkiem starożytnego śródziemnomorskiego kultu Morza, z którego wywodzili się wojownicy dla starszych bogów. Posiadali moce wykraczające poza możliwości śmiertelników. Cage odziedziczył niektóre z tych umiejętności, które pomogły mu zostać gwiazdą filmową, próżnym aktorem zapatrzonym w siebie. To pomoże mu w nadchodzącej bitwie.",
				115, 135, 2800, 2700);
		Fighter mileena = new Fighter("Mileena", "Pozaświat", "Shang Tsung stworzył wiele obrzydliwych stworów, w grotach z ciałami (Pits Flesh), ale nigdy kogoś tak pozbawionego uczuć jak Mileena. Połączenie Edeńskiego ciała i Tarkatańskiej krwi czyni ją piękną i bestią, dwoistość jej osobowości czyni ją niezróważoną psychicznie, jest podatna na ataki dzikości i okrucieństwa. Pomimo pięknego wyglądu kobiety, w duszy jest dzieckiem. Wiernie podporządkowana swemu panu. Pozbawiona sumienia i współczucia. Zabije każdego by tylko zadowolić swego ojca. ",
				160, 90, 2750, 2750);

		raiden.printInfo();
		shao_kahn.printInfo();
		liu_kang.printInfo();
		shang_tsung.printInfo();
		quan_chi.printInfo();
		scorpion.printInfo();
		johnny_cage.printInfo();
		mileena.printInfo();


	}
}

Ostatnia klasa, gdzie mamy konstruktor fighter - Fighter.java

package data;

public class Fighter {
	private String name;
	private String realm;
	private String description;
	private int attack;
	private int defence;
	private int hp;
	private int power;

	 public String getName() {
	        return name;
	    }

	 public void setName(String name) {
	        this.name = name;
	    }

	    public String getRealm() {
	        return realm;
	    }

	    public void setRealm(String realm) {
	        this.realm = realm;
	    }

	    public String getDescription() {
	        return description;
	    }

	    public void setDescription(String description) {
	        this.description = description;
	    }

	    public int getAttack() {
	        return attack;
	    }

	    public void setAttack(int attack) {
	        this.attack = attack;
	    }

	    public int getDefence() {
	        return defence;
	    }

	    public void setDefence(int defence) {
	        this.defence = defence;
	    }

	    public int getHp() {
	        return hp;
	    }

	    public void setHp(int hp) {
	        this.hp = hp;
	    }

	    public int getPower() {
	        return power;
	    }

	    public void setPower(int power) {
	        this.power = power;
	    }


	 Fighter(String name, String realm, String description, int attack, int defence, int hp, int power) {
		    this.name = name;
	        this.realm = realm;
	        this.attack = attack;
	        this.defence = defence;
	        this.description = description;
	        this.hp = hp;
	        this.power = power;
	    }

	    void printInfo() {
	    	System.out.println("Nazwa wojownika: " + name);
			System.out.println("Kraina, którą reprezentuje: " + realm);
			System.out.println("Opis: " + description);
			System.out.println("Atak: " + attack);
			System.out.println("Obrona: " + defence);
			System.out.println("Punkty Życia: " + hp);
			System.out.println("Punkty Mocy: " + power);;
	    }
}

Jeśli jeszcze macie jakieś sugestie co do kodu to śmiało piszcie, dopiero się uczę

0

a jakiego IDE używasz? Wkleiłeś wszystko czy tylko kawałki?

0

Używam Eclipse (instalowałem go jakieś pół roku temu, wkleiłem wszystko co mam w projekcie.

I np. jak tam mam raiden.printInfo() (chodzi o to w klasie Game.java); to mi pokazuje "raiden cannot be resolved", tak jakby nie mógł odczytać z tamtej klasy (Encyclopedia.java) informacji o Raidenie.

0

To co tu zrobiłeś w ogóle nie ma sensu. To oczywiste że klasa Game nie wie o LOKALNYCH obiektach metody main z klasy Encyklopedia, bo niby czemu miałaby cokolwiek o nich wiedzieć? Zresztą one "żyją" tylko w trakcie wykonania tej metody a potem giną.
Zalecam zacząć od czegoś mniejszego niż próba pisania gry, bo póki co w zasadzie nie masz pojęcia co robisz.

0

A ty jakbyś to zrobił użytkowniku Shalom, bo widzę, że jesteś moderatorem, więc pewnie dobrze ogarniasz temat. Proszę powiedz, taka nauka mi się przyda lub chociaż wskaż, gdzie mógłbym o tym znaleźć informację.

Te całe przykłady z książki są nudne, tak to trzeba samemu kombinować i myśleć.

A co do tych kolorów to po prostu w znaczniki tu wkleiłem kod.- tak to zrobiłem jak z tematu Zasady pisania tematów nie wiem czemu się tak zrobiło

1

Ale tu trudno coś poradzić bo wszystko jest źle. Po prostu nie rozumiesz czym są zakresy widocznosci i czas życia zmiennych a to są podstawy podstaw. Mógłbyś na przykład z tej metody w klasie Encyklopedia (tylko zmień nazwą z main na coś sensownego) zwrócić List<Fighter> i wtedy tą metodę możesz wywołać u siebie w klasie Game i pobrać tą listę i potem wyświetlać informacje z listy:

class Encyclopedia{
    public static List<Fighter> createFighters(){
        List<Fighter> list = new ArrayList<>();
        Fighter raiden = new Fighter(// bla bla bla
        list.add(raiden);
        // itd
        return list;
    }
}
public class Game {
    public static void main(String[] args) {
        List<Fighter> fighters = Encyclopedia.createFighters();
        Scanner input = new Scanner(System.in);
 
        int number;
 
        System.out.println("Wybierz zawodnika:");
        System.out.println("1. Raiden");
        System.out.println("2. Shao Kahn");
        System.out.println("3. Liu Kang");
        System.out.println("4. Shang Tsung");
        System.out.println("5. Quan Chi");
        System.out.println("6. Scorpion");
        System.out.println("7. Johnny Cage");
        System.out.println("8. Mileena");
        number = input.nextInt();
 
        switch (number) {
        case 1:
            System.out.println("Wybrałeś Raidena");
            fighters.get(number-1).printInfo();
            break;
//
1

Próbujesz odnieść się do metod i zmiennych które znajdują się w innych klasach i metodach tej klasy. Jest kilka sposobów aby wpłynąć z klasy x na klase y. 1 rozszerzyć klasę, daję Ci to dostęp do metod, obiektów zmiennych itd. tych klas(w twoim przypadku to również nie wystarczy bo próbujesz wydobyć dane z lokalnej zmiennej metody). Sposób drugi to napisanie metody która zwróci Ci daną zmienną z danej klasy.

1.Przykład rozszerzenia klasy

Przykład bez rozszerzenia:

public class X{
        public String nazwaklasy0="X";
        public static void main(String args[]){
        System.out.println("To jest klasa "+nazwaklasy0);
}
}
public class Y{
        public String nazwaklasy1="Y";
        public static void main(String args[]){
        System.out.println("To jest klasa "+nazwaklasy1);
}
}

Przykład z rozszerzeniem:

public class X extends Y{
        public String nazwaklasy0="X";
        public static void main(String args[]){
        System.out.println("To jest klasa "+nazwaklasy0);
        System.out.println("Tutaj po rozszerzeniu mogę wypisać zmienna z innej klasy "+nazwaklasy1)
}
}
public class Y{
        public String nazwaklasy1="Y";
        public static void main(String args[]){
        System.out.println("To jest klasa "+nazwaklasy1);
}
}
  1. Przykład z pisaniem odpowiednich metod zwanych seterami i geterami:

Przyklad bez geterów:

public class X{
        public String nazwaklasy0="X";
        public static void main(String args[]){
            System.out.println("To jest klasa "+nazwaklasy0);
        }
    }
    public class Y{
        public String nazwaklasy1="Y";
        public static void wypiszNazweZmiennej{
            System.out.println("To jest klasa "+nazwaklasy1);
        }
    }

Przykład z geterami:

public class X{
        public String nazwaklasy0="X";
        public static void main(String args[]){
            Y y = new Y();
            System.out.println("To jest klasa "+nazwaklasy0);
            System.out.println("To jest nazwa drugiej klasy"+getNazwaKlasy1)
        }
    }
    public class Y{
        public String nazwaklasy1="Y";
        public static void wypiszNazweZmiennej{
            System.out.println("To jest klasa "+nazwaklasy1);
        }
        public String getNazwaKlasy1(){
            return nazwaklasy1;
        }
    }
2

Wersja z założeniem minimalnej liczby zmian:

W klasie Encyclopedia:

  1. przed:
public static void main(String[] args){

dodaj:

static Fighter raiden;
  1. w:
public static void main(String[] args){

zamień:

Fighter raiden = new Fighter(...);

na:

raiden = new Fighter(
  1. W metodzie Game.main zamień:
raiden.printInfo();

na:

Encyclopedia.raiden.printInfo();

Zrób to adekwatnie dla reszty fighterów.
Nie będzie to ładne, ale powinno działać.
Potem możesz to dodać tutaj do review żeby ktoś Ci powiedział jak to upiększać.

0

Super, dzięki za odpowiedź, jesteście super. Pozmieniam dziś wieczorem i wstawie.

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