Diskuze: Pomoc s chybou přičítáním životů
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 17 zpráv z 17.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
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();
}
}
}
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;
}
postavahrace.zivoty -= konecnyutoknepritele
postavahrace.zivoty = postavahrace.zivoty - konecnyutoknepritele
postavahrace.zivoty = postavahrace.zivoty - (nepritel1.utok -
postavahrace.obrana)
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;
}
}
Děkuju ti moc, ale jsem teprve začátečník a s příkazem this a tak
ještě neumím Ale dám ti
bod za ten tvůj čas: )
Jinak děkuju @d4rkw34v3r že si mi pomohl, přesně tohle jsem potřeboval!
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;
}
}
Jo takhle.. Jenom si to tvoje budu muset převést do češtiny Naštuduju si to co jsi mi
napsal a nějak to tam přepíšu, děkuju moc za tvůj čas
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..
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
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í
Nejde mi to tu vložit..
Ale tak jo to co jsem tam dával je úplně celý kod
Ne to fakt ne, nechtěla se mi načíst ani jedna proměnná
Zobrazeno 17 zpráv z 17.