0

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

游戏有玩家和他们之间共享的单个棋盘。玩家还可以访问棋盘,以便能够从中添加/移动/移除单位。玩家可以访问其拥有的单位,无论是在棋盘上还是棋盘外(一个单位也知道它的所有者,但可能可以将其删除并进行查找)。板上有单位并且知道单位的位置。单位有能力(玩家可能也有)

我无法弄清楚的最大问题是单位的能力。他们应该能够影响游戏中的任何东西,治疗/伤害玩家/单位,重新定位棋盘上的东西,甚至可能是游戏本身(目前还没有必要,但它可能会出现)。

我怎么能拥有可以影响任何事物的能力,而他们却没有对所有事物的参考?我意识到每个能力都可以而且应该只引用它需要的东西,但是一个单位类有内置的能力,所以如果一个单位的能力影响董事会,它需要以某种方式从单位获得对董事会的引用?

我试图让设计尽可能灵活,因为规则还没有一成不变(我们正在创造一个游戏,而且还很早,所以它尝试一些东西,看看感觉如何,改变规则直到游戏感觉正确)

即使是否有棋盘/地图仍然悬而未决,所以单元应该与它们当前的解耦。没有全局状态或任何“上帝对象”(还),我想保持这种状态。

特别是在 Python 和 webapp 中,所以虽然问题本身与语言无关,但当然欢迎任何基于具有一流功能的动态语言的细节。

4

2 回答 2

1

首先,让我指出精彩的游戏开发 StackExchange。你可能有更多的运气在那里发布这个问题。

就您的问题本身而言,我认为一种解决方案是将触发能力的对象的通知传递给游戏对象,然后该对象将解析这些通知并将它们分发给特定的玩家或棋盘,然后从那里传递给具体单位。

这很难解释,所以让我试着用伪代码写出来......

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;
}

希望这是有道理的。

于 2011-02-04T02:07:13.067 回答
0

你可能有点想多了。

请记住,您希望能够使用您的代码库,因此您可以轻松理解您的代码很重要,即使您已经有一段时间没有处理该特定部分了。

如果你用文字来描述你的游戏,你很可能会使用类似的东西:这是一款 X 玩家的游戏,在 (specfics) 的棋盘上玩。每个玩家控制 Y 个单位。

所以,像这样开始你的设计。游戏(你的完整代码,或者只是你程序的 PLAYING 状态)需要有对棋盘和玩家的引用。

现在,董事会将处理您的大部分问题。如果玩家与游戏互动,他很可能会在棋盘上做点什么。

从一个简单的系统开始,它允许你移动你应该能够移动的东西,而不能移动你不应该移动的东西。

这些能力很可能是一个列表,其中包含整个列表中当前可用的选择。这些将取决于单元,也可能取决于董事会的其他元素。

根据游戏的类型,您可以使用事件通知单位发生了变化,或者在需要时获取信息。

不要添加比实际需要更多的抽象层。根据您的描述,这些能力似乎是您最想花时间在的部分,以确保您可以轻松更改和添加它们。

从其他部分的简单设计开始,如果您发现在某些点需要额外的层,请进行重构。这将避免分析瘫痪。特别是。当你想做一个“整洁的设计”时,很容易把事情复杂化。

你想让游戏运行起来。您希望能够轻松阅读(并理解)您的代码。即使在进行项目时,您的编码风格和知识也会发生变化,并且您还会在编码时获得新的想法。

于 2020-06-17T08:40:46.470 回答