Týden návrhu sw Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde
Využij až 80% slevu na kurzy Návrhu Software

Diskuze: Znovu souboj 1vs1.

Aktivity (2)
Avatar
KaBor
Člen
Avatar
KaBor:15.12.2018 16:09

Už si opravdu nevím rady. Byl bych moc vděčný, kdyby mi někdo pomohl to nějak pospojovat do té hlavní třídy. Děkuju

package ppa1;

import java.util.Scanner;

public class Ppa1u07 {

        public static String jmeno;
        public static int sila;
        public static int hbitost;
        public static int vitalita;
        public static Zbran zbran;
        public Ruka ruka;
        public static String nazev;
        public static int obrana;
        public static int utok;
        public static Postava zautoc;
        public static Postava branSe;
        public static Protivnik Protivnik;

        static Postava nactiPostavu(Scanner sc) {
                        Postava postava = new Postava(jmeno, sila, hbitost, vitalita);
                        jmeno = sc.nextLine();
                        sila= sc.nextInt();
                        hbitost = sc.nextInt();
                        vitalita = sc.nextInt();
                        Integer.parseInt(sc.nextLine());
                return postava;


        }

        static Zbran nactiZbran(Scanner sc) {
                Zbran zbran = new Zbran(nazev,utok,obrana);
                nazev = sc.nextLine();
                utok = sc.nextInt();
                obrana = sc.nextInt();
                while((nazev = sc.nextLine()).isEmpty()) {
                        return null;
                }
                return zbran;

        }

        static Protivnik nactiProtivnik(Scanner sc) {
                Protivnik protivnik = new Protivnik(jmeno, sila, hbitost, vitalita);


                return protivnik;

        }

        static void vyzbrojPostavu(Postava postava, Zbran leva, Zbran prava) {


        }


                static boolean souboj(Postava postava1, Postava postava2) {

                        branSe = postava1;

                        zautoc = postava2;


                return Postava.jeZiva();


        }


        public static void main(String[]args) {

                Scanner sc = new Scanner(System.in);

                String jedna = nactiPostavu(sc);
                jedna = sc.nextLine();

                Zbran jednaZ = nactiZbran(sc);

                Protivnik dva = nactiProtivnik(sc);

                Zbran dvaZ = nactiZbran(sc);


                System.out.println(jedna);
                System.out.println(jednaZ);
                System.out.println(dva);
                System.out.println(dvaZ);


        }

}
package ppa1;

import java.util.Scanner;

public class Postava {

                public static String jmeno;
                public static int sila;
                public static int hbitost;
                public static int vitalita;
                public Zbran zbran;
                public Ruka ruka;
                public static String nazev;
                public static int obrana;
                public static int utok;



                        Postava(String jmeno, int sila, int hbitost, int vitalita) {
                        Scanner sc = new Scanner(System.in);

                        jmeno = sc.nextLine();
                        sila = sc.nextInt();
                        hbitost = sc.nextInt();
                        vitalita = sc.nextInt();

                        Postava.jmeno = jmeno;
                        Postava.sila = sila;
                        Postava.hbitost = hbitost;
                        Postava.vitalita = vitalita;


        }
                boolean vezmiZbran(Ruka ruka, Zbran zbran) {
                        this.zbran = zbran;
                        this.ruka = ruka;
                 return true;
        }

                static int branSe(int utok) {

                        int zraneni = Zbran.utok-obrana;
                        if(zraneni >0) {
                                vitalita-=zraneni;
                                if (vitalita <=0) {
                                        vitalita = 0;
                                }
                        }
                return vitalita;

        }



                static int zautoc() {
                        int celkemSila = sila + utok;
                return celkemSila;

        }

                static boolean jeZiva() {
                        if(vitalita>0) {
                                return true;
                        }else {
                                if(vitalita<0) {
                                        return false;
                                }
                        }
                        return (vitalita >0);

        }

                public String toString() {
                return jmeno;

        }

        public static void main(String[] args) {
                Postava postava = new Postava(jmeno, sila, hbitost, vitalita);
                Zbran zbran = new Zbran(nazev, utok, obrana);


                System.out.printf("Bojovník: %s\n", postava);
                System.out.printf("Síla:  %s\n", Postava.sila);
            System.out.printf("Naživu: %s\n", Postava.jeZiva());
            System.out.printf("Život: %s\n", vitalita);

            System.out.printf("název: %s\n",Zbran.nazev);
                System.out.printf("útok: %s\n",Zbran.utok);
                System.out.printf("obrana: %s\n",Zbran.obrana);

        }


}
package ppa1;

import java.util.Scanner;

public class Protivnik {



        private static int jmeno;
        public static int sila;
        private static int hbitost;
        static int vitalita;
        public String Protivnik;


