#c #cs50 #scrabble
Вопрос:
мне нужно запрограммировать игру в скрэббл для курса cs50. прямо сейчас у меня есть этот код, но проблема в том, что сначала он всегда печатал «Ничья!», а теперь всегда выводит «Игрок 2 выигрывает!», независимо от того, что я печатаю. я думаю, что моя ошибка в цикле, где вы присваиваете буквы номеру, но я действительно не знаю, как это исправить. у кого-нибудь может быть идея, как это сделать?
// Points assigned to each letter of the alphabet
int POINTS[] = {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};
int compute_score(string word1);
int compute_scores(string word2);
int main(void)
{
// Get input words from both players
string word1 = get_string("Player 1: ");
string word2 = get_string("Player 2: ");
// Score both words
int score1 = (int) compute_score;
int score2 = (int) compute_scores;
// Print the winner
if (score1 == score2)
{
printf("Tie! n");
}
if (score1 < score2)
{
printf("Player 2 wins! n");
}
if (score1 > score2)
{
printf("Player 1 wins! n");
}
}
int compute_score(string word1)
{
// Compute and return score for string
int compute_score = 0;
int numb;
for (int i = 0, n = strlen(word1); i < n; i )
{
if(isupper(word1[i]))
{
numb = word1[i] - 65;
numb = POINTS[numb];
}
if(islower(word1[i]))
{
numb = word1[i] - 97;
numb = POINTS[numb];
}
else
{
numb = 0;
}
}
compute_score = numb;
return compute_score;
}
int compute_scores(string word2)
{
// Compute and return score for string
int compute_scores = 0;
int numb;
for (int i = 0, n = strlen(word2); i < n; i )
{
if(isupper(word2[i]))
{
numb = word2[i] - 65;
numb = POINTS[numb];
}
if(islower(word2[i]))
{
numb = word2[i] - 97;
numb = POINTS[numb];
}
else
{
numb = 0;
}
}
compute_scores = numb;
return compute_scores;
}
Комментарии:
1. Почему у вас две одинаковые функции?
2.
int score1 = (int) compute_score;
это не вызов функции, это запись ее адреса в памяти в виде числа. Попробуйint score1 = compute_score(word1);
3. Почему вы добавили
(int)
int score1 = (int) compute_score;
?4. @4386427 Да, и с какой стати тебе делать что-то подобное? 🙂
5. Мне любопытно, что заставило ОП подумать, что это хорошая идея
Ответ №1:
Когда вы новичок, почти никогда не бывает ситуации, когда вам нужно использовать гипс. Или в тех редких случаях, когда вам это нужно, вам нужно знать, что вы делаете.
int score1 = (int) compute_score;
преобразует неподписанный адрес самой функции в int со знаком, где он может не подойти. Это чепуха. Вам нужно вызвать функцию и сохранить результат в an int
. Нигде никакого кастинга.
Я бы рекомендовал прочитать о функциях в вашей любимой книге на языке Си. Я также рекомендую отказаться от CS-50, так как это плохой класс, обучающий плохим практикам. У него плохая репутация среди программистов на языке Си.
Комментарии:
1. какую книгу на языке Си вы бы порекомендовали?
Ответ №2:
Этот
int score1 = (int) compute_score;
int score2 = (int) compute_scores;
это не то, как вы выполняете вызовы функций в C. То, что вы хотите, это:
int score1 = compute_score(word1);
int score2 = compute_scores(word2);
Но подождите… Вроде бы функции compute_score
и compute_scores
идентичны. Если это так… вам не нужны две функции. Просто используйте одну и ту же функцию для обоих вычислений
int score1 = compute_score(word1);
int score2 = compute_score(word2);
и удалите другую функцию.
Однако ваша текущая функция кажется неправильной…
int compute_score(string word1)
{
// Compute and return score for string
int compute_score = 0;
int numb;
// Why do you have a loop here?
// Inside the loop you keep overwriting numb so it is
// only the last iteration that matters.
// In other words... the result only depends on the
// last character in the string.
// Did you intend to do something like:
// numb = numb ....
for (int i = 0, n = strlen(word1); i < n; i )
{
if(isupper(word1[i]))
{
numb = word1[i] - 65;
numb = POINTS[numb];
}
if(islower(word1[i])) <----- Missing else ??
{
numb = word1[i] - 97;
numb = POINTS[numb];
}
else
{
numb = 0;
}
}
compute_score = numb;
return compute_score; ---> These lines can simply be: return numb;
}
Может быть, это то, чего ты хочешь:
int compute_score(string word)
{
// Compute and return score for string
int numb = 0;
for (int i = 0, n = strlen(word); i < n; i )
{
if(isupper(word[i]))
{
numb = POINTS[word[i] - 'A'];
}
else if(islower(word[i]))
{
numb = POINTS[word[i] - 'a'];
}
}
return numb;
}