walka żołnierzy

 import java.util.Scanner;
import java.util.Random;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

class Soldier {
    private String klasa;
    private int pz;
    int attackMin;
    int attackMax;
    private int defense;
    private int range;
    int criticChange;
    int blockChange;
    boolean alive;
    Random random = new Random();

//konstruktor obiektów klasy Soldier
    public Soldier(String klasa, int pz, int attackMin, int attackMax, int defense, int range, int criticChange, int blockChange, boolean alive) {
        this.klasa = klasa;
        this.pz = pz;
        this.attackMin = attackMin;
        this.attackMax = attackMax;
        this.defense = defense;
        this.range = range;
        this.criticChange = criticChange;
        this.blockChange = blockChange;
        this.alive = alive;
    }

// seter pozwalający zmienić Pz w trakcie walk
    public void setPz(int pz) {
        this.pz = pz;
    }

//seter pozwalający zmienic żyjącego żołnierza w martwego gdy ginie
    void setAlive(boolean alive) {
        this.alive = alive;
    }

//pełen zestaw seterów umożliwiający zmianę każdego parametru obiektu
    void setAtrybut(String klasa, int pz, int attackMin, int attackMax, int defense, int range, int criticChange, int blockChange, boolean alive) {
        this.klasa = klasa;
        this.pz = pz;
        this.attackMin = attackMin;
        this.attackMax = attackMax;
        this.defense = defense;
        this.range = range;
        this.criticChange = criticChange;
        this.blockChange = blockChange;
        this.alive = alive;
    }

// gettery zwracające informacje odnośnie parametrów obiektów klasy soldier
    public String getKlasa() {
        return klasa;
    }

    public int getPz() {
        return pz;
    }

    public int getAttackMin() {
        return attackMin;
    }

    public int getAttackMax() {
        return attackMax;
    }

    public int getDefense() {
        return defense;
    }

    public int getRange() {
        return range;
    }

    public int getCriticChange() {
        return criticChange;
    }

    public int getBlockChange() {
        return blockChange;
    }

    public boolean getAlive() {
        return alive;
    }

    //metoda która ustala jak silny atak żołnierz przeprowadzi po kolei jest to tak że mamy pewne prawdopodobieństwo że przeciwnik zablokuje cios i jeśli to zrobi wyświetli się informacja o tym i metoda się kończy, jeśli przeciwnik nie zablokuje ciosu wtedy tworzymy listę wszystkich możliwych wartości ataku mieszczących się pomiędzy wartościami minimalnego i maksymalnego ataku (włącznie z nimi) następnie używamy metody shuffle do losowego ustawienia kolejności tych wartości i wybieramy pierwszy z nich, mamy też prawdopodobieństwo krytycznego ataku i jeśli tak się zdarzy to potrajamy wartość ataku żołnierza, następnie od wartości ataku który nam wyszedl odejmujemy wartość obrony przeciwnika i o tyle odejmujemy jego PZ. wyświetlamy informacje o tym kto kogo zaatakował i ile obrażeń mu zadał i jeśli wartość PZ przeciwnika spada do 0 lub poniżej wtedy pojawia się informacja że żołnierz zabił przeciwnika i ustalane są jego parametry na imiezbity wszystkie wartości na 0 i alive na false czyli że nie żyje
    public void attack(Soldier enemy) {
        int ifblock = random.nextInt(101);
        int changeBlockSoldier = enemy.getBlockChange();
        if (ifblock < changeBlockSoldier) {
            System.out.println(enemy.getKlasa() + " zablokował cios " + klasa + "a");
            System.out.println(enemy.getKlasa() + "owi pozostało " + enemy.getPz() + " PZ");
        } else {
            ArrayList <Integer> attackSoldier = new ArrayList<>();
            for (int i = attackMin; i <= attackMax; i++) {
                attackSoldier.add(i);
            }
            Collections.shuffle(attackSoldier);
            int ifcritic = random.nextInt(101);
            int currentAttack;
            int criticChangeSoldier = criticChange;
            if (ifcritic <= criticChangeSoldier) {
                System.out.println("CIOS KRYTYCZNY!");
                currentAttack = attackSoldier.get(0) * 3 - enemy.getDefense();
            } else {
                currentAttack = attackSoldier.get(0) - enemy.getDefense();
            }
            System.out.println("atak wynosi " + attackSoldier.get(0));
            System.out.println(klasa + " atakuje " + enemy.getKlasa() + "a i zadaje mu " + currentAttack + " obrażeń");
            if ((enemy.getPz() - currentAttack > enemy.getPz())) {
                enemy.setPz(enemy.getPz());
            } else {
                enemy.setPz(enemy.getPz() - currentAttack);
            }
            System.out.println(enemy.getKlasa() + "owi pozostało " + enemy.getPz() + " PZ");
        }
        if (enemy.getPz() < 1) {
            System.out.println(klasa + " zabił " + enemy.getKlasa() + "a");
            enemy.setAtrybut(enemy.getKlasa() + ": zabity", 0, 0, 0, 0, 0, 0, 0, false);
        }
    }// koniec metody attack

