Prośba o wskazówkę do zadania Java.RuszGłową. Rozdział 6

0

Witam serdecznie.

Dwa zdania wstępu:
Jestem nowy na forum więc proszę o wyrozumiałość(i oczywiście info. co źle opisałem,poprawię) jeśli w jakiś sposób błędnie opiszę temat(jest otagowany i mam nadzieję poprawnie wstawiony między znaczniki).
Dopiero zaczynam naukę programowania i Javy, korzystam z książki "Java. Rusz Głową" i z tej ksiązki pochodzi zadanie z którym mam kłopot, dla porządku: Rozdział 6, zadanie: PortalGraMax(gra w statki) , str.178.

import java.util.ArrayList;

public class PortalGraMax {
	private PomocnikGry pomocnik = new PomocnikGry();
	private ArrayList<Portal> listaPortali = new ArrayList<Portal>();
	private int ilośćRuchów = 0;

	private void przygotujGrę() {
		Portal pierwszy = new Portal();
		pierwszy.setNazwa("onet.pl");
		Portal drugi = new Portal();
		drugi.setNazwa("wp.com");
		Portal trzeci = new Portal();
		trzeci.setNazwa("Go.com");
		listaPortali.add(pierwszy);
		listaPortali.add(drugi);
		listaPortali.add(trzeci);

		System.out.println("Twoim celem jest zatopienie trzech portali.");
		System.out.println("onet.pl, wp.com, Go2.com");
		System.out.println(
				"Postaraj się zatopić je w jak najmniejszej ilości ruchów.");

		for (Portal rozmieszczanyPortal : listaPortali) {
			ArrayList<String> nowePołożenie = pomocnik.rozmieśćPortal(3);//********************
			rozmieszczanyPortal.setPolaPołożenia(nowePołożenie);
		}
	}

	private void rozpocznijGrę() {
		while (!listaPortali.isEmpty()) {
			String ruchGracza = pomocnik.pobierzDaneWejściowe("Podaj pole:");
			sprawdzRuchGracza(ruchGracza);
		}
		zakończGrę();
	}

	private void sprawdzRuchGracza(String ruch) {
		ilośćRuchów++;
		String wynik = "pudło";

		for (Portal portalDoSprawdzenia : listaPortali) {
			wynik = portalDoSprawdzenia.sprawdz(ruch);
			if (wynik.equals("trafiony")) {
				break;
			}
			if (wynik.equals("zatopiony")) {
				listaPortali.remove(portalDoSprawdzenia);
				break;
			}
		}
		System.out.println(wynik);
	}

	private void zakończGrę() {
		System.out.println("Wszystkie portale zostały zatopione");
		if (ilośćRuchów <= 18) {
			System.out.println("Wykonaleś jedynie " + ilośćRuchów);
		} else {
			System.out.println("ale się grzebałeś");
		}
	}

