我把这个作为一个面试问题,我想知道设计这个系统的最佳方式是什么问题是:
假设你有一个格斗游戏,其中某些按钮组合代表一个特殊的举动。实现两个功能register_move([button combo],movename),它接受一个按钮输入列表和一个movename字符串;on_keypress(button),它注册当前的keypress,并在按钮组合被激活时打印movename按钮用字符表示:“U”、“D”、“L”、“R”、“A”、“B”
例子:

register_move(['A','B','U'],"Uppercut")
on_keypress('A')
on_keypress('B')
on_keypress('U') -> print "Uppercut"

你可以假设移动是在键盘上注册的,所以你不必回顾以前的键盘。你可以用任何你喜欢的语言

最佳答案

建立一个Deterministic Finite State Automaton。初始状态是“未识别密钥”。每按一次键,转换到一个新的状态;如果它是一个最终状态,你就可以移动。所有未定义的转换都转换到启动状态。以你为例,

S --(a)--> A
A --(b)--> AB
AB --(u) --> ABU: process "Uppercut", move to S
X --(x)--> S

其中,X是任何状态,x是规则未涵盖的任何输入。
实际上,理论上讲,您最终会得到一个trie,因此使用trie库就足够了。根目录是“无输入”,请将其移动到叶目录,或者在出现错误时重新启动。

关于algorithm - 访谈Q:检测格斗游戏 Action 集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32469633/

10-11 20:06