    @Override
    public String toString() {
        if (pz > 0) {
            return (klasa + "H" + pz + "A" + attackMin + "-" + attackMax + "D" + defense + "R" + range);
        } else {
            return (klasa + " 0 , 0 , 0");
        }
    }

    public static Soldier createSoldier(int numer) {
        switch (numer) {
        case 1:
            return new Piechur();
        case 2:
            return new Pikinier();
        case 3:
            return new Calvary();
        case 4:
            return new Czarownik();
        case 5:
            return new Lucznik();
        case 6:
            return new Lowca();
        default:
            return null;
        }
    } // koniec metody Createsoldier

} // koniec klasy Soldier

//pierwsza klasa żołnierza to piechur który zawsze będzie miał te same parametry na początku każdej walki
class Piechur extends Soldier {
    public Piechur() {
        super("Piechur", 600, 40, 60, 5, 1, 5, 10, true);
    }
} // koniec klasy Piechur

// druga klasa żołnierza konik
class Calvary extends Soldier {
    public Calvary() {
        super("Konik", 800, 50, 80, 8, 1, 6, 8, true);
    }
    @Override
    public void attack(Soldier enemy) {
        if (enemy instanceof Pikinier) {
            int originalAttackMin = this.attackMin;
            int originalAttackMax = this.attackMax;
            int originalCriticChange = this.criticChange;

            this.criticChange /= 2;
            this.attackMin /= 2;
            this.attackMax /= 2;
            super.attack(enemy);
            this.criticChange = originalCriticChange;
            this.attackMin = originalAttackMin;
            this.attackMax = originalAttackMax;
        } else {
            super.attack(enemy);
        }
    }
} // koniec klasy Calvary

//trzecia klasa żołnierza pikinier który jest słabszy nieco od piechura ale śmiertelnie groźny dla konika
class Pikinier extends Soldier {
    public Pikinier() {
        // "klasa", PZ, Attack     D R szansa na crytyka i blok
        super("Pikinier", 500, 30, 60, 4, 1, 5, 7, true);
    }

    // nadpisujemy wartość ataku pikiniera przeciw kawalerii tak by zadawał jej ciosy z podwójnym atakiem
    @Override
    public void attack(Soldier enemy) {
        if (enemy instanceof Calvary) {
            int originalAttackMin = this.attackMin;
            int originalAttackMax = this.attackMax;
            int originalCriticChange = this.criticChange;

            this.criticChange *= 2;
            this.attackMin *= 2;
            this.attackMax *= 2;
            super.attack(enemy);
            this.attackMin = originalAttackMin;
            this.attackMax = originalAttackMax;
            this.criticChange = originalCriticChange;
        } else {
            super.attack(enemy);
        }
    }
} // koniec klasy Pikinier

class Lucznik extends Soldier {
    public Lucznik() {
        super("Łucznik", 400, 40, 60, 2, 3, 6, 5, true);
    }
} // koniec klasy Lucznik

class Czarownik extends Soldier {
    public Czarownik() {
        super("Czarownik", 400, 30, 60, 15, 3, 8, 10, true);
    }
    public void dodajAtrybut(Soldier sojusznik) {
        sojusznik.setAtrybut(sojusznik.getKlasa(), sojusznik.getPz() + 10, sojusznik.getAttackMin() + 5, sojusznik.getAttackMax() + 5, sojusznik.getDefense() + 2, sojusznik.getRange(),
                             sojusznik.getCriticChange() + 1, sojusznik.getBlockChange() + 1, sojusznik.getAlive());
        System.out.println("Czarownik dodał " + sojusznik.getKlasa() + "owi atrybuty i teraz jest silniejszy. Oto jego nowe atrybuty: H: " + sojusznik.getPz() + " attackMin-attackMax: " +
                           sojusznik.getAttackMin() + "-" + sojusznik.getAttackMax() + " obrona: " + sojusznik.getDefense() + " zasięg: " + sojusznik.getRange() + " szansa na krytyka: " + sojusznik.getCriticChange() +
                           " szansa na blok: " + sojusznik.getBlockChange());
    }
} // koniec klasy czarownik

