Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Pomoc s chybou přičítáním životů

Aktivity
Avatar
Honzs Sedlomn:28.9.2014 16:28

Ahoj.. Potýkám se s takovým problémem.. když si dám obranu 35 tak nepříteli se přičítají životy přitom mám utok 0... Prosím o pomoc jestli někdo neví jak to opravit :O

Editováno 28.9.2014 16:29
 
Odpovědět
28.9.2014 16:28
Avatar
Honzs Sedlomn:28.9.2014 16:29
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bojovka
{
    class postava
    {
        public string jmeno;
        public int utok = 0;
        public int obrana = 0;
        public int zivoty;
        public int bodyrozdeleni = 35;

        public void VyberAtributy()
        {
            Console.WriteLine("----------------");
            Console.WriteLine(jmeno);
            Console.WriteLine("Útok: " + utok);
            Console.WriteLine("Obrana: " + obrana);
            Console.WriteLine("Životy " + zivoty);
            Console.WriteLine("----------------");
        }
        public void RozdeleniAtributu()
        {
            Console.WriteLine("Zbývá rozdělit " + bodyrozdeleni + " bodů");
            Console.WriteLine("Které dovednosti chcete zlepšit?");
            Console.WriteLine("U pro útok");
            Console.WriteLine("O pro obranu");
        }
        public int VyhodnoceniObrany()
        {
            int konecnyutok = utok - obrana;
            return konecnyutok;
        }

        public void DalsiNepratele(string Jmeno, int Utok, int Obrana, int Zivoty)
        {
            jmeno = Jmeno;
            utok = Utok;
            obrana = Obrana;
            zivoty = Zivoty;
        }
    }
    class Program
    {

        static void Main(string[] args)
        {

            //Vytvoření všeho a rozdělení atributů
            postava postavahrace = new postava();
            postava nepritel1 = new postava();

            Console.WriteLine("Zadejte prosím svoji přezdívku: ");
            postavahrace.zivoty = 100;
            postavahrace.jmeno = Console.ReadLine();
            Console.WriteLine("Vytvořte postavu rozdělením bodů mezi jednotlivé atributy");
            while (postavahrace.bodyrozdeleni > 0)
            {
                postavahrace.VyberAtributy();
                postavahrace.RozdeleniAtributu();

                    switch (Console.ReadLine())
                    {
                        case "U":
                            postavahrace.bodyrozdeleni -= 5;
                            postavahrace.utok += 5;
                            postavahrace.VyberAtributy();
                            postavahrace.RozdeleniAtributu();
                            break;

                        case "O":
                            postavahrace.bodyrozdeleni -= 5;
                            postavahrace.obrana += 5;
                            postavahrace.VyberAtributy();
                            postavahrace.RozdeleniAtributu();
                            break;

                        default:
                            Console.WriteLine("Neplatný vstup!");
                            break;
                    }
                    if (postavahrace.bodyrozdeleni == 0)
                    {
                        Console.WriteLine();
                    }
                }

                //Bojování proti nepřátelům
                Random nahodnacisla = new Random();
                nepritel1.DalsiNepratele("Kostlivec", 20, 10, 80);
                Console.WriteLine("Potkal jsi kostlivce, který má tyto atributy");
                nepritel1.VyberAtributy();
                Console.WriteLine("Chceš na něho zaútočit? [A/N]");
                if (Console.ReadLine() == "A")
                {
                    Console.WriteLine();
                    Console.WriteLine("Souboj začíná!");
                    Console.WriteLine("----------------");

                    while (postavahrace.zivoty > 0 && nepritel1.zivoty > 0)
                    {
                        int konecnyutokhrace = postavahrace.utok - nepritel1.obrana;
                        int konecnyutoknepritele = nepritel1.utok - postavahrace.obrana;
                        if (postavahrace.obrana > konecnyutoknepritele)
                        {
                            konecnyutoknepritele = 0;
                        }
                        else if (nepritel1.obrana > konecnyutokhrace)
                        {
                            konecnyutokhrace = 0;
                        }
                        Console.WriteLine("Útok začíná");
                        while (true)
                        {
                            if (postavahrace.zivoty <= 0 || nepritel1.zivoty <= 0)
                            {
                                break;
                            }
                            nepritel1.zivoty -= konecnyutokhrace;
                            postavahrace.zivoty -= konecnyutoknepritele;
                            Console.WriteLine("Po útoku máš " + postavahrace.zivoty + " životů");
                            Console.WriteLine("Kostlivec má " + nepritel1.zivoty + " životů");
                            Console.WriteLine("Pro další útok stiskni libovolnou klávesu");
                            Console.ReadKey();

                        }

                    }
                }




            Console.ReadKey();
        }
    }
}
 
