Беда с простой битвой в C# - PullRequest
0 голосов
/ 11 марта 2020

Основная идея состоит в том, чтобы каждый участник на team1 атаковал случайного врага на team2. Наносимый урон основан на случайном заклинании из Grimoire книги.

Мой код:

using System;

namespace simple_test
{
    class Program
    {
        public class IceLance : Hechizo //hechizo == spell
        {
            public IceLance(uint d) : base(20)
            {
                danio = d; // danio == damage
                return;
            }

            public override void Castear() // castear == cast
            {
                Console.WriteLine("Ice Lance");
            }

            protected uint danio = 5; // danio == damage




        }

        public abstract class Hechizo
        {
            protected Hechizo(uint c)
            {
                costo = c; // costo == cost
            }


            public abstract void Castear();

            protected uint costo = 1;

            public uint Costo
            {
                get { return costo; }
            }
        }
        public class Personaje // personaje == character 
        {
            public Personaje()
            { }
            public Personaje(uint s)
            {
                salud = s;
            }


            public void RecibirDanio(uint d) // RecibirDanio == RecieveDamage 
            {
                salud -= d; // salud = salud - d // salud == Health
            }


            public virtual void Ataque() // Ataque == Attack
            {
                Console.WriteLine("Ataque melee");
                return;
            }

            public bool IsVivo() // IsVivo == IsAlive
            {
                return salud > 0;
            }

            protected uint salud = 100;
        }


        public class Humano : Personaje // Humano == Human
        {
            public Humano() : base()
            { }
            public Humano(uint s, uint m) : base(s)
            {
                mana = m;
            }



            public void CastearGrimorio(int idx)
            {
                if ((grimorio == null) ||
                  (idx >= grimorio.Length) || (grimorio[idx] == null))
                    return;
                uint c = grimorio[idx].Costo;
                if (mana >= c)
                {
                    mana -= c;
                    grimorio[idx].Castear();
                }
            }


            public void AprenderHechizo(Hechizo h) // AprenderHechizo == LearnSpell
            {
                if (grimorio == null)
                {
                    grimorio = new Hechizo[1];
                }
                else
                {
                    Hechizo[] nuevoGrimorio = new Hechizo[grimorio.Length + 1];
                    for (uint i = 0; i < grimorio.Length; ++i)
                    {
                        nuevoGrimorio[i] = grimorio[i];
                    }
                    grimorio = nuevoGrimorio;
                }
                grimorio[grimorio.Length - 1] = h;
            }

            public override void Ataque()
            {
                if (grimorio == null)
                    Console.WriteLine("Sin mana :(");
                else
                    CastearGrimorio(rnd.Next(0, grimorio.Length));//con esto lanza hechizos al azar
                return;
            }


            private uint mana = 10;


            private Hechizo[] grimorio;
            private Random rnd = new Random();

        }

        static public bool TodosMuertos(Personaje[] team) // TodosMuertos == AllDead
        {
            for (int i = 0; i < team.Length; ++i)
            {
                if (team[i].IsVivo())
                {
                    return false;
                }
            }
            return true;
        }
        static void Main(string[] args)
        {
            Personaje[] team1 = new Personaje[41];
            for (int i = 0; i < 3; ++i)
            {
                Humano mage = new Humano(80, 100);
                mage.AprenderHechizo(new IceLance(20));
                mage.AprenderHechizo(new IceLance(10));
                mage.AprenderHechizo(new IceLance(0));
                team1[i] = mage;
            }

            Personaje[] team2 = new Personaje[41];
            for (int i = 0; i < 3; ++i)
            {
                Humano mage = new Humano(80, 100);
                mage.AprenderHechizo(new IceLance(20));
                mage.AprenderHechizo(new IceLance(10));
                mage.AprenderHechizo(new IceLance(0));
                team2[i] = mage;
            }

            while (!TodosMuertos(team1) && !TodosMuertos(team2)) // turnos
            {
                Console.WriteLine("team1");

                for (int i = 0; i < team1.Length; ++i)
                {


                    if (team1[i].IsVivo())
                    {

                        team1[i].Ataque();
                        // Here should go the RecieveDamage funtion


                    }


                    Console.ReadKey();



                }
            }  
        }
    }
}

Это упрощенная версия код, т.е. он имеет только один класс и одно заклинание. Я не уверен, как написать часть того, как выбрать члена противоположной команды и в основу заклинания наложено receiveDamage в соответствии с его уроном.

PS: я добавил несколько ссылок на испанца sh язык, используемый в коде

1 Ответ

0 голосов
/ 11 марта 2020

Вы можете использовать класс Random, чтобы получить случайное число от 0 до количества живых магов в другой команде, и использовать это число для атаки. Измените свою функцию атаки, чтобы взять целевого мага в качестве параметра и заставить его получать урон оттуда.

using System.Linq; // Add to top of page to use linq functions - .Where()
....


    public class Humano : Personaje // Humano == Human
    {
...

        public override void Ataque(Personaje personaje)
        {
            if (grimorio == null)
                Console.WriteLine("Sin mana :(");
            else
            {
                // Modify CastearGrimoiro to return spell damage. Use person parameter to inflict damage on that person
                uint damage = CastearGrimorio(rnd.Next(0, grimorio.Length));//con esto lanza hechizos al azar
                personaje.RecibirDanio(damage);
            }
        }

...

    static Random _random = new Random();

    static void TakeTeamTurn(Personaje[] team, Personaje[] enemyTeam)
    {
        var aliveMages = team.Where(m => m.IsVivo()).ToList();

        foreach(var mage in aliveMages)
        {
            // Get team to attack
            var attackableMages = enemyTeam.Where(m => m.IsVivo()).ToList(); // Get a list of alive mages on the other team
            var mageAttackIndex = _random.Next(attackableMages.Count); // Get a random number between 0 and the number of attackable mages

            // (Not written here) Modify your Ataque method to take a mage parameter. 
            // In the Ataque method or some other method you can use this parameter to do damage to the target mage
            var mageToAttack = attackableMages[mageAttackIndex]; 
            mage.Ataque(mageToAttack);
        }
    }

    static void Main(string[] args)
    {

        ...

        while (!TodosMuertos(team1) && !TodosMuertos(team2)) // turnos
        {
            Console.WriteLine("team1");
            TakeTeamTurn(team1, team2);

            Console.WriteLine("team2");
            TakeTeamTurn(team2, team1);

            Console.ReadKey();
        }
    ....

Рабочий пример здесь - https://pastebin.com/kSregt24

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...