我应该如何构建面向对象的角色扮演游戏的逻辑?

时间:2013-09-15 20:22:15

标签: c# oop interface

请在我的player游戏课程中查看此方法:

public void eatSomethingt(Items eatable)
{
    foreach (Items i in items)
    {
        if (i is Ieatable && i.name == eatable.name) //Give items an ID in the future
        {
            Ieatable k = i as Ieatable;
            k.eat(this);
            items.Remove(i);
            break;
        }
    }
}

基本上,这将通过玩家拥有的物品清单并比较它们以检查传入的参数是否可食用,如果是,则检查玩家是否有食物。如果它进入IF语句,那么该项目将从玩家背包中移除(items

问题在于:k.eat(this)它被发送到此方法:

public void eat(Player p)
{
    Console.WriteLine(p.Name + " Ate the " + name);
    p.life = p.life + amountHealed;
}

这感觉有点'乒乓',因为它是将Fruit课程提供给玩家。当我的Fruit类实现接口iEatable时(这肯定是有意义的)我必须在实现它的类中放置eat方法。

2 个答案:

答案 0 :(得分:1)

我认为它应该是玩家的一种方法:

更正确IEatable应为IEdible甚至IConsumable

public class Player
{
    .
    .
    public string Name {get;set;}
    public int Life {get;set;}
    .
    .
    public void eat(IEdible food)
    {
        Console.WriteLine(Name + " Ate the " + food.name);
        life += food.amountHealed;
    }
}

答案 1 :(得分:1)

看起来像自然语言的代码的冲突。例如,告诉ConsoleWrite(a)Line是有意义的。告诉食物吃是没有意义的。食物本身应该吃。此外,食物很少动画 - 它不会开始与环境的任何互动,因此问自己是否真的应该有任何方法?我现在唯一想到的可能是Rot方法,但也可以在导致食物腐烂的细菌类中实施。解决此任务的最多OOP方式似乎是:

  1. 食物应该是没有方法的结构
  2. 将所有工作委托给播放器
  3. 其次,为什么要传递Items实例而不是IEdible?相反,定义方法:

    public void eatSomething(IEnumerable<IEdible> eatable)
    

    这样,任何传递无法吃掉的东西的尝试都会在编译时捕获。它还删除了if语句的第一个条件。

    第三,使用LINQ来缩短你的代码。