class Lowca extends Soldier {
    public Lowca() {
        super("Łowca", 350, 60, 90, 2, 3, 10, 2, true);
    }
} // koniec klasy Łowca

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();
        // stworzone obiekty wszystkich klas
        Pikinier pikinier = new Pikinier();
        Piechur piechur = new Piechur();
        Calvary konik = new Calvary();
        Czarownik czarownik = new Czarownik();
        Lucznik lucznik = new Lucznik();
        Lowca lowca = new Lowca();
        ArrayList <Soldier> zolnierze  = new ArrayList <Soldier> (Arrays.asList(piechur, pikinier, konik, czarownik, lucznik, lowca));

        // wyświetlamy informacje o atrybutach każdego typu zolnierzy
        System.out.println("Oto wszystkie klasy żołnierzy wraz z ich atrybutami: klasa(H pz, A min atak-max atak, D obrona, R zasieg, SA szansa na krytyka, SB szansa na blok");
        for (Soldier zolnierz : zolnierze) {
            System.out.println(zolnierz + ", SA" + zolnierz.getCriticChange() + ", SB" + zolnierz.getBlockChange() + ")");
        }
        System.out.println();
        System.out.println("Ważne informacje odnośnie Konika i Pikiniera: pikinier atakuje konika z podwójnym atakiem i ma 2 razy większe szanse na atak krytyczny niż gdy atakuje inny cel, natomiast konik atakuje z 2 razy mniejsza siła i ma 2 razy mniejsza szansę na krytyczne obrażenia gdy atakuje pikiniera niż kogoś innego");
        System.out.println();
        System.out.println("Ważne informacje odnośnie Czarownika: może on zaatakować przeciwnika lub wzmocnić sojusznika dodając mu +10 PZ, +5 do ataku, +5 do obrony, +1 do szansy na atak krytyczny i blok ");
        System.out.println();
        //listy przechowujące obiekty żołnierzy gracza pierwszej i drugiej lini
        ArrayList <Soldier> playerSoldierLine1 = new ArrayList <>();
        ArrayList <Soldier> playerSoldierLine2 = new ArrayList<>();
        //listy przechowujące obiekty żołnierzy bota pierwszej i drugiej lini
        ArrayList <Soldier> botSoldierLine1 = new ArrayList<>();
        ArrayList <Soldier> botSoldierLine2 = new ArrayList<>();

        System.out.println();
        System.out.println("Oto pole walki, u góry będą żołnierze bota, a na dole są twoi żołnierze, 3 typy żołnierzy może atakować tylko pierwszą linię wroga a pozostałe 3 mogą atakować dowolny cel");
        System.out.println("To linia bota");
        //wyświetlamy schemat planszy gdzie jest pokazane jak żołnierze będą ułożeni i mamy info gdzie jest linia bota a gdzie nasza linia
        System.out.println();
        System.out.println("              4[ numer cztery ]      5[  numer pięć  ]");
        System.out.println("1[   numer jeden   ] 2[    numer dwa   ] 3[  numer trzy   ]");
        System.out.println();
        System.out.println("to Twoja linia");
        System.out.println();
        System.out.println("1[   numer jeden   ] 2[    numer dwa   ] 3[  numer trzy   ]");
        System.out.println("              4[ numer cztery ]      5[  numer pięć  ]");