Nahoru Odpovědět
28.9.2014 16:29
Avatar
d4rkw34v3r
Tvůrce
Avatar
d4rkw34v3r:28.9.2014 17:15

Ahoj,

problém je v podmínce, kde zjišťuješ, jestli obrana nepřítele je větší než konečný útok hráče.

if (postavahrace.obrana > konecnyutoknepritele)
      {
          konecnyutoknepritele = 0;
      }
      else if (nepritel1.obrana > konecnyutokhrace)
      {
           konecnyutokhrace = 0;
      }

Protože ti vyhovuje zrovna v tomhle případě rovnou první podmínka, tak se ta druhá již nevykoná a v proměnné konečný útok hráče se bude nacházet hodnota -10, která dole při souboji, kdy odečítáš konečný útok hráče od životů nepřítele způsobý to, že místo odečtení, ty životy přičte. Protože:

nepritel1.zivoty -= konecnyutokhrace;
/*kde ten výpočet s konkrétními čísly vypadá následovně: nepritel1.zivoty = 80-(-10) což se rovná 80+10 = 90.
*/

Takže stačí upravit ten horní úsek kódu takhle:

if (postavahrace.obrana > konecnyutoknepritele)
      {
          konecnyutoknepritele = 0;
      }

      if (nepritel1.obrana > konecnyutokhrace)
      {
           konecnyutokhrace = 0;
      }
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
28.9.2014 17:15
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Honzs Sedlomn
Jan Vargovský:28.9.2014 17:29

postavahrace.zivoty -= konecnyutokne­pritele
postavahrace.zivoty = postavahrace.zivoty - konecnyutokne­pritele
postavahrace.zivoty = postavahrace.zivoty - (nepritel1.utok - postavahrace.o­brana)
postavahrace.zivoty = 100 - (0 - 35)
postavahrace.zivoty = 100 - (-35)
postavahrace.zivoty = 100 +35;
postavahrace.zivoty = 135

Stačí jen fixnout, když je útok záporný. Btw, obětoval jsem pár minut svého času, abys zapřemýšlel nad tímto návrhem :)

private static void Main(string[] args)
    {
        Player p1 = new Player()
        {
            Name = "p1",
            Attack = 50,
            Defend = 20,
            Health = 100
        };

        Player p2 = new Player()
        {
            Name = "p2",
            Attack = 25,
            Defend = 80,
            Health = 100
        };

        while (p1.Health >= 0 && p2.Health >= 0)
        {
            p2.AttackToEnemy(p1);
            p1.AttackToEnemy(p2);
            Console.WriteLine("p1 has {0} health", p1.Health);
            Console.WriteLine("p2 has {0} health", p2.Health);
        }

        string winner = p1.Health < 0 ? p2.Name : p1.Name;
        Console.WriteLine(winner);
    }

    class Player
    {
        public string Name;
        public int Attack, Defend, Health;

        public void AttackToEnemy(Player enemy)
        {
            enemy.DefendFromEnemy(this);
        }

        protected void DefendFromEnemy(Player enemy)
        {
            int attack = enemy.Attack - Defend;
            // 1. verze
            if (attack < 0) attack = 0;
            this.Health -= attack;
            // 2. verze
            if (attack > 0)
                this.Health -= attack;
        }
    }
Editováno 28.9.2014 17:30
 
Nahoru Odpovědět
28.9.2014 17:29
Avatar
Odpovídá na Jan Vargovský
Honzs Sedlomn:28.9.2014 17:31

Děkuju ti moc, ale jsem teprve začátečník a s příkazem this a tak ještě neumím :D Ale dám ti bod za ten tvůj čas: )

 
Nahoru Odpovědět
28.9.2014 17:31
Avatar
Odpovídá na d4rkw34v3r
Honzs Sedlomn:28.9.2014 17:32

