我正在制作一款游戏,玩家的分数会以8
,12
或15
的增量上升。因为它是一个可以(并且过去一直)被攻击的JavaScript游戏,所以我需要在将分数提交到数据库之前进行一些服务器端验证。
例如,得分38
从30=2*15+1*8
开始就有意义,但得分37
却没有。比如说,912301283
....好吧,我不确定,因为我的大脑不足以计算出来。
换句话说,我希望找出一种非暴力的填充方式
private static bool scoreAddsUp ( int score, int [] incs )
{
// ...
}
在这种情况下incs = { 8, 12, 15 }
,但当然如果我改变分数增加的方式,我会很好地概括这个过程。
重要问题:
8
,12
和15
被我任意选择,我可以使用更好的数字进行此程序吗?使用素数(如7
,9
,13
)是否可以让我创建更有效的算法?答案 0 :(得分:0)
您可以使用动态编程:
private static Boolean ScoreAddsUp(int score, int[] incs) {
HashSet<int> completed = new HashSet<int>();
List<int> frontier = new List<int>() {
0
};
while (frontier.Any(item => item <= score)) {
for (int i = frontier.Count - 1; i >= 0; --i) {
int front = frontier[i];
frontier.RemoveAt(i);
completed.Add(front);
foreach (int inc in incs) {
int item = front + inc;
if (item == score)
return true;
if (completed.Contains(item))
continue;
frontier.Add(item);
}
}
}
return false;
}
// Tests
if (!ScoreAddsUp(29, new int[] { 8, 12, 15 }))
Console.Write("Not Found");
if (ScoreAddsUp(28, new int[] { 8, 12, 15 }))
Console.Write("Found");
答案 1 :(得分:-3)
试试这个:
if (((score % incs[2]) % incs[1]) % incs[0] == 0)
{
//remining value is 0, correct score
}
else
{
//remining value is not 0, incorrect score
}
但是你应该测试它以确保没有误报的答案