2012-09-14 60 views
1

我正在拼字游戏程序,产生7个字母,然后允许用户输入的话,看看他们是否有效,点的价值是什么。只要我开始做价值观的时候,我开始有问题。拼字游戏计数器

我这样调用函数wordvalue,并希望将结果存储到值中。 用户词存储在userword [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

您应该与Eric合作:-)。 (HTTP://计算器。com/q/12427641/1310220) – jleahy

回答

2
int value = wordvalue(userword[8]); 

这个调用看起来是错误的。

假设userwordchar阵列要传递一个char其中一个指针char预期。

你可能想要做的:

int value = wordvalue(userword); 
+0

他可以使用第8个元素的地址来获取其他元素在函数中的地址吗? –

+0

啊哇,我怎么可能错过了。谢谢。它不再崩溃,但它似乎并不像它的价值回报当前值 – Ryan

+0

@Ryan你怎么知道它没有把价值? –

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*/ 
0

你应该设定您int wordvalue(char *)函数接受一个任意长度的字符串作为参数。只要没有看到空字符(\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; 
} 
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); 
}