Jinak děkuju @d4rkw34v3r že si mi pomohl, přesně tohle jsem potřeboval! :)

 
Nahoru Odpovědět
28.9.2014 17:32
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Honzs Sedlomn
Jan Vargovský:28.9.2014 17:37

O bod mi nejde. Moje první reakce, když jsem to viděl byla asi taková: "WTF, to mám jako luštit?" a chtěl jsem napsat, ať to nějakým způsobem minimalizuješ, pak jsem ale smazal zbytečné věci a byla toho 1/5. Jestli tomu nerozumíš, tak se k tomu vrať za pár dní (jestli se teda budeš dále učit) a třeba tomu budeš rozumět lépe.

Btw, jestli nerozumíš "this", tak to jde minimalizovat takhle, jen mi přijde nesmyslné sahat na atributy cizí instance, než ona sama :)

class Player
    {
        public string Name;
        public int Attack, Defend, Health;

        public void AttackToEnemy(Player enemy)
        {
            int attack = Attack - enemy.Defend;
            if (attack > 0)
                enemy.Health -= attack;
        }
    }
 
Nahoru Odpovědět
28.9.2014 17:37
Avatar
Odpovídá na Jan Vargovský
Honzs Sedlomn:28.9.2014 17:43

Jo takhle.. Jenom si to tvoje budu muset převést do češtiny :D Naštuduju si to co jsi mi napsal a nějak to tam přepíšu, děkuju moc za tvůj čas :)

 
Nahoru Odpovědět
28.9.2014 17:43
Avatar
Odpovídá na Jan Vargovský
Honzs Sedlomn:28.9.2014 18:41

Jen bych se chtěl zeptat jak jsi mi poslal ten tvůj první kod do jaké části programu to tam mám zakomponovat? Jestli hned pod class Program nebo nebo hned do public static void..

 
Nahoru Odpovědět
28.9.2014 18:41
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Honzs Sedlomn
Jan Vargovský:28.9.2014 18:44

Do třídy Program:)

 
Nahoru Odpovědět
28.9.2014 18:44
Avatar
Honzs Sedlomn:29.9.2014 9:16

Jenom nějak nechápu když napíšu

private static void Main(string[] args)
     {
         Player p1 = new Player()
         {
             Name = "p1",
             Attack = 50,
             Defend = 20,
             Health = 100
         };
}

class Player
{
public string Name;
public int Attack, Deffend, Health;
}

Když tohle napíšu tak proměnné v objektu Player p1 = new Player() Se nechtějí načíst přitom je v class Player mám definované.. A co mě úplně zmátlo je to, že když jsem celý tvůj kod zkopiroval tak fungoval.. O.o

Editováno 29.9.2014 9:17
 
Nahoru Odpovědět
29.9.2014 9:16
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Honzs Sedlomn
Jan Vargovský:29.9.2014 22:25

Tohle je celej kód co máš v tom souboru? Když nevíš jak co poskládat, tak radši pošli celej soubor od 1. znaku až po poslední :)

Editováno 29.9.2014 22:26
 
Nahoru Odpovědět
29.9.2014 22:25
Avatar
tomisoka
Tvůrce
Avatar
Odpovídá na Honzs Sedlomn
tomisoka:29.9.2014 22:46

že by

Deffend != Defend

?

 
Nahoru Odpovědět
29.9.2014 22:46
Avatar
Odpovídá na Jan Vargovský
Honzs Sedlomn:30.9.2014 7:24

Snad se to tu přidá :)

 
Nahoru Odpovědět
30.9.2014 7:24
Avatar
Honzs Sedlomn:30.9.2014 7:38

Nejde mi to tu vložit..

 
Nahoru Odpovědět
30.9.2014 7:38
Avatar
Honzs Sedlomn:30.9.2014 18:02

Ale tak jo to co jsem tam dával je úplně celý kod

 
Nahoru Odpovědět
30.9.2014 18:02
Avatar
Odpovídá na tomisoka
Honzs Sedlomn:30.9.2014 18:04

Ne to fakt ne, nechtěla se mi načíst ani jedna proměnná

 
Nahoru Odpovědět
30.9.2014 18:04
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 17 zpráv z 17.