这是当前的依赖关系图(TheTXI的手绘圆圈)

一个游戏有玩家和他们之间共享的一个棋盘。玩家还可以访问棋盘,以便能够在棋盘中添加/移动/移除单位。玩家可以访问它拥有的单位,无论是在棋盘上还是在棋盘外(一个单位也知道它的所有者,但这可能是可以删除的,只需进行查找)。棋盘上有单位,并且知道单位的位置。单位有能力(玩家可能也可以)
我弄不清楚的一个大问题是单位的能力。他们应该能够影响游戏中的任何东西,治疗/伤害玩家/单位,重新定位棋盘上的东西,甚至可能是游戏本身(到目前为止还没有必要,但它可能会出现)。
我怎样才能拥有能够影响任何事情的能力,而不是引用所有的东西?我意识到每个技能可以也应该只引用它需要的东西,但是一个单位职业有内置的能力,所以如果一个单位的能力影响了板,它将需要以某种方式从单位获得对板的引用?
我正在努力保持设计的灵活性,因为规则还没有确定下来(我们正在创建一个游戏,而且还处于早期阶段,所以它是尝试一些东西,看看它的感觉如何,改变规则直到游戏感觉正确)
即使是否有一个棋盘/地图仍然是悬而未决的,所以单位应该与之解耦,目前是这样的。没有全局状态或任何“上帝对象”(目前还没有),我希望保持这种状态。
具体来说,它是在Python和webapp中实现的,因此,尽管问题本身与语言无关,但任何基于具有一流函数的动态语言的细节都是受欢迎的。
发布于 2011-02-04 10:07:13
首先,让我带您去看一下非常棒的gamedev StackExchange。你可能会更幸运地在那里发布这个问题。
就你的问题本身而言,我认为一种解决方案是将触发能力的对象的通知传递给游戏对象,然后游戏对象会解析这些通知,并将它们分发给特定的玩家或棋盘,然后从那里分发到特定的单位。
这很难解释,所以让我试着用psuedocode写出来…
Game {
getMe(); //Returns reference to singleton class.
list of players
list of boards
}
Board {
list of units
}
Unit {
int health
}
function Unit.notifyAbility(source, targeting-condition, ability-code) {
Game::getMe()->sendNotification(source, targeting-condition, ability-code);
}
function Game.sendNotification(source, targeting-condition, ability-code) {
for each unit in list of units {
if(unit matches targeting condition) {
apply ability-code
}
}
}目标条件和能力代码本身可以是传递相关信息的数据结构。更好的是,让它们成为虚拟类,并使用某种形式的多态性来处理独特的情况。
示例:
AbilityCode {
virtual function applyToUnit(target Unit)
virtual function applyToPlayer(target Unit)
}
AbilityGainHP: child of AbilityCode {
function applyToUnit(target Unit) { target.hp+= gainAmt; }
int gainAmt;
}希望这是有意义的。
发布于 2020-06-17 16:40:46
你可能对此想得有点过了。
请记住,您希望能够使用您的代码库,因此能够轻松地理解您的代码是很重要的,即使您还没有处理过这一特定部分。
如果你用文字来描述你的游戏,你很可能会这样使用:这是一个X玩家的游戏,在(specfics)的棋盘上玩。每个玩家控制Y单位。
所以,像这样开始你的设计。游戏(要么是你的完整代码,要么只是你程序的运行状态)需要有对棋盘和玩家的引用。
现在,董事会会处理你的大部分问题。如果玩家与游戏交互,他很可能会在棋盘上做一些事情。
从一个简单的系统开始,它允许你移动东西,你应该能够移动,而不能移动你不应该移动的东西。
这些异能很可能是包含整个列表中当前可用选项的列表。这些将取决于单元,也可能取决于电路板的其他元素。
根据游戏类型的不同,您可以使用事件通知单位某些内容发生了变化,也可以在需要时简单地获取信息。
不要添加超过实际需要的抽象层。从你的描述来看,这些能力似乎是你想花最多时间的部分,以确保你可以轻松地对其进行更改和添加。
从其他部分的简单设计开始,如果您发现在某些点上需要额外的层,则进行重构。这将避免分析瘫痪。Esp。当你想做一个“整洁的设计”时,很容易把事情搞得过于复杂。
你想让游戏运行起来。您希望能够轻松地阅读(和理解)您的代码。即使在项目中工作,你的编码风格和知识也会发生变化,在编码的同时你也会得到新的想法。
https://stackoverflow.com/questions/4887660
复制相似问题