cs50 игра в скрэббл: всегда печатает один и тот же ответ, независимо от того, что набрано

#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;
}