TL:DR设计模式,用于临时相互修改的半相关对象。功能被添加,然后被删除。
我是一名数据库开发人员,并且正在尝试学习一些较新的前端好东西,因为我喜欢了解堆栈中不同点发生的事情。我不是 OOP 开发人员,但我对如何使用对象查看问题有一个很好的想法,但我不知道所有的设计模式和它们处理的不同场景。我正在学习 AngularJS,我决定重新创建棋盘游戏Small World,以此来快速定义我的需求。以下是我正在尝试为其打下基础的场景:
游戏的核心是权力和种族,每一个都有修改游戏规则的独特方式。这些力量/种族组合用于征服地区以获得积分。这些修改在游戏的不同阶段触发:
- 第一回合(有钱人:获得 7 分,这只会发生一次)
- 开始转弯(亚马逊:获得 4 个额外代币)
- 进入衰落(食尸鬼:食尸鬼在衰落时可以像一个活跃的种族一样玩;粗壮:进入衰落时立即选择你的下一个种族)
- 征服(突击队:征服一个地区需要减少 1 个令牌)
- 重新部署(亚马逊:失去 4 个标记;要塞:在您占领的区域上放置一个要塞。+1 防御 +1 点来自该区域)
- 结束回合(丘陵:在丘陵地区多获得 1 分;兽人:本回合征服的每个占领地区 +1 分)
- 多人游戏/完全独特(外交官:选择你本回合没有攻击过的人,他们直到你的下一回合才能攻击你)
此外,一些地区可以被标记为具有一个或多个特殊属性:
- 地雷:矮人从该地区获得+1分,即使在下降时
- 魔法源:巫师从该地区获得+1分
- 冥界:拥有冥界力量的种族认为所有冥界地区都相邻
- 山:征服该地区需要多1个令牌,+1防御
在整个游戏过程中,种族/力量组合将出现,然后死亡,被另一个种族/力量组合取代。因此,您可以看到在某些比赛存在时,我需要跟踪许多属性/统计数据。(例如,你本回合攻击的人只对外交官重要)。现在我可以定义属性来处理所有已知的场景,但我的目标是允许将新的种族/权力添加到我的配置文件中,并让游戏了解如何处理他们的规则更改。我想出了一个名为 Modifier 的通用对象的想法,并像这样组织我的对象:
{
event:'endTurn', // the game phase that triggers this modification
modify:{
points: 1, //hill power
strength: -4, // amazon redeploy phase, applied to a gameRace
strength: -1, // commando conquest phase, applied to a region
actions:[function(gameState, region, gameRace){
//use the above three params for conditional logic or more advanced modifiers like diplomat
}]
}
}
SWGame // is in charge of game state, phases, input from players
+--+Player[]
| |
| +--+GameRace[] // handles interactions between / joining race and power.
| | // players can have one declining race and one active race.
| | // the spirited power allows 2 races in decline at once
| |
| +--+Race // has 0-n modifiers does not understand any other object
| | |
| | +---Modifier[]
| |
| +--+Power // has 0-n modifiers does not understand any other object
| |
| +---Modifier[]
+--+GameMap // handles interctions between GameRaces and Regions
|
+--+Region[] // has 0-n modifiers does not understand any other object
|
+---Modifier[]
我遇到的问题是某些种族会修改区域(例如巨人:如果您占领一座山,则与该山相邻的所有区域都需要少 1 个令牌来征服)。我正在对相邻区域应用“强度:-1”修饰符。然后在回合的时候,我必须删除巨人的所有修饰符,然后为下一个玩家和他们当前的种族应用修饰符。跟踪修改器属于谁变得非常混乱,并且开始变得非常臭。关于更适合这种情况的设计模式的任何建议?