C # Как заставить объект из класса Person убить другого? - PullRequest
0 голосов
/ 11 ноября 2018

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

Ради интереса, я хочу, чтобы эти разные объекты убивали друг друга. Человек по имени Джек может убить. Два других не могут. Я хочу, чтобы Джек ударил двух других, заставив их потерять 1, 5 или 10 Хитпоинтов несколько раз, пока они не умрут, а затем установить для их Alive значение false.

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

Самым важным при этом является изучение того, как один объект может напрямую изменить что-то в другом объекте только потому, что он может, и что объекты, которые он затем изменил, будут страдать от этого действия.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OOP_Learning
{
    class Program
    {
        static void Main(string[] args)
        {
            Person p1; 
            p1 = new Person("Jack", 27, true, true, 10);

            Person p2;
            p2 = new Person("Vincent", 63, true, false, 10);

            Person p3;
            p3 = new Person("Tim", 13, true, false, 10);

            Console.ReadLine();
        }

    }
    public class Person
    {
        public string Name { get; set; }    
        public int Age { get; set; }
        public bool Alive { get; set; }
        public bool AbilityToKill { get; set; }
        public int HitPoints { get; set; }
        public Person(string name, int age, bool alive, bool abilityToKill, int hitPoints)
        {
            HitPoints = hitPoints;
            AbilityToKill = abilityToKill;
            Alive = alive;
            Name = name;
            Age = age;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Вам нужно 2 метода в классе Person.

  1. Hit -> Этот метод уменьшает HitPoints на собственном объекте при каждом попадании. Когда HitPoints становится нулем, статус Alive устанавливается на false.

  2. Kill -> Это будет принимать человека в качестве параметра и вызывать метод Hit для этого человека, пока этот человек не будет Alive.

Добавить следующие методы в Person class:

    public void Hit()
    {
        if(Alive)
        {
            if(HitPoints > 0)
            {
                HitPoints -= 1;
            }
            else
            {
                Alive = false;
            }
        }
    }

    public bool Kill(Person person)
    {
        if(!AbilityToKill)
        {
            Console.WriteLine("You don't have ability to kill! You cannont kill {0}.", person.Name);
            return false;
        }

        while(person.Alive)
        {
            person.Hit();
        }

        Console.WriteLine("{0} is dead.", person.Name);

        return true;
    }

Вызов метода Kill в методе Main.

    p2.Kill(p3);
    p1.Kill(p2);
    p1.Kill(p3);

Надеюсь, это поможет!

0 голосов
/ 11 ноября 2018

Это то, что вы имеете в виду?

public class Person
{
    public string Name { get; private set; }    
    public int Age { get; private set; }
    public bool Alive { get; private set; }
    public bool AbilityToKill { get; private set; }
    public int HitPoints { get; private set; }

    public void Hit(int points)
    {
        this.HitPoints -= points;
        if (this.HitPoints <= 0)
        {
            this.HitPoints = 0;
            this.Alive = false;
        }
    }

    public Person(string name, int age, bool alive, bool abilityToKill, int hitPoints)
    {
        this.HitPoints = hitPoints;
        this.AbilityToKill = abilityToKill;
        this.Alive = alive;
        this.Name = name;
        this.Age = age;
    }
}

Теперь с проверкой на AbilityToKill:

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }
    public bool Alive { get; private set; }
    public bool AbilityToKill { get; private set; }
    public int HitPoints { get; private set; }

    public int Attack(Person victim, int points)
    {
        var hp = victim.HitPoints;
        if (this.AbilityToKill)
        {
            victim.HitPoints -= points;
            if (victim.HitPoints <= 0)
            {
                victim.HitPoints = 0;
                victim.Alive = false;
            }
        }
        hp -= victim.HitPoints;
        return hp;
    }

    public Person(string name, int age, bool alive, bool abilityToKill, int hitPoints)
    {
        this.HitPoints = hitPoints;
        this.AbilityToKill = abilityToKill;
        this.Alive = alive;
        this.Name = name;
        this.Age = age;
    }
}

Это можно использовать так:

var jack = new Person("Jack", 27, true, true, 10);
var vincent = new Person("Vincent", 63, true, false, 10);
var tim = new Person("Tim", 13, true, false, 10);

var damage_done = jack.Attack(vincent, 20);
Console.WriteLine(damage_done);

Метод Attack возвращает фактическое количество очков попаданий, уменьшенных атакой - нанесенный урон.


А вот более строгая версия. Использование bool для свойств не всегда самый простой способ кодирования. Через некоторые перечисления, и это яснее.

public class Person
{
    public string Name { get; private set; }
    public int Age { get; private set; }
    public Alive Alive { get; private set; }
    public AbilityToKill AbilityToKill { get; private set; }
    public int HitPoints { get; private set; }

    public int Attack(Person victim, int points)
    {
        var hp = victim.HitPoints;
        if (this.AbilityToKill == AbilityToKill.Yes)
        {
            victim.HitPoints -= points;
            if (victim.HitPoints <= 0)
            {
                victim.HitPoints = 0;
                victim.Alive = Alive.No;
            }
        }
        hp -= victim.HitPoints;
        return hp;
    }

    public Person(string name, int age, Alive alive, AbilityToKill abilityToKill, int hitPoints)
    {
        this.HitPoints = hitPoints;
        this.AbilityToKill = abilityToKill;
        this.Alive = alive;
        this.Name = name;
        this.Age = age;
    }
}

public enum Alive { Yes, No }
public enum AbilityToKill { Yes, No }

Используется так:

var jack = new Person("Jack", 27, Alive.Yes, AbilityToKill.Yes, 10);
var vincent = new Person("Vincent", 63, Alive.Yes, AbilityToKill.No, 10);
var tim = new Person("Tim", 13, Alive.Yes, AbilityToKill.No, 10);

var damage_done = jack.Attack(vincent, 20);
Console.WriteLine(damage_done);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...