        Protivnik(String jmeno, int sila,int hbitost, int vitalita){

        Scanner sc = new Scanner(System.in);

        jmeno = sc.nextLine();
        sila = sc.nextInt();
        hbitost = sc.nextInt();
        vitalita = sc.nextInt();

        Postava.jmeno = jmeno;
        Postava.sila = sila;
        Postava.hbitost = hbitost;
        Postava.vitalita = vitalita;;

        }


        public static void main(String[] args) {



        }


        public static  boolean jeZiva() {

                if(vitalita>0) {
                        return true;
                }else {
                        if(vitalita<0) {
                                return false;
                        }
                }
                return (vitalita >0);

        }

}
package ppa1;

import java.util.Scanner;

public class Zbran {

        public static String nazev;
        public static int utok;
        public static int obrana;

        public  Zbran(String nazev, int utok, int obrana){

                Scanner sc = new Scanner(System.in);

                nazev = sc.nextLine();
                utok = sc.nextInt();
                obrana = sc.nextInt();

                Zbran.nazev = nazev;
                Zbran.utok =  utok;
                Zbran.obrana = obrana;


        }

        public int getUtok() {


                return utok;

        }

        public int getObrana() {
                return obrana;

        }

        public String toString() {
                return nazev;

        }

        public static void main(String[]args) {
                Zbran zbran = new Zbran(nazev, utok, obrana);
                System.out.printf("název: %s\n",nazev);
                System.out.printf("útok: %s\n",Zbran.utok);
                System.out.printf("obrana: %s\n",Zbran.obrana);
        }





}

Zkusil jsem: Zkoušel jsem různě poupravovat. hledat na googlu. A už si nevím rady

Chci docílit: Pospojovat vše do hlavní třídy

 
Odpovědět 15.12.2018 16:09
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na KaBor
Petr Štechmüller:15.12.2018 16:17

Ahoj, než to začneš spojovat, tak si přečti pořádně základy OOP. Vím, že v PPA1 se to nejspíš moc nebere, ale bez toho moc dobře napsat nedá.

  1. Ve třídách: Protivnik, Postava, Zbran zruš statické proměnné a nech je, ať jsou instanční (smažeš to slovíčko static)
  2. Metodu main by jsi měl mít pouze v té hlavní třídě Ppa1u07 a z ní to všechno ovládat (jak je psáno v zadání)
  3. Ten souboj máš taky popsanej v zadání, stačí to jenom "nakódit", třeba takhle:
while (bojovnik1.nazivu() && bojovnik2.nazivu()) {
        bojovnik1.utoc(bojovnik2);
        vykresli();
        vypisZpravu(bojovnik1.vratPosledniZpravu()); // zpráva o útoku
        vypisZpravu(bojovnik2.vratPosledniZpravu()); // zpráva o obraně
        bojovnik2.utoc(bojovnik1);
        vykresli();
        vypisZpravu(bojovnik2.vratPosledniZpravu()); // zpráva o útoku
        vypisZpravu(bojovnik1.vratPosledniZpravu()); // zpráva o obraně
        System.out.println();
    }

Tohle je kus kódu z místního tutoriálu, kde také spolu bojují dva protivníci. Zkus se na to podívat.

Nahoru Odpovědět 15.12.2018 16:17
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
KaBor
Člen
Avatar
Odpovídá na Petr Štechmüller
KaBor:15.12.2018 16:20

Mrknu na to. Děkuju ti za rady. :) Teď si musím dát pauzu a třeba na to za hodinku mrknu a řeknu si co jsem to tu udělal :D Každopádně, ještě jednou děkuji :)

 
Nahoru Odpovědět 15.12.2018 16:20
Avatar
KaBor
Člen
Avatar
Odpovídá na Petr Štechmüller
KaBor:17.12.2018 18:38

Ahoj, potřeboval bych poradit. Jsem úplně zaseklej při tom samém. Hledám a hledám, ale nějak se nemůžu dostat dál. Nevím jak mám volat ty metody z jiných tříd se scannerem nejdříve z tříd do té hlavní a pak do main. Jestli pak v Main vytvořit znovu Scanner nebo jak. Takže bych ocenil ještě větší popostrčení :)

 
Nahoru Odpovědět 17.12.2018 18:38
Avatar
Jokertwo
Člen
Avatar
Jokertwo:17.12.2018 23:26

Ahoj.
Vzal jsem zadaní toho úkolu a napsal to přesně tak jak je to tam napsané. Krok po kroku. A pokud jsi dodržel zadání i v názvech metod, měla by ti fungovat následující metoda main

