拼字游戏点计数器

时间:2012-09-14 16:57:49

标签: c

我正在制作一个生成7个字母的拼字游戏程序,然后允许用户输入单词并查看它们是否有效以及点值是什么。一旦我开始做这些值,就是我开始遇到问题的时候。

我正在调用像这样的函数wordvalue,并希望将结果存储到值中。 用户词存储在用户词[8]中。

int value = wordvalue(userword[8]);

这是我的代码,用于确定数组单元格中的字母,然后添加。我不确定它有什么问题,但每次都在这一步崩溃。

int wordvalue (char userword[8]){

    int m;
    int currentvalue = 0;

    for (m=0; m < 8; m++){

        switch (userword[m]){

        case 'A':
        case 'E':
        case 'I':
        case 'L':
        case 'N':
        case 'O':
        case 'R':
        case 'S':
        case 'T':
        case 'U':
            currentvalue = currentvalue + 1;
            break;
        case 'D':
        case 'G':
            currentvalue = currentvalue + 2;
            break;
        case 'B':
        case 'C':
        case 'M':
        case 'P':
            currentvalue = currentvalue + 3;
            break;
        case 'F':
        case 'H':
        case 'V':
        case 'W':
        case 'Y':
            currentvalue = currentvalue + 4;
            break;
        case 'K':
            currentvalue = currentvalue + 5;
            break;
        case 'J':
        case 'X':
            currentvalue = currentvalue + 8;
            break;
        case 'Q':
        case 'Z':
            currentvalue = currentvalue + 10;
            break;

        }


    }

    //printf("%d", currentvalue);
    return currentvalue;
}

4 个答案:

答案 0 :(得分:2)

int value = wordvalue(userword[8]);

此调用看起来不对。

假设userwordchar的数组,您传递char,其中指向char的指针。

您可能想要这样做:

int value = wordvalue(userword);

答案 1 :(得分:2)

我知道你已经接受了答案,但我想告诉你一种避免写那篇冗长的switch陈述的方法。

values[]数组包含字母表中每个字母的Scrabble值。然后letterValue()函数使用字母的ASCII值 - 'A'来索引values[]数组以获取字母值。 values[0] is for 'A'values[25] is for 'Z'

#include <stdio.h>
#include <string.h>
#include <ctype.h>

/* prototypes */
int wordvalue (char *userword);
int letterValue( char letter );

int values[] = { 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 letterValue( char letter )
{
    return( values[toupper((int)letter) - 'A'] );  
} 

int wordvalue(char *userword)
{
    int m;
    int currentvalue = 0;

    for (m=0; m < strlen(userword); m++)
    {
        currentvalue += letterValue( userword[m]);
    }
    return currentvalue;
}

int main()
{
    char word[] = "Progress";

    printf("Value of %s is %d\n", word, wordvalue(word));
    return( 0 );
}

答案 2 :(得分:1)

如果userword是已初始化的字符串,则必须将其传递给您的函数:wordvalue(userword)

你拥有的是int value = wordvalue(char userword[8])

我看到的一个问题是你声明userword这是函数参数中包含8个字符的数组。

通过这样做,您实际上将userword的第8个元素传递给wordvalue。 由于您刚刚初始化此数组,因此userword[8]的值未知,并且您的程序将显示未定义的行为。

您需要初始化数组,并为其赋值:

int wordvalue(char *userword);         //function declaration

int main(void)
{
    char userword[8] = "foobarrr";         //declare 8 char array holding an 8 character string
    int value = wordvalue(userword);       //call the function
    printf("%d", value);                   //print function output
    return 0;
}

/*function prototype here*/

答案 3 :(得分:0)

您应该对int wordvalue(char *)函数进行编程,以接受任意长度的字符串作为参数。只要没有看到NULL字符(\0),您的代码就必须计算点数。在你的游戏逻辑中,你必须检查输入的单词是否太长,或者是否没有使用过两次。

您的代码如下所示:

int wordvalue(char * word)
{
    int m;
    int currentvalue = 0;

    for (m = 0; word[m] != NULL; m++)
    {
        switch (word[m])
        {
        case 'A':
        case 'E':
        case 'I':
        case 'L':
        case 'N':
        case 'O':
        case 'R':
        case 'S':
        case 'T':
        case 'U':
            currentvalue = currentvalue + 1;
            break;
        case 'D':
        case 'G':
            currentvalue = currentvalue + 2;
            break;
        case 'B':
        case 'C':
        case 'M':
        case 'P':
            currentvalue = currentvalue + 3;
            break;
        case 'F':
        case 'H':
        case 'V':
        case 'W':
        case 'Y':
            currentvalue = currentvalue + 4;
            break;
        case 'K':
            currentvalue = currentvalue + 5;
            break;
        case 'J':
        case 'X':
            currentvalue = currentvalue + 8;
            break;
        case 'Q':
        case 'Z':
            currentvalue = currentvalue + 10;
            break;
        }
    }
    return currentvalue;
}