2016-07-05 88 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>