public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);

       // zadas prvni postavu
       Postava postava1 = nactiPostavu(sc);

       // zadas zbrane pro prvni postavu
       Zbran pravaZbranPostava1 = nactiZbran(sc);
       Zbran levaZbranPostava1 = nactiZbran(sc);

       // vyzbrojis prvni postavu
       vyzbrojPostavu(postava1, levaZbranPostava1, pravaZbranPostava1);

       // zadas druhou postavu
       Postava postava2 = nactiPostavu(sc);

       // zadas zbrane pro druhou postavu
       Zbran pravaZbranPostava2 = nactiZbran(sc);
       Zbran levaZbranPostava2 = nactiZbran(sc);

       // vyzbrojis druhou postavu
       vyzbrojPostavu(postava2, levaZbranPostava2, pravaZbranPostava2);

       //spustis souboj
       Postava vitez = souboj(postava1, postava2);

       //vypises viteze
       System.out.println("Vitez: " + vitez.toString());

   }
Editováno 17.12.2018 23:27
 
Nahoru Odpovědět 17.12.2018 23:26
Avatar
Jokertwo
Člen
Avatar
Odpovídá na Jokertwo
Jokertwo:17.12.2018 23:34

V případě že ti něco nefunguje pravděpodobně jsi nedodržel zadání. Ale je taky možné že v tom mám chybu já. Každopádně by jsi si mohl ruční zadávání nahradit následujícím codem (nahradit obsah metody main) a tím si urychlit vývoj.

public static void main(String[] args) {
        Postava postava1 = new Postava("Thorygg", 5, 3, 80);
        postava1.vezmiZbran(Ruka.LEVA, new Zbran("Tezky Mec", 15, 2));

        Postava postava2 = new Postava("Vlk", 10, 10, 30);

        Postava vitez = souboj(postava1, postava2);
        System.out.println("Vitez: " + vitez);
}
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
 
Nahoru Odpovědět 17.12.2018 23:34
Avatar
KaBor
Člen
Avatar
KaBor:18.12.2018 12:55

Já mám tedy teď spíš problém u souboje.
Mám tohle

while(postava1.jeZiva()&&postava2.jeZiva())
                postava1.zautoc(postava2);
                postava2.branSe(utok);
                if(postava2.jeZiva()) {
                        postava2.zautoc(postava1);
                }

mám ale podtrhnutý zautoc a u BranSe(utok) mám podtržený právě ten útok.
Co s tím ?

 
Nahoru Odpovědět 18.12.2018 12:55
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:18.12.2018 15:37

Bys mohl treba dat opraveny kod. Tu chybu neni ted s cim porovnat. Tak to bude asi tezke.
Zautoc je asi podtrzene proto, ze takovy nazev se tam nevyskytuje (male velke pismenka by to melo uvazovat jako rozdilne znaky). Pripadne v tom kodu nahore jsem teda zautoc po chvili nasel. No, vraci to int jako navratovou hodnotu, kterou ale nikde neukladas. Mozna, to mu vadi. Tak tam nic nevracej z te funkce.
Utok je podtrzeny asi proto, ze takova promena neexistuje. Mozna to melo byt spis postava1.utok nebo getUtok().

Editováno 18.12.2018 15:40
 
Nahoru Odpovědět 18.12.2018 15:37
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Peter Mlich
Petr Štechmüller:18.12.2018 15:50

int zautoc() - Vrátí celkovou útočnou sílu (tj. včetně útočné síly držených zbraní).
int branSe(int utok) - Metoda vrátí množství ubraného zdraví.

Nahoru Odpovědět 18.12.2018 15:50
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Jokertwo
Člen
Avatar
Odpovídá na Petr Štechmüller
Jokertwo:18.12.2018 17:21

No v podstatě jsi si odpověděl. Metoda int zautoc() vraci útočnou sílu ale nepřebíra zádný argument. Což ale ty děláš.

postava1.zautoc(postava2);

To je taky důvod proč máš podtržené to zautoc.
Proč je podtržený útok bylo již vysvětleno výše.

Utok je podtrzeny asi proto, ze takova promena neexistuje.

A možná oprava:

//zjistiš si útok postavy1
int utokPostavy1 = postava1.zautoc();

//zautočíš tímto útokem na postavu2
postava2.branSe(utokPostavy1);

//kontrola jestli postava2 prežila útok postavy1
if( !postava2.jeZiva() ) {
        //pokud ne vratíš postavu jedna jako víteze
        return postava1;
}
// tady bude následovat útok postavy2 na postavu1 (v podastatě to samé jen prohodíš
// postavy
 
Nahoru Odpovědět 18.12.2018 17:21
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Jokertwo
Petr Štechmüller:18.12.2018 17:25

Včera večer jsem to s ním docela podrobně řešil. Kód jsme museli dost upravit. Výsledné řešení sem asi dávat nebude, protože se jedná o domácí úkol.

Nahoru Odpovědět 18.12.2018 17:25
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Jokertwo
Člen
Avatar
Odpovídá na Petr Štechmüller
Jokertwo:18.12.2018 17:43

Aha :-) v tom případě by se toto vlákno mohlo uzavřít.

 
Nahoru Odpovědět  +1 18.12.2018 17:43
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.