	public static void main(String[] args) {
		PortalGraMax gra = new PortalGraMax();
		gra.przygotujGrę(); //*****************************************
		gra.rozpocznijGrę();
	}
}

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class PomocnikGry {
	private static final String alfabet = "abcdefg";
	private int długośćPlanszy = 7;
	private int wielkośćPlanszy = 49;
	private int[] plansza = new int[wielkośćPlanszy];
	private int ilośćPortali = 0;

	public String pobierzDaneWejściowe(String komunikat) {
		String daneWejściowe = null;
		System.out.println(komunikat + " ");
		try {
			BufferedReader sw = new BufferedReader(
					new InputStreamReader(System.in));
			daneWejściowe = sw.readLine();
			if (daneWejściowe.length() == 0)
				return null;
		} catch (IOException e) {
			System.out.println("IOException: " + e);
		}
		return daneWejściowe.toLowerCase();
	}

	public ArrayList rozmieśćPortal(int wielkośćPortalu) {
		ArrayList<String> zajętePola = new ArrayList<String>();
		String[] współrzędneLnc = new String[wielkośćPortalu];
		String pomoc = null;
		int[] współrzędne = new int[wielkośćPortalu];
		int prób = 0;
		boolean powodzenie = false;
		int położenie = 0;

		ilośćPortali++;
		int inkr = 1;
		if ((ilośćPortali % 2) == 1) {
			inkr = długośćPlanszy;
		}

		while (!powodzenie & prób++ < 200) {
			położenie = (int) (Math.random() * wielkośćPlanszy);
			// System.out.println(" sprawdz" + połozenie);
			int x = 0;
			powodzenie = true;
			while (powodzenie && x < wielkośćPortalu) {
				if (plansza[położenie] == 0) {
					współrzędne[x++] = położenie;
					położenie += inkr;
					if (położenie >= wielkośćPlanszy) {
						powodzenie = false;
					}
					if (x > 0 & położenie % długośćPlanszy == 0) {
						powodzenie = false;
					} else {
						// System.out.println(" już zajęte " + location);
					}

				}
			}
			int y = 0;
			int wiersz = 0;
			int kolumna = 0;
			while (x < wielkośćPortalu) {
				plansza[współrzędne[y]] = 1; //**********************************
				wiersz = (int) (współrzędne[y] / długośćPlanszy);
				kolumna = współrzędne[y] % długośćPlanszy;
				pomoc = String.valueOf(alfabet.charAt(kolumna));
				zajętePola.add(pomoc.concat(Integer.toString(wiersz)));
				y++;

			}

		}
		return zajętePola;
	}
}

import java.util.ArrayList;

public class Portal {

	private ArrayList<String> polaPołożenia;
	private String nazwa;

	public void setPolaPołożenia(ArrayList<String> ppol) {
		polaPołożenia = ppol;
	}

	public void setNazwa(String nzwPortalu) {
		nazwa = nzwPortalu;
	}

	public void sprawdz(String ruch) {

		String wynik = "pudło";

		int index = polaPołożenia.indexOf(ruch);

		if (index >= 0) {
			polaPołożenia.remove(index);

			if (polaPołożenia.isEmpty()) {
				wynik = "zatopiony";
				System.out.println("Auć,zatopiłeś portal: " + nazwa + " : ( ");
			} else {
				wynik = "trafiony";
			}
		}
	}
}

Błędy które zwraca Eclipse:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at PomocnikGry.rozmieśćPortal(PomocnikGry.java:81)
	at PortalGraMax.przygotujGrę(PortalGraMax.java:27)
	at PortalGraMax.main(PortalGraMax.java:80)
0

Ok. po sformatowaniu kodu, zmieniły się linie kodu, aktualne to(przepraszam za niedopatrzenie):

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
	at PomocnikGry.rozmieśćPortal(PomocnikGry.java:67)
-- czyli 
	plansza[współrzędne[y]] = 1;

	at PortalGraMax.przygotujGrę(PortalGraMax.java:25)
			ArrayList<String> nowePołożenie = pomocnik.rozmieśćPortal(3);

	at PortalGraMax.main(PortalGraMax.java:66)
           gra.przygotujGrę();

Fragmenty zaraz zaznaczę w kodzie poprzez dodanie //************** - w linii kodu.

4

Zatem błąd leci w momencie:

plansza[współrzędne[y]] = 1; 

Prawdopodobna przyczyna:

współrzędne[y] jest >= 49

Generalnie nie chce mi się ogarniać logiki, bo kod jest średnio czytelny (warto byś go trochę ładniej napisał). Możesz debugerem jeszcze zweryfikować dlaczego tka sie dzieje.

1
            while (x < wielkośćPortalu) {
                plansza[współrzędne[y]] = 1;
                ...

Nie powinno być

            while (y < wielkośćPortalu) {
                plansza[współrzędne[y]] = 1;

Nie używaj polskich liter w nazwach zmiennych i metod.

0

Generalnie kod nieco poprawiłem, dzięki waszym spostrzeżeniom, ale nadal nie działa poprawnie.
Na ten moment zostawiam temat powyższego kodu, wrócę do niego gdy będę mógł lepiej pojąć logikę klasy PomocnikGry.
Dzięki za wskazówki.

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