0

大家下午好!

作为更好地掌握基于对象的编程的一些大部分方面的一部分,我已经开始尝试一些比我过去所做的更大的事情。因此,我正在尝试学习继承、代码重用、更广泛地使用类等等。为此,我试图将基本 RPG/地牢爬行者所需的所有部分拼凑起来。我知道这已经完成了十亿次,但我发现实际上尝试编写类似的代码会让你遇到比你想象的更多的问题,这是一种很好的学习方式(我认为)。

现在我只加载了一个 WPF 应用程序,因为我 95% 的兴趣在于能够将工作类、例程、函数等拼凑在一起。而不是对它的外观感兴趣。我实际上正在阅读 XNA,但由于我主要是想掌握基本的工作原理,我还不想让这些方面与事物的图形方面复杂化。

我现在面临的问题是,当我要一个角色攻击或防御时,它应该知道它来自哪个其他角色,或者应该指向哪个角色。我想我可以使用 GUID 或手动指定的 ID。但问题是我真的不知道如何实现这样的事情。我想到的是,我可以添加对数组 (Character[]) 的引用,并让 SearchByID 函数循环遍历它们以找到正确的数组并将其返回。像这样:

internal Character SearchByID(string _ID)
{
   foreach(Character charToFind in Character[])
   {
       if(charToFind.ID == _ID)
       return charToFind;
   }
}

当然,由于目前的回归,这必须稍作改变,但只是为了给你一个想法。我坚持的是如何在“字符”类之外创建适当的数组?我可以很好地填写它,但是我该如何将它添加到班级级别之上呢?“Character”类的构建方式是每个新角色都从 Character 类实例化。然后构造函数加载适当的值。但除此之外,我认为不可能在此之外初始化一个数组。

如果最好发布我拥有的整个代码,那根本没有问题!

感谢您为我提供的任何见解。

4

5 回答 5

1

我认为您可以只使用 Character-class 并将其他 Characters 传递给它,例如:

public class Character
{
    public string Name { get; private set; }

    public int HitPoints { get; private set; }

    public int Offense { get; private set; }

    public int Defense { get; private set; }

    public Character(string name, int hitPoints, int offense, int defense)
    {
        Name = name;
        HitPoints = hitPoints;
        Offense = offense;
        Defense = defense;
    }

    public void Defend(Character source)
    {
        HitPoints = HitPoints - (source.Offense - Defense);
        if (HitPoints <= 0)
        {
             Console.WriteLine("{0} died", Name);
        }
    }

    public void Attack(Character target)
    {
        // Here you can call the other character's defend with this char as an attacker
        target.Defend(this);
        if (target.HitPoints <= 0)
        {
            Console.WriteLine("{0} killed {1}", Name, target.Name);
        }
    }
}

面向对象编程的问题是你必须开始思考对象。物体在具体时就像盒子。你可以制作新的并赋予它们一些属性,例如名称、高度、宽度、生命值等等。您还可以让这些对象执行操作。现在一个简单的盒子本身不会做很多事情,但是一个角色可以做很多事情,所以将这些动作放在 Character-class 中是有意义的。

除了拥有角色之外,您可能还有一个游戏类来管理游戏状态、角色、怪物、宝箱等......

现在这个简单的例子可能会让你在你的防御高于攻击者的进攻时获得生命值,但这是细节,我将把具体的实现留给你。

于 2012-10-26T13:54:45.363 回答
0

查看键控集合

键控集合

它就像一个字典,其中键是类的属性。
您将能够使用
Characters[id]
语法 引用字符

在您的 Character 类上覆盖 GetHashCode 和 Equals 以获得性能。
如果您使用 Int32 作为 ID,那么您将获得一个完美的哈希值。
非常快且 O(1)。

于 2012-10-26T14:37:19.920 回答
0

我猜你想要一种在实例化字符时在数组中插入字符的方法。

您可以制作静态数组或列表

所以,我认为你的课应该是

class Character
{
    static List<Character> characterList=new List<Character>();//all characters are here
    public Character(string id,...)
    {
     //initialize your object
     characterList.Add(this);//store them in the list as and when created
    }

    internal Character SearchByID(string _ID)
    {
       foreach(Character charToFind in characterList)
       {
       if(charToFind.ID == _ID)
       return charToFind;
       }
    }
}

您可能知道static成员与class不相关联。因此object,当您创建一个新character对象时,它将自动添加到characterList

于 2012-10-26T13:13:18.410 回答
0

您可以使用在控制器类中实例化的字典:

Dictionary<Guid, Character> _characterList = new Dictionary<Guid, Character>();

初始化:

var someCharacter = new Character() { stats = something };
var otherCharacter = new Character() { stats = anotherThing };

var char1Id = Guid.NewGuid();
var char2Id = Guid.NewGuid();

_characterList.Add(char1Id, someCharacter);
_characterList.Add(char2Id, otherCharacter);

然后,访问字符:

var charToFind = _characterList[char1Id]; 

或者

var charToFind = _characterList.Single(c => c.Name = "Fred The Killer");

或者别的什么...

于 2012-10-26T13:11:15.570 回答
0

除非您正在处理单独的进程,例如客户端-服务器,否则您可能根本不想使用“Id”。

无论你在哪里经过string _ID,都可以通过实际的Character。这样可以节省您在数组或其他内容中查找的时间。

发布更多代码,我可以告诉你我的意思。

于 2012-10-26T13:08:43.870 回答