2012-09-14 67 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); 
}