首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用不同语言解决不同运动成绩的通用解决方案

用不同语言解决不同运动成绩的通用解决方案
EN

Software Engineering用户
提问于 2012-10-06 13:55:01
回答 1查看 334关注 0票数 4

我目前有一些代码可以检查壁球和网球成绩是否有效,无论是javascript还是PHP。

这将导致现有的4块代码块,2种语言*2种运动,如果出现额外的运动或额外的语言.

如何通过设置/文本文件来描述游戏的有效分数,以便每种语言都能解析它们并应用这些规则。

我感到困惑的是,在网球比赛中,如果一盘打到6-6,就会出现奇怪的平局决胜情况,如果打完2盘,我也会在最后一盘中无止境地结束比赛。

ie:

代码语言:javascript
运行
复制
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
        }
    ]
}
EN

回答 1

Software Engineering用户

回答已采纳

发布于 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。另一种可能是“一对中的分数不能相等”,它适用于网球和淘汰赛式的足球比赛,但不适用于池式或联盟式的足球比赛(在可能的情况下)。制定足够的规则来涵盖所有的约束。

然后,配置文件可能如下所示:

代码语言:javascript
运行
复制
[
    {
        "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 (特定域语言)来描述游戏分数和规则。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/167743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档