//podajemy klasę żołnierza pierwszego i umieszczamy na polu walki
        System.out.println("");
        System.out.println("Podaj teraz klasę żołnierza którego chcesz umieścić na pierwszym miejscu. masz do wyboru 1.piechur, 2.pikinier, 3.konik, 4.czarownik, 5.lucznik, 6.lowca. Wpisz odpowiednią liczbę");
        int soldier1 = scanner.nextInt();
        while (soldier1 == 0 || soldier1 > 6 || soldier1 < 1) {
            System.out.println("Podałeś zła wartość, spróbuj ponownie");
            soldier1 = scanner.nextInt();
        }
        Soldier playerSoldier1 = Soldier.createSoldier(soldier1);
        playerSoldierLine1.add(playerSoldier1);
        System.out.println();
        System.out.println("1[" + playerSoldier1 + "] 2[    numer dwa   ] 3[  numer trzy   ]");
        System.out.println("              4[ numer cztery ]      5[  numer pięć  ]");

        // teraz żołnierz numer 2
        System.out.println("");
        System.out.println("Podaj teraz klasę żołnierza którego chcesz umieścić na drugim miejscu. masz do wyboru 1.piechur, 2.pikinier, 3.konik, 4.czarownik, 5.lucznik, 6.lowca. Wpisz odpowiednią liczbę");
        int soldier2 = scanner.nextInt();
        while (soldier2 == 0 || soldier2 > 6 || soldier2 < 1) {
            System.out.println("Podałeś zła wartość, spróbuj ponownie");
            soldier2 = scanner.nextInt();
        }
        Soldier playerSoldier2 = Soldier.createSoldier(soldier2);
        playerSoldierLine1.add(playerSoldier2);
        System.out.println();
        System.out.println("1[" + playerSoldier1 + "] 2["    + playerSoldier2 + "] 3[  numer trzy   ]");
        System.out.println("              4[ numer cztery ]      5[  numer pięć  ]");

        // teraz żołnierz 3
        System.out.println("");
        System.out.println("Podaj teraz klasę żołnierza którego chcesz umieścić na trzecim miejscu. masz do wyboru 1.piechur, 2.pikinier, 3.konik, 4.czarownik, 5.lucznik, 6.lowca. Wpisz odpowiednią liczbę");
        int soldier3 = scanner.nextInt();
        while (soldier3 == 0 || soldier3 > 6 || soldier3 < 1) {
            System.out.println("Podałeś zła wartość, spróbuj ponownie");
            soldier3 = scanner.nextInt();
        }
        Soldier playerSoldier3 = Soldier.createSoldier(soldier3);
        playerSoldierLine1.add(playerSoldier3);
        System.out.println();
        System.out.println("1[" + playerSoldier1 + "] 2["    + playerSoldier2 + "] 3[" + playerSoldier3 + "]");
        System.out.println("              4[ numer cztery ]      5[  numer pięć  ]");

        // teraz żołnierz 4
        System.out.println("");
        System.out.println("Podaj teraz klasę żołnierza którego chcesz umieścić na czwartym miejscu. masz do wyboru 1.piechur, 2.pikinier, 3.konik, 4.czarownik, 5.lucznik, 6.lowca. Wpisz odpowiednią liczbę, tylko pamiętaj że pierwsze 3 klasy nie będą mogły odrazu atakowac");
        int soldier4 = scanner.nextInt();
        while (soldier4 == 0 || soldier4 > 6 || soldier4 < 1) {
            System.out.println("Podałeś zła wartość, spróbuj ponownie");
            soldier4 = scanner.nextInt();
        }
        Soldier playerSoldier4 = Soldier.createSoldier(soldier4);
        playerSoldierLine2.add(playerSoldier4);
        System.out.println();
        System.out.println("1[" + playerSoldier1 + "] 2["    + playerSoldier2 + "] 3[" + playerSoldier3 + "]");
        System.out.println("              4[" + playerSoldier4 + "]      5[  numer pięć  ]");

        //teraz żołnierz 5
        System.out.println("");
        System.out.println("Podaj teraz klasę żołnierza którego chcesz umieścić na piątym miejscu. masz do wyboru 1.piechur, 2.pikinier, 3.konik, 4.czarownik, 5.lucznik, 6.lowca. Wpisz odpowiednią liczbę, tylko pamiętaj że pierwsze 3 klasy nie będą mogły odrazu atakowac");
        int soldier5 = scanner.nextInt();
        while (soldier5 == 0 || soldier5 > 6 || soldier5 < 1) {
            System.out.println("Podałeś zła wartość, spróbuj ponownie");
            soldier5 = scanner.nextInt();
        }
        Soldier playerSoldier5 = Soldier.createSoldier(soldier5);
        playerSoldierLine2.add(playerSoldier5);
        System.out.println();
        System.out.println("1[" + playerSoldier1 + "] 2["    + playerSoldier2 + "] 3[" + playerSoldier3 + "]");
        System.out.println("              4[" + playerSoldier4 + "]      5[" + playerSoldier5 + "]");

// teraz losowo stworzymy żołnierzy dla bota
        ArrayList <Integer> lineBot1 = new ArrayList<Integer>(Arrays.asList(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3));
        Collections.shuffle(lineBot1);
        Soldier botSoldier1 = Soldier.createSoldier(lineBot1.get(0));
        Soldier botSoldier2 = Soldier.createSoldier(lineBot1.get(1));
        Soldier botSoldier3 = Soldier.createSoldier(lineBot1.get(2));
        botSoldierLine1.add(botSoldier1);
        botSoldierLine1.add(botSoldier2);
        botSoldierLine1.add(botSoldier3);

        ArrayList <Integer> lineBot2 = new ArrayList <Integer>(Arrays.asList(4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6));
        Collections.shuffle(lineBot2);
        Soldier botSoldier4 = Soldier.createSoldier(lineBot2.get(0));
        Soldier botSoldier5 = Soldier.createSoldier(lineBot2.get(1));
        botSoldierLine2.add(botSoldier4);
        botSoldierLine2.add(botSoldier5);

