我目前有一些代码可以检查壁球和网球成绩是否有效,无论是javascript还是PHP。
这将导致现有的4块代码块,2种语言*2种运动,如果出现额外的运动或额外的语言.
如何通过设置/文本文件来描述游戏的有效分数,以便每种语言都能解析它们并应用这些规则。
我感到困惑的是,在网球比赛中,如果一盘打到6-6,就会出现奇怪的平局决胜情况,如果打完2盘,我也会在最后一盘中无止境地结束比赛。
ie:
tennis = {
"format": [
{
"name": "sets",
"min": 3,
"max": 5,
"winby": 1
},
{
"name": "games",
"min": 6,
"max": 7,
"winby": 2
}
]
}
squash = {
"format": [
{
"name": "games",
"min": 3,
"max": 5,
"winby": 1
},
{
"name": "points",
"min": 15,
"max": 0,
"winby": 2
}
]
}
发布于 2012-10-06 14:24:44
这当然不是一件容易的事情;您需要的是将行为折叠到数据结构中,也就是说,您需要一个泛型的分数检查算法,该算法涵盖您需要的所有游戏,并具有可配置的规则(它以一种可被目标编程语言消化的格式作为参数)。
第一步,显然,是想出一个通用的数据结构,可以准确地表示分数。例如,对于足球、曲棍球、篮球等,一个简单的整数就可以了;但是其他运动,如网球,需要更复杂的数据结构--例如,一对整数的列表。例如,在伪代码中,足球结果可以是[(1, 3)]
(一个有一对的列表,表示结果"1:3");网球结果可以是[(6,1), (6,2), (7,6)]
(但我不太确定网球规则)。显然,如果你想在集合中建立分数模型,你必须相应地扩展你的数据结构。(游戏中网球成绩的注释:虽然计数是非线性的,但有效分数的数量非常少,它们可以很容易地映射到线性整数空间- [ "love", "15", "30", "40", "game" ]
可以作为[ 0, 1, 2, 3, 4 ]
在内部处理,然后映射回惯用的值以供显示。)
然后,您需要对这些分数实现泛型约束;有些将对单个对进行工作,另一些则会将结果作为一个整体来考虑。例如,其中一个约束可能是“结果对的最小数目”,其参数为足球为1,网球为3。另一种可能是“一对中的分数不能相等”,它适用于网球和淘汰赛式的足球比赛,但不适用于池式或联盟式的足球比赛(在可能的情况下)。制定足够的规则来涵盖所有的约束。
然后,配置文件可能如下所示:
[
{
"sportName" : "soccer",
"rules" : [
{ "ruleType": "numberOfSets", "number" : 1 },
{ "ruleType": "minScoreValue", "value" : 0 }
]
},
{
"sportName" : "soccer-knockout",
"rules" : [
{ "ruleType": "numberOfSets", "number" : 1 },
{ "ruleType": "minScoreValue", "value" : 0 },
{ "ruleType": "noDrawsWithinSet" }
]
},
{
"sportName" : "tennis",
"rules" : [
{ "ruleType": "minNumberOfSets", "number" : 3 },
{ "ruleType": "maxNumberOfSets", "number" : 5 },
{ "ruleType": "minWinningSetScore", "value" : 6 },
{ "ruleType": "maxWinningSetScore", "value" : 7 },
{ "ruleType": "noDrawsWithinSet" }
]
}
]
最后一部分需要胶水将其组合在一起:一个规则引擎从文件中加载规则,实例化适当的检查器,并将它们应用到指定的分数中。最后一部分只是迭代适用的规则(如果你有嵌套的分数,比如网球),直到你找到一个不匹配的规则。
当您向系统中添加更多的游戏时,您将不得不添加更多的约束类型,但是如果您将它们保持为通用的和可参数化的,则现有规则覆盖新游戏的可能性随着时间的推移而增加。
实际上,您正在实现一种DSL (特定域语言)来描述游戏分数和规则。
https://softwareengineering.stackexchange.com/questions/167743
复制相似问题