letter = prompt("Enter a word please");
letter = letter.toUpperCase();
// define letters and respective scores
alphabet = ['A','B','C','D','E','F','G','H','I','J','K','L','M', 'N','O','P','Q',
'R','S','T','U','V','W','X','Y','Z']
alphabetScore = [1, 3, 3, 2, 1, 4, 2, 4, 1, 8, 5, 1, 3, 1, 1, 3, 10, 1, 1, 1, 1, 4, 4, 8, 4, 10]
// start sum
sum=0
for (i=0; i<alphabet.length; i++)
{
switch(letter)
{
case (alphabet[i]): sum+=alphabetScore[i]; break;
default: sum=sum+0;
}
}
alert (sum);
我正在尝试构建一个计算单词Scrabble得分的程序。但每次我输入一个单词 - 它返回0.为什么会发生这种情况?对于连续的JS帖子感到抱歉 - 我是该语言的新手,并且已经采取额外的实际任务来提高我对该语言的了解。在这种情况下,我一直在for循环中试验switch语句。
尝试将字母及其Scrabble点值之间的关系建模为关联数组,而不是两个并行数组:
var word = prompt("Enter a word please");
word = word.toUpperCase();
scores = { 'A' : 1, 'B' : 3, 'C' : 3, /* ... */ 'Z' : 10 };
var sum = 0;
for (var i = 0; i < word.length; ++i) {
sum += scores[word.charAt(i)] || 0;
}
alert(sum);
这不是使用开关的合适方式。
switch
通常用于取代几个相应的if ... else if ... else if ... else
。就这么简单。在你的情况下,你只需要在循环中使用一个if
语句。而你实际上需要一个双循环。
for each letter in the word
for each letter in the alphabet
if they match
increment score
祝好运。
通过以对象(a.k.a. associative array)的形式定义分数,可以避免在单词中的每个字母上循环遍及整个字母。此外,您的“字母”变量实际上是整个单词,因此您需要单独循环显示这些字母。以下结合了以下两个想法:
var word = prompt("Enter a word please");
word = word.toUpperCase();
var alphabet = {
A: 1,
B: 3,
C: 3,
D: 2,
E: 1,
F: 4,
G: 2,
H: 4,
I: 1,
J: 8,
K: 5,
L: 1,
M: 3,
N: 1,
O: 1,
P: 3,
Q: 10,
R: 1,
S: 1,
T: 1,
U: 1,
V: 4,
W: 4,
X: 8,
Y: 4,
Z: 10
}
var letter, i, sum = 0;
for (i = 0; i < word.length; i++) {
letter = word[i];
sum += alphabet[letter];
}
alert(sum);
也许仔细看看这条线
switch(letter)
是?
你把整个单词看作是一个单独的字母,并试图找到它在字母表中的位置。因为它根本不在字母表中,所以你得到零。相反,你需要循环单词的字母。
sum = 0;
for(var i=0,l=letter.length;i<l;i++)
sum += alphabetScore[alphabet.indexOf(letter[i])]
let word = prompt("Enter a word please");
const scrabble = {
a: 1, b: 3, c:3, d: 2, e: 1, f: 4, g: 2, h:4, i:1, j: 8,
k: 5, l: 1, m: 3, n: 1, o: 1, p: 3, q: 10, r: 1, s: 1, t: 1,
u: 1, v: 4, w: 4, x: 8, y: 4, z: 10
};
const sum = [...word].reduce((accu, letter) => { return accu + scrabble[letter.toLowerCase()]; }, 0);
alert(sum);