//tworzymy listę wszystkich żołnierzy w grze do pętli for each
        ArrayList <Soldier> allSoldiers = new ArrayList<Soldier>(Arrays.asList(playerSoldierLine1.get(0), botSoldierLine1.get(0), playerSoldierLine1.get(1), botSoldierLine1.get(1), playerSoldierLine1.get(2),
                botSoldierLine1.get(2), playerSoldierLine2.get(0), botSoldierLine2.get(0), playerSoldierLine2.get(1), botSoldierLine2.get(1)));

//tworzymy listy wszystkich żołnierzy bota i gracza by łatwiej operować atakami
        ArrayList <Soldier> allSPlayer = new ArrayList<Soldier>(Arrays.asList(playerSoldierLine1.get(0), playerSoldierLine1.get(1), playerSoldierLine1.get(2), playerSoldierLine2.get(0),
                playerSoldierLine2.get(1)));
        ArrayList <Soldier> allSBot = new ArrayList<Soldier>(Arrays.asList(botSoldierLine1.get(0), botSoldierLine1.get(1), botSoldierLine1.get(2), botSoldierLine2.get(0), botSoldierLine2.get(1)));

        int round = 1;
        int pZEnemy = botSoldierLine1.get(0).getPz() + botSoldierLine1.get(1).getPz() + botSoldierLine1.get(2).getPz() + botSoldierLine2.get(0).getPz() + botSoldierLine2.get(1).getPz();
        int pZPlayer = playerSoldierLine1.get(0).getPz() + playerSoldierLine1.get(1).getPz() + playerSoldierLine1.get(2).getPz() + playerSoldierLine2.get(0).getPz() + playerSoldierLine2.get(1).getPz();
