2016-07-05 86 views
1

我正在写迷你游戏,但最终陷入困境。这是一个简单的测验,它根据正确回答的问题的数量和完成问题所花费的时间对用户进行排名。基于多个条件/因子的排名算法

我很容易就可以根据谁回答最多的问题对用户群进行排名,但是如何根据2个条件来计算谁是最佳表现者?

+1

如果两个用户有相同数量的正确答案,然后谁完成最快应该排名更高的一个。换句话说,按正确答案的数量和时间排序。在我看来,有些人比较慢,但有更多问题应该排在更高的位置。 (当然,这是一种排名用户列表的方法,而不是为单个用户分配单一分数。) – nnnnnn

+0

给出两个条件的一个因素(可能不相同),然后乘以测验的正确答案。 –

+0

是否所有用户都同时开始测验? – guest271314

回答

2

您可以在Array.prototype.sort()的比较函数中单次处理多个条件。

实施例:

var score = []; 

storeScore('user1', 7, 65); // 7 correct answers in 65 sec. 
storeScore('user2', 8, 70); // 8 correct answers in 70 sec. 
storeScore('user3', 6, 50); // 6 correct answers in 50 sec. 
storeScore('user4', 7, 50); // 7 correct answers in 50 sec. 

score = score.sort(function(a, b) { 
    return b.correct > a.correct || (b.correct == a.correct && b.time < a.time); 
}); 

for(var id in score) { 
    console.log(
    '#' + ((id | 0) + 1), 
    score[id].userId, 
    score[id].correct + ' correct answers in ' + 
    score[id].time + ' seconds' 
); 
} 

function storeScore(userId, correct, time) { 
    score.push({ 
    userId : userId, 
    correct: correct, 
    time : time 
    }); 
} 

输出:

#1 user2 8 correct answers in 70 seconds 
#2 user4 7 correct answers in 50 seconds 
#3 user1 7 correct answers in 65 seconds 
#4 user3 6 correct answers in 50 seconds 
+0

nide,多种排序,为什么我让东西变得复杂,这是如此简单 –

+0

很高兴帮助。请注意,我们在这里稍微滥用sort()函数,因为我们返回true(解释为1)或false(解释为0)。 “0”的意思是“两个值都相等”。更标准的方法是'return b.correct> acorrect || (b.correct == a.correct && b.time Arnauld

0

玩弄的两个条件的相对权重。

我的意思是简单。想想下面的公式:

weight(user) = a * parameter_1 + b * parameter_2 

你的情况的参数是number_of_correct答案和time_spent,但这是真实的任何数量的参数(回答一个问题最短的时间,重试次数,等等)。

ab没有“正确的”值,只有对你有用。我会为他们玩一些不同的价值观,看看你的排行榜如何结束,然后决定他们。

当每次测试对多个数据点进行测试结果排序时,这是一个常见问题 - 您如何确定哪种数据点更重要。

注意:对于两个参数,你并不需要两个参数,一个就足够了(与a=1相同)。

+0

重量是javascript中的函数吗? –

+0

@EuniceChia - 它的意思是作为一个等式(并且如此解释)。用户的体重由不同参数的某种组合决定的想法... –

0

您可以使用Promise.race()Promise.all()<form>元素,onsubmit事件

var forms = [].slice.call(document.querySelectorAll("[id^=form]")), 
 
progress = new Date().getTime(); 
 

 
Promise.race(
 
    forms.map(function(form, index) { 
 
    return new Promise(function(resolve) { 
 
     form.addEventListener("submit", function(e) { 
 
     resolve.call(form, [form.id, new Date().getTime() - progress]); 
 
     }); 
 
    }) 
 
    }) 
 
) 
 
.then(function(res) { 
 
    console.log(res) 
 
    alert(res[0] + " completed quiz fastest at " + res[1]) 
 
}); 
 

 
Promise.all(
 
    forms.map(function(form, index) { 
 
    return new Promise(function(resolve) { 
 
     form.addEventListener("submit", function(e) { 
 
     resolve.call(form, [form.id, new Date().getTime() - progress]); 
 
     }); 
 
    }) 
 
    }) 
 
) 
 
.then(function(quiz) { 
 
    if (quiz[0][1] < quiz[1][1]) { 
 
    alert(quiz[0][0] + " wins quiz") 
 
    } else { 
 
    alert(quiz[1][0] + " wins quiz") 
 
    } 
 
})
<form id="form1"> 
 
    <label>user 1</label> 
 
    5+5=10<input name="correct1" type="checkbox" required> 
 
    5+6=12<input name="incorrect1" type="checkbox" required> 
 
    5+2=7<input name="correct2" type="checkbox" required> 
 
    7+7=15<input name="incorrect2" type="checkbox" required> 
 
    <input type="submit"> 
 
</form> 
 
<form id="form2"> 
 
    <label>user 2</label> 
 
    5+5=10<input name="correct1" type="checkbox" required> 
 
    5+6=12<input name="incorrect1" type="checkbox" required> 
 
    5+2=7<input name="correct2" type="checkbox" required> 
 
    7+7=15<input name="incorrect2" type="checkbox" required> 
 
    <input type="submit"> 
 
</form>