C#如何让一个类中的对象杀死另一个?

C#如何让一个类中的对象杀死另一个?,c#,oop,object,C#,Oop,Object,在下面的代码中,我试图学习如何让对象彼此交互,因为我觉得这比我现在所做的更重要,我现在所做的只是收集一组分配给每个对象的变量 为了好玩,我想让这些不同的物体互相残杀。叫杰克的人会杀人。另外两个不能。我要杰克做的是打击另外两个人,让他们损失1、5或10点生命值多次,直到他们死亡,然后将他们的“活着”设置为false 我甚至不知道如何开始,但我认为这将是一个非常有趣的练习 做这件事最重要的是学习一个对象如何直接改变另一个对象的某些东西,仅仅因为它可以,然后它所改变的对象将因此而受到影响 using

在下面的代码中,我试图学习如何让对象彼此交互,因为我觉得这比我现在所做的更重要,我现在所做的只是收集一组分配给每个对象的变量

为了好玩,我想让这些不同的物体互相残杀。叫杰克的人会杀人。另外两个不能。我要杰克做的是打击另外两个人,让他们损失1、5或10点生命值多次,直到他们死亡,然后将他们的“活着”设置为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;
        }
    }
}

这就是你的意思吗

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;
    }
}
可以这样使用:

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);
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);
攻击
方法返回攻击减少的实际命中数-造成的伤害


这是一个强类型的版本。对属性使用
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 }

Person
类中需要两个方法

  • Hit
    ->此方法可在每次命中时减少自身对象的
    生命值。当
    生命值变为零时,状态
    活动
    设置为

  • Kill->这将把person作为参数,并对该person调用
    Hit
    方法,直到该person
    还活着

  • Person
    类添加以下方法:

        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;
        }
    
    Main
    方法中调用
    Kill
    方法。

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

    希望这有帮助

    你问题的某些部分有简单的答案。例如,p2.HitPoints-=10将带走生命值。p3.Alive=false将杀死某人。但是您可以使它更复杂,比如live可以是一个计算字段:get{returnthis.HitPoints>0;}。诸如此类。或者您可以使用TakeHit方法,将命中次数减少给定的数字,甚至计算一个随机数。另外,我建议您更改这个问题的标题,因为“kill”可能被误解为终止进程,这也是可能的。您只想更改您的objects@baileyrt这些都是很好的观点。我确实喜欢梦想远大,并随着时间的推移而变得紧密和成熟,但我也希望从小事做起,以获得更好的基本理解。我相信我要做的第一件事就是了解这个关键词。我把这个问题编辑得太多了,所以我想它会更容易理解now@AntonínLejsek-我特别使用了一种简单的方法,因为OP似乎没有太多经验。@AntonínLejsek-请不要删除您的评论。这使得理解对话变得更加困难。由于我的评论与不再存在的状态相关,我并不认为清理是一件坏事。@AntonínLejsek-但它确实与我的评论直接相关。所以现在我的评论没有上下文。我确实发现,你所说的“清理”会造成一片混乱。无论如何,在这段对话中,对读者来说没有任何附加价值,在这种情况下,我认为没有必要将页面视为只写。现在这种情况改变了,现在我们谈论的是删除那些对读者毫无意义的帖子。这是完全离题的,但好吧,它有一定的意义,在这种情况下,我同意删除评论可能会导致问题。
        p2.Kill(p3);
        p1.Kill(p2);
        p1.Kill(p3);