//główna pętla while walki
        while (pZEnemy > 0 && pZPlayer > 0) {
            int numerSPlayer = 1;
            int numerSBot = 1;
            System.out.println("runda " + round);
            //System.out.println();
            for (Soldier soldier : allSoldiers) {
                if (allSPlayer.contains(soldier)) {
                    System.out.println();
                    System.out.println("teraz kolej gracza (" + numerSPlayer + ")");
                    numerSPlayer++;
                } else {
                    System.out.println("teraz kolej bota (" + numerSBot + ")");
                    numerSBot++;
                }
                                if (allSPlayer.contains(soldier)) {
                    if (soldier.getAlive() == false) {
                        System.out.println(numerSPlayer + " " + soldier.getKlasa() + " nie żyje i nie może wykonywać akcji");
                    } else {
                System.out.println();
                System.out.println("Oto pole walki:");
                System.out.println();
                System.out.println("              4[" + botSoldier4 + "]      5[" + botSoldier5 + "]");
                System.out.println();
                System.out.println("1[" + botSoldier1 + "] 2["    + botSoldier2 + "] 3[" + botSoldier3 + "]");
                System.out.println();
                System.out.println();
                    System.out.println("1[" + playerSoldier1 + "] 2["    + playerSoldier2 + "] 3[" + playerSoldier3 + "]");
                    System.out.println();
                    System.out.println("              4[" + playerSoldier4 + "]      5[" + playerSoldier5 + "]");
                    System.out.println();
                        if (soldier instanceof Czarownik) {
                            System.out.println("Czarownik może zaatakować (0) lub wzmocnić sojusznika (1) dodając mu +10H, + 5A, + 5D, + 1 do SA i SB");
                            int czar = scanner.nextInt();
                            while (czar != 0 && czar != 1) {
                                System.out.println("Wprowadziłeś błędną liczę, wybierz 0 by zaatakować lub 1 by wzmocnić sojusznika");
                                czar = scanner.nextInt();
                            }
                            if (czar == 0) {
                                System.out.println("Wprowadź numer jednostki przeciwnika który chcesz i mozesz zaatakować");
                                int target = scanner.nextInt();
                                while (target < 1 || target > 5 || allSBot.get(target - 1).getPz() < 1) {
                                    System.out.println("Wprowadziłeś błędną liczbę lub numer celu który już nie żyje, spróbuj ponownie wpisać poprawny numer celu");
                                    target = scanner.nextInt();
                                }
                                soldier.attack(allSBot.get(target - 1));
                            } else { // czar == 1
                                System.out.println("Wprowadź numer swojej żyjącej jednostki którą chcesz wzmocnic");
                                int target = scanner.nextInt();
                                while (target < 1 || target > 5 || allSPlayer.get(target - 1).getPz() < 1) {
                                    System.out.println("Wprowadziłeś błędną liczbę lub numer celu który już nie żyje, spróbuj ponownie wpisać poprawny numer celu");
                                    target = scanner.nextInt();
                                }
                                if (soldier instanceof Czarownik) {
                                    Czarownik czarodziej = (Czarownik) soldier;
                                    czarodziej.dodajAtrybut(allSPlayer.get(target - 1));
                                }
                            }
                        } // koniec if sprawdzającego czy żołnierz jest czarownikiem
                        else if (soldier instanceof Lucznik || soldier instanceof Lowca) {
System.out.println(soldier.getKlasa() + " może zaatakować dowolny cel, wpisz numer przeciwnika, który możesz i chcesz zaatakować");
int target = scanner.nextInt();
while (target < 1 || target > 5 || allSBot.get(target - 1).getPz() < 1) {
                                    System.out.println("Wprowadziłeś błędną liczbę lub numer celu który już nie żyje, spróbuj ponownie wpisać poprawny numer celu");
                                    target = scanner.nextInt();
                                }
                                soldier.attack(allSBot.get(target - 1));
                        } // koniec sprawdzania czy żołnierz jest Łucznikiem lub Łowcą
                        else { //żołnierz musi należeć do klas piechur, pikinier lub konik
                        if (botSoldierLine1.get(0).getPz() + botSoldierLine1.get(1).getPz() + botSoldierLine1.get(2).getPz() > 0) {
                            System.out.println(soldier.getKlasa() + " może zaatakować tylko pierwszą linię wroga. Podaj numer przeciwnika (1, 2 lub 3) którego możesz i chcesz zaatakować");
                            int target = scanner.nextInt();
                            while (target < 0 || target > 3 || allSBot.get(target - 1).getPz() < 1) {
                                System.out.println("podałeś zła wartość lub numer przeciwnika który już nie żyje, spróbuj ponownie podać prawidłową wartość");
                                target = scanner.nextInt();
                            } //upewniamy się że użytkownik wprowadził prawidłowy cel (koniec)
                            soldier.attack(allSBot.get(target - 1));
                        } // koniec metody ataku dla walczących wręcz w sytuacji gdy pierwsza linia przeciwnika żyje
                        else { //pierwszej linii już nie ma
                        System.out.println(soldier.getKlasa() + " może zaatakować drugą linię, bo pierwsza już nie żyje. Wprowadź numer wroga którego chcesz i możesz zaatakować");
                        int target = scanner.nextInt();
                        while (target != 4 && target != 5 || allSBot.get(target - 1).getPz() < 1) {
                            System.out.println("podałeś zła wartość lub numer przeciwnika który już nie żyje, spróbuj ponownie podać prawidłową wartość");
                            target = scanner.nextInt();
                        }
                        soldier.attack(allSBot.get(target - 1));
                        } // koniec metody ataku ald walczących wręcz w sytuacji gdy pierwszej linii już nie ma
                        } // koniec tego co robi piechur, konik lub pikinier
                    }// koniec sprawdzania czy żołnierz żyje
                                    pZEnemy = botSoldierLine1.get(0).getPz() + botSoldierLine1.get(1).getPz() + botSoldierLine1.get(2).getPz() + botSoldierLine2.get(0).getPz() + botSoldierLine2.get(1).getPz();
        pZPlayer = playerSoldierLine1.get(0).getPz() + playerSoldierLine1.get(1).getPz() + playerSoldierLine1.get(2).getPz() + playerSoldierLine2.get(0).getPz() + playerSoldierLine2.get(1).getPz();
        if (pZEnemy == 0 || pZPlayer == 0) {
            break;
        }
                } //koniec if sprawdzającego czy żołnierz jest gracza
            else { // teraz gra bot
            if (soldier.getAlive() == false) {
                        System.out.println(numerSBot + " " + soldier.getKlasa() + " nie żyje i nie może wykonywać akcji");
                    } else {
                            System.out.println();
                System.out.println("Oto pole walki:");
                System.out.println();
                System.out.println("              4[" + botSoldier4 + "]      5[" + botSoldier5 + "]");
                System.out.println();
                System.out.println("1[" + botSoldier1 + "] 2["    + botSoldier2 + "] 3[" + botSoldier3 + "]");
                System.out.println();
                System.out.println();
                    System.out.println("1[" + playerSoldier1 + "] 2["    + playerSoldier2 + "] 3[" + playerSoldier3 + "]");
                    System.out.println();
                    System.out.println("              4[" + playerSoldier4 + "]      5[" + playerSoldier5 + "]");
                    System.out.println();
            if (soldier instanceof Czarownik) {
                ArrayList <Soldier> targetListOfCzarownik = new ArrayList<>();
                for (Soldier s : allSPlayer) {
                    if (s.getPz() > 0) {
                        targetListOfCzarownik.add(s);
                    }
                }
                int attackOrBoost = random.nextInt(2);
                if (attackOrBoost == 1) {
                    ArrayList <Soldier> listAliveSoldier = new ArrayList<>();
                    for (Soldier s : allSBot) {
                        if (s.getPz() > 0) {
                            listAliveSoldier.add(s);
                        }
                    }
                    Collections.shuffle(listAliveSoldier);
                        if (soldier instanceof Czarownik) {
                                    Czarownik czarodziej = (Czarownik) soldier;
                                    czarodziej.dodajAtrybut(listAliveSoldier.get(0));
                                }
                } else {// czarownik teraz atakuje cel który ma najmniej zdrowia
                Soldier toAttack = targetListOfCzarownik.get(0);
                for (Soldier s : targetListOfCzarownik) {
                    if (s.getPz() < toAttack.getPz()) {
                        toAttack = s;
                    }
                }
                soldier.attack(toAttack);
                } // koniec ataku czarownika
                    
            } // koniec ruchu czarownika
            else if (soldier instanceof Lucznik || soldier instanceof Lowca) {
                ArrayList <Soldier> targetListOfLucznikOrLowca = new ArrayList<>();
                for (Soldier s : allSPlayer) {
                    if (s.getPz() > 0) {
                        targetListOfLucznikOrLowca.add(s);
                    }
                }
                    Soldier toAttack = targetListOfLucznikOrLowca.get(0);
                for (Soldier s : targetListOfLucznikOrLowca) {
                    if (s.getPz() < toAttack.getPz()) {
                        toAttack = s;
                    }
                }
                soldier.attack(toAttack);
            } // koniec ruchu Łucznika lub Łowcy
            else if (soldier instanceof Pikinier) { // teraz ruch Pikiniera, który powinien zaatakować konika jeśli ten jest
            if (playerSoldierLine1.get(0).getPz() + playerSoldierLine1.get(1).getPz() + playerSoldierLine1.get(2).getPz() > 0) {
                ArrayList <Soldier> targetOfPikinier = new ArrayList<>();
                for (Soldier s : playerSoldierLine1) {
                    if (s.getPz() > 0) {
                        targetOfPikinier.add(s);
                    }
                }
                Soldier toAttack = targetOfPikinier.get(0);
                for (Soldier s : targetOfPikinier) {
                    if (s instanceof Calvary) {
                        toAttack = s;
                        break;
                    } else {
                        if (s.getPz() < toAttack.getPz()) {
                            toAttack  = s;
                        }
                    }
                }
                soldier.attack(toAttack);
            }// koniec sytuacji gdy pierwsza linia gracza żyje
            else { //teraz nie żyje pierwsza linia
                ArrayList <Soldier> targetOfPikinier = new ArrayList<>();
                for (Soldier s : playerSoldierLine2) {
                if    (s.getPz() > 0) {
                    targetOfPikinier.add(s);
                }
                }
                Soldier toAttack = targetOfPikinier.get(0);
                for (Soldier s : targetOfPikinier) {
                    if (s.getPz() < toAttack.getPz()) {
                        toAttack = s;
                    }
                }
                soldier.attack(toAttack);
            } // koniec ataku gdy pierwsza linia nie zyje
            } // koniec ataku pikiniera
            else if (soldier instanceof Calvary) {
                if (playerSoldierLine1.get(0).getPz() + playerSoldierLine1.get(1).getPz() + playerSoldierLine1.get(2).getPz() > 0) {
                ArrayList <Soldier> targetOfCalvary = new ArrayList<>();
                for (Soldier s : playerSoldierLine1) {
                    if (s.getPz() > 0) {
                        targetOfCalvary.add(s);
                    }
                }
                Soldier toAttack = targetOfCalvary.get(0);
                for (Soldier s : targetOfCalvary) {
                    if (s instanceof Pikinier) {
                    } else {
                        if (s.getPz() < toAttack.getPz()) {
                            toAttack  = s;
                        }
                    }
                }
                soldier.attack(toAttack);
            }// koniec sytuacji gdy pierwsza linia gracza żyje
            else { //teraz nie żyje pierwsza linia
                ArrayList <Soldier> targetOfCalvary = new ArrayList<>();
                for (Soldier s : playerSoldierLine2) {
                if    (s.getPz() > 0) {
                    targetOfCalvary.add(s);
                }
                }
                Soldier toAttack = targetOfCalvary.get(0);
                for (Soldier s : targetOfCalvary) {
                    if (s.getPz() < toAttack.getPz()) {
                        toAttack = s;
                    }
                }
                soldier.attack(toAttack);
            } // koniec ataku gdy pierwsza linia nie zyje
            } // koniec ataku konika
            else { // atak piechura
                if (playerSoldierLine1.get(0).getPz() + playerSoldierLine1.get(1).getPz() + playerSoldierLine1.get(2).getPz() > 0) {
                ArrayList <Soldier> targetOfPiechur = new ArrayList<>();
                for (Soldier s : playerSoldierLine1) {
                    if (s.getPz() > 0) {
                        targetOfPiechur.add(s);
                    }
                }
                Soldier toAttack = targetOfPiechur.get(0);
                for (Soldier s : targetOfPiechur) {
                    if (s instanceof Calvary) {
                        if (s.getPz() < toAttack.getPz()) {
                            toAttack  = s;
                        }
                    }
                }
                soldier.attack(toAttack);
            }// koniec sytuacji gdy pierwsza linia gracza żyje
            else { //teraz nie żyje pierwsza linia
                ArrayList <Soldier> targetOfPiechur = new ArrayList<>();
                for (Soldier s : playerSoldierLine2) {
                if    (s.getPz() > 0) {
                    targetOfPiechur.add(s);
                }
                }
                Soldier toAttack = targetOfPiechur.get(0);
                for (Soldier s : targetOfPiechur) {
                    if (s.getPz() < toAttack.getPz()) {
                        toAttack = s;
                    }
                }
                soldier.attack(toAttack);
            } // koniec ataku gdy pierwsza linia nie zyje
            } // koniec ataku piechura
            } // koniec ruchu bota
            pZEnemy = botSoldierLine1.get(0).getPz() + botSoldierLine1.get(1).getPz() + botSoldierLine1.get(2).getPz() + botSoldierLine2.get(0).getPz() + botSoldierLine2.get(1).getPz();
        pZPlayer = playerSoldierLine1.get(0).getPz() + playerSoldierLine1.get(1).getPz() + playerSoldierLine1.get(2).getPz() + playerSoldierLine2.get(0).getPz() + playerSoldierLine2.get(1).getPz();
        if (pZEnemy == 0 || pZPlayer == 0) {
            break;
        }
        czekajNaEnter();
            } // koniec pętli for each
            pZEnemy = botSoldierLine1.get(0).getPz() + botSoldierLine1.get(1).getPz() + botSoldierLine1.get(2).getPz() + botSoldierLine2.get(0).getPz() + botSoldierLine2.get(1).getPz();
        pZPlayer = playerSoldierLine1.get(0).getPz() + playerSoldierLine1.get(1).getPz() + playerSoldierLine1.get(2).getPz() + playerSoldierLine2.get(0).getPz() + playerSoldierLine2.get(1).getPz();
        if (pZEnemy == 0 || pZPlayer == 0) {
            break;
        }
            } // koniec pętli for each
            round++;
        } // koniec głównej pętli while walki

System.out.println("KONIEC WALKI!");
System.out.println();
if (pZPlayer > pZEnemy) {
    System.out.println("Gratulacje, wygrałeś! Oto Twoje oddziały:");
    System.out.println("1[" + playerSoldier1 + "] 2["    + playerSoldier2 + "] 3[" + playerSoldier3 + "]");
    System.out.println();
        System.out.println("              4[" + playerSoldier4 + "]      5[" + playerSoldier5 + "]");
} else {
    System.out.println("Niestety, ale tym razem wygrał Bot. Oto jego oddziały:");
    System.out.println("              4[" + botSoldier4 + "]      5[" + botSoldier5 + "]");
                System.out.println();
                System.out.println("1[" + botSoldier1 + "] 2["    + botSoldier2 + "] 3[" + botSoldier3 + "]");
}
    
    } // koniec metody main

    private static void czekajNaEnter() {
    System.out.println("Naciśnij Enter, aby kontynuować...");
    try {
        System.in.read();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
} // koniec klasy main

Komentarze