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)