整个夏天我一直在学习 C#,现在我想用我迄今为止所做的事情来做一个小项目。我决定开发一种基于文本的冒险游戏。
游戏的基本结构将涉及拥有多个扇区(或房间)。进入房间后,将输出描述以及您可能采取的一些操作;在那个房间里检查、拿起、使用东西的能力;可能是战斗系统等。一个扇区最多可以连接 4 个其他扇区。
无论如何,在纸上写下关于如何为此设计代码的想法,我对部分代码的结构摸不着头脑。
我已经决定了一个玩家类和一个代表关卡/地牢/区域的“关卡”类。该级别将由许多相互关联的“部门”组成。在任何给定时间,玩家都会出现在关卡中的某个特定区域。
所以这里的混乱:
从逻辑上讲,人们会期望player.Move(Dir d)
诸如此类方法之类的方法应该更改关卡对象中的“当前扇区”字段。这意味着Player类需要了解Level类。嗯。并且Level可能必须操纵Player对象(例如,玩家进入房间,被某物伏击,从库存中丢失某些东西。)所以现在Level还需要持有对Player对象的引用?
这感觉不太好;一切都必须引用其他一切。
在这一点上,我记得在我正在使用的书中阅读了有关代表的内容。虽然我知道 C++ 中的函数指针,但在有关委托的章节中提供了具有某种“基于事件”编程观点的示例,对此我没有太多启发。
这给了我设计类的想法,如下所示:
玩家:
class Player
{
//...
public delegate void Movement(Dir d); //enum Dir{NORTH, SOUTH, ...}
public event Movement PlayerMoved;
public void Move(Dir d)
{
PlayerMoved(d);
//Other code...
}
}
等级:
class Level
{
private Sector currSector;
private Player p;
//etc etc...
private void OnMove(Dir d)
{
switch (d)
{
case Dir.NORTH:
//change currSector
//other code
break;
//other cases
}
}
public Level(Player p)
{
p.PlayerMoved += OnMove;
currSector = START_SECTOR;
//other code
}
//etc...
}
这是一种可行的方法吗?
如果代表章节没有按原样呈现,我就不会想到使用这样的“事件”。那么在不使用回调的情况下实现这一点的好方法是什么?
我有发布非常详细的帖子的习惯……抱歉 v__v