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

C# .NET .NET (C# a Visual Basic) Pomoc s chybou přičítáním životů American English version English version

Avatar
hanisek.sedlon:

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
hanisek.sedlon:
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
Člen
Avatar
d4rkw34v3r:

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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět  +1 28.9.2014 17:15
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na hanisek.sedlon
Jan Vargovský:

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  +1 28.9.2014 17:29
Avatar
Odpovídá na Jan Vargovský
hanisek.sedlon:

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
hanisek.sedlon:

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ý
Redaktor
Avatar
Odpovídá na hanisek.sedlon
Jan Vargovský:

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  +1 28.9.2014 17:37
Avatar
Odpovídá na Jan Vargovský
hanisek.sedlon:

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ý
hanisek.sedlon:

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ý
Redaktor
Avatar
 
Nahoru Odpovědět 28.9.2014 18:44
Avatar
hanisek.sedlon:

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ý
Redaktor
Avatar
Odpovídá na hanisek.sedlon
Jan Vargovský:

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
Redaktor
Avatar
Odpovídá na hanisek.sedlon
tomisoka:

že by

Deffend != Defend

?

 
Nahoru Odpovědět  +3 29.9.2014 22:46
Avatar
hanisek.sedlon:

Nejde mi to tu vložit..

 
Nahoru Odpovědět 30.9.2014 7:38
Avatar
hanisek.sedlon:

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
hanisek.sedlon:

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.