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语句。
答案 0 :(得分:2)
这不是使用开关的合适方式。
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
祝你好运。
答案 1 :(得分:2)
尝试将字母及其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);
答案 2 :(得分:2)
通过以对象(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);
答案 3 :(得分:1)
或许仔细看看这行
switch(letter)
是
答案 4 :(得分:1)
你将整个单词视为单个字母,并试图找到字母表中的位置。因为它根本不在字母表中,所以你得到零。相反,你需要循环单词的字母。
答案 5 :(得分:1)
sum = 0;
for(var i=0,l=letter.length;i<l;i++)
sum += alphabetScore[alphabet.indexOf(letter[i])]
答案 6 :(得分:1)
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);