Head First JAVA: 06. Chapter - Kamil-Jankowski/Learning-JAVA GitHub Wiki

Head First JAVA: 6. Chapter

Statki:

import java.util.ArrayList;

public class PortalGraMax {

    private PomocnikGry pomocnik = new PomocnikGry();
    private ArrayList<Portal> listaPortali = new ArrayList<>();
    private int iloscRuchow = 0;

    public static void main(String[] args) {
        PortalGraMax gra = new PortalGraMax();
        gra.przygotujGre();
        gra.rozpocznijGre();
    }

    private void przygotujGre(){
        Portal pierwszy = new Portal();
        pierwszy.setNazwa("hmsEndeavour");
        Portal drugi = new Portal();
        drugi.setNazwa("queenAnnesRevenge");
        Portal trzeci = new Portal();
        trzeci.setNazwa("flyingDutchman");
        listaPortali.add(pierwszy);
        listaPortali.add(drugi);
        listaPortali.add(trzeci);

        System.out.println("Twoim celem jest zatopienie trzech okretow:");
        System.out.println("HMS Endeavour, Queen Anne's Revenge oraz Flying Dutchman");
        System.out.println("Postaraj się zatopić je w jak najmniejszej ilości ruchów.");

        for (Portal rozmieszczonyPortal : listaPortali){
            ArrayList nowePolozenie = pomocnik.rozmiescPortal(3);
            rozmieszczonyPortal.setPolaPolozenia(nowePolozenie);
        }
    }

    private void rozpocznijGre(){
        while (!listaPortali.isEmpty()){
            String ruchGracza = pomocnik.pobierzDaneWejsciowe("Podaj pole:");
            sprawdzRuchGracza(ruchGracza);
        }
        zakonczGre();
    }

    private void sprawdzRuchGracza(String ruch){
        iloscRuchow++;
        String wynik = "Pudło!";
        for (Portal portalDoSprawdzenia : listaPortali){
            wynik = portalDoSprawdzenia.sprawdz(ruch);
            if (wynik.equals("Trafiony!")){
                break;
            }
            if (wynik.equals("Trafiony zatopiony!")){
                listaPortali.remove(portalDoSprawdzenia);
                break;
            }
        }
        System.out.println(wynik);
    }

    private void zakonczGre(){
        System.out.println("Dałeś radę zatopić wszystkie okręty nieprzyjaciół");
        if (iloscRuchow <= 18){
            System.out.println("GRATULACJE!");
            System.out.println("Wykonałeś jedynie: " + iloscRuchow + " ruchów");
        } else {
            System.out.println("ale mógłbyś się trochę ogarnąć i zrobić to sprawniej.");
            System.out.println("Wykonałeś aż: " + iloscRuchow + " ruchów");
        }
    }

}
import java.io.*;
import java.util.*;

public class PomocnikGry {
    private static final String alfabet = "abcdefg";
    private int dlugoscPlanszy = 7;
    private int wielkoscPlanszy = 49;
    private int [] plansza = new int[wielkoscPlanszy];
    private int iloscPortali = 0;

    public String pobierzDaneWejsciowe(String komunikat) {
        String daneWejsciowe = null;
        System.out.print(komunikat + "  ");
        try {
            BufferedReader is = new BufferedReader(new InputStreamReader(System.in));
            daneWejsciowe = is.readLine();
            if (daneWejsciowe.length() == 0 )  return null;
        } catch (IOException e) {
            System.out.println("IOException: " + e);
        }
        return daneWejsciowe.toLowerCase();
    }

    public ArrayList rozmiescPortal(int wielkoscPortalu) {
        ArrayList<String> zajetePola = new ArrayList<String>();
        String [] wspolrzedneLnc = new String [wielkoscPortalu];    // zawiera współrzędne zapisane jako 'f6'
        String pomoc = null;                                        // pomocniczy łańcuch znaków
        int [] wspolrzedne = new int[wielkoscPortalu];              // bieżące proponowane współrzędne
        int prob = 0;                                               // licznik ilości prób
        boolean powodzenie = false;                                 // flaga = czy znaleziono dobre miejsce
        int polozenie = 0;                                          // bieżące miejsce początkowe

        iloscPortali++;                                             // n-ty portal do rozmieszczenia
        int inkr = 1;                                               // określenie przyrostu w poziomie
        if ((iloscPortali % 2) == 1) {                              // jeśli nieparzysty portal (rozmieszczany w pionie)
            inkr = dlugoscPlanszy;                                  // określenie przyrostu w pionie
        }

        while (!powodzenie & prob++ < 200 ) {                       // główna pętla poszukiwania
            polozenie = (int) (Math.random() * wielkoscPlanszy);    // wybór losowego punktu początkowego
            //System.out.print(" sprawdź " + location);
            int x = 0;                                              // n-ty fragment rozmieszczanego portalu
            powodzenie = true;                                      // zakładamy, że się udało
            while (powodzenie && x < wielkoscPortalu) {             // szukamy sąsiadujących pustych pól planszy
                if (plansza[polozenie] == 0) {                      // jeśli jeszcze nie zajęte
                    wspolrzedne[x++] = polozenie;                   // zapisujemy miejsce
                    polozenie += inkr;                              // sprawdzamy 'następne' sąsiadujące pole
                    if (polozenie >= wielkoscPlanszy){              // poza zakresem - 'dół' planszy
                        powodzenie = false;                         // niepowodzenie
                    }
                    if (x>0 & (polozenie % dlugoscPlanszy == 0)) {  // poza zakresem - prawa krawędź planszy
                        powodzenie = false;                         // niepowodzenie
                    }
                } else {                                            // znalezione pole już jest zajęte
                    // System.out.print(" już zajęte " + location);
                    powodzenie = false;                             // niepowodzenie
                }
            }
        }                                                           // koniec while

        int x = 0;                                                  // zamieniamy na współrzędne
        int wiersz = 0;
        int kolumna = 0;
        while (x < wielkoscPortalu) {
            plansza[wspolrzedne[x]] = 1;                            // zaznaczamy pole planszy jako zajęte
            wiersz = (int) (wspolrzedne[x] / dlugoscPlanszy);       // określenie wiersza
            kolumna = wspolrzedne[x] % dlugoscPlanszy;              // pobranie liczby określającej kolumnę
            pomoc = String.valueOf(alfabet.charAt(kolumna));        // konwersja do postaci alfanumerycznej

            zajetePola.add(pomoc.concat(Integer.toString(wiersz)));
            x++;
            // System.out.print(" współrzędne "+x+" = "+zajetePola.get(x-1));
        }
        //System.out.println("\n");

        return zajetePola;
    }
}
import java.util.ArrayList;

public class Portal {

    private ArrayList<String> polaPolozenia;
    private String nazwa;

    public void setPolaPolozenia(ArrayList<String> ppol) {
        polaPolozenia = ppol;
    }

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

    public String sprawdz(String ruch) {

        String wynik = "Pudło!";

        int indeks = polaPolozenia.indexOf(ruch);       // Sprawdzamy, czy pole wskazane przez gracza znajduje się w tablicy ArrayList.
                                                        // W tym celu prosimy o podanie indeksu pola. Jeśli pola nie będzie, to metoda indexOf() zwróci wartość -1.

        if (indeks >= 0) {
            polaPolozenia.remove(indeks);

            if (polaPolozenia.isEmpty()) {
                wynik = "Trafiony zatopiony!";
                System.out.println("Tak jest! Zatopiłeś: " + nazwa + " :) ");
            } else {
                wynik = "Trafiony!";
            }
        }
        return wynik;
    }
}

⚠️ **GitHub.com Fallback** ⚠️