Rezolvare - Laborator FAIMA #2 / An 1 Semestru 1


public class RezolvareFAIMA {

    private static final int RUNDE_MAX = 200;
    private static final int FETE_ZAR = 6;
    private static final int MAX_TURE_MASCARICI = 4;
    /*Adunam intr-un vector de String textele aferente tuturor actiunilor
     * ce pot aparea in joc. Observati ca actiunile aferente zarurilor 2,3,4,5
     * apar de doua ori, ca sa le putem adresa direct. De asemenea, apare si o
     * actiune aferenta zarului virtual 7, care se obtine din zarul 6 + bonus de
     * contraatac. La sfarsit, adaugam si celelalte mesaje pe care le vom transmite
     * si pe care le vom adresa individual.
     * Observati ca mesajele contin indicatori (e.g. {0}, {1}) in locurile unde
     * vom completa cu alte elemente de text, folosind clasa MessageFormat.
     */
    private static final String[] ACTIUNI = new String[]{"{0} Rateaza",
        "{0} il infige pe {1} in pamant pana la genunchi",
        "{0} il infige pe {1} in pamant pana la genunchi",
        "{0} il infige pe {1} in pamant pana la brau",
        "{0} il infige pe {1} in pamant pana la brau",
        "{0} il infige pe {1} in pamant pana la gat",
        "{0} il infige pe {1} in pamant pana la gat",
        "{0} foloseste Apa Vie. Rezultat: {1}",
        "{0} castiga.",
        "{0} se salveaza.",
        "Incaierarea se termina la egalitate",
        "Mascariciul e in joc"};
    private static final String[] COMBATANTI = new String[]{"Greuceanu", "Zmeul"};

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int tureMascarici = 0;
        int bonusContraatac = 0;
        /* Variabila alCuiERandul este un int, 1 sau 0, pentru a putea adresa
         * vectorul de combatanti direct
         */
        int alCuiERandul = 0;
        boolean[] aFolositApaVie = new boolean[2];
        int runda;
        for (runda = 0; runda < RUNDE_MAX; runda++) {
            /*
             * Intai da cu zarul povestitorul, daca mascariciul nu e in joc
             */
            if (tureMascarici == 0) {
                int zarPovestitor = (int) (Math.random() * FETE_ZAR + 1);
                if (zarPovestitor == 6) {
                    tureMascarici = MAX_TURE_MASCARICI;
                    System.out.println(ACTIUNI[11]);
                }
            }
            /*
             * Da cu zarul jucatorul si se calculeaza scorul atacului,
             * care se si tipareste
             */
            int zarJucator = (int) (Math.random() * FETE_ZAR + 1);
            if (tureMascarici > 0) {
                zarJucator = FETE_ZAR + 1 - zarJucator;
            }
            zarJucator += bonusContraatac;
            if (zarJucator == 1) {
                bonusContraatac = 1;
            } else {
                bonusContraatac = 0;
            }
            /*
             * MessageFormat.format ne ajuta sa compunem un mesaj pe baza
             * unui model si a unor argumente. Mesajul de la metrou, alcatuit cu
             * MessageFormat ar arata cam asa:
             *      String model="Urmeaza statia {0} cu peron pe partea {1}.";
             *      MessageFormat.format(model,new Object[]{"Piata Unirii","dreapta"};
             * rezultatul fiind:
             *      Urmeaza statia Piata Unirii cu peron pe partea dreapta
             */
            System.out.println(MessageFormat.format(ACTIUNI[zarJucator - 1], new Object[]{COMBATANTI[alCuiERandul], COMBATANTI[1 - alCuiERandul]}));
            /*
             * Daca jucatorul e pe cale sa castige
             */
            if (zarJucator >= 6) {
                /*
                 * Daca adversarul nu a folosit inca apa vie
                 */
                if (!aFolositApaVie[1 - alCuiERandul]) {
                    /*
                     * Calculam scorul de la apa vie, tinand cont si de mascarici
                     */
                    int zarApaVie = (int) (Math.random() * FETE_ZAR + 1);
                    if (tureMascarici > 0) {
                        zarApaVie = FETE_ZAR + 1 - zarApaVie;
                    }
                    /*
                     * Afisam rezultatul de la apa vie
                     */
                    System.out.println(MessageFormat.format(ACTIUNI[7], new Object[]{COMBATANTI[1 - alCuiERandul], zarApaVie}));
                    if (zarApaVie < 5) {
                        /*
                         * Jucatorul a castigat; iesim din iteratie
                         */
                        System.out.println(MessageFormat.format(ACTIUNI[8], COMBATANTI[alCuiERandul]));
                        break;
                    } else {
                        /*
                         * Adversarul s-a salvat
                         */
                        aFolositApaVie[1 - alCuiERandul] = true;
                        System.out.println(MessageFormat.format(ACTIUNI[9], COMBATANTI[1 - alCuiERandul]));
                    }
                } else {
                    /*
                     * Jucatorul a castigat; iesim din iteratie
                     */
                    System.out.println(MessageFormat.format(ACTIUNI[8], COMBATANTI[alCuiERandul]));
                    break;
                }
            }
            /*
             * Daca mascariciul e in joc, scadem turele alocate lui
             */
            if (tureMascarici > 0) {
                tureMascarici--;
            }
            /*
             * Schimbam randul
             */
            alCuiERandul = 1 - alCuiERandul;
        }
        /*
         * Am terminat iteratia; daca am ajuns la numarul maxim de runde
         * inseamna ca nimeni nu a castigat. Afisam mesajul de egalitate.
         */
        if (runda == RUNDE_MAX) {
            System.out.println(ACTIUNI[10]);
        }
    }
}

0 comentarii: