2014-01-08 11 views
-1

我一直在爲一門課程開發一個hang子手遊戲,而且我差不多完成了。但是,我偶然發現了一個我似乎無法解決的問題。我對a子手遊戲的兩個字符串的比較無法正常工作

首先,計算機從一個文本文件中選擇一個隨機單詞,採用該單詞的長度,並以該長度創建原始單詞的蒙版副本。然後遊戲開始。玩家鍵入字母,如果在他/她失敗六次之前完成這個單詞,他就獲勝。否則,他/她會鬆動。我認爲我的代碼的問題是當我創建我的電腦選擇的字面罩,但我不知道。

如果我運行它,它看起來是這樣的:

所選單詞:鏈(詞的第一控制由計算機選擇)

所選單詞:鏈(第二控制以查看是否將相同的單詞從該函數複製到主字符串中)

已選詞:怪物(這是由free()功能打印的。由於某種原因,它是一個字以上)

所選單詞:鏈(第三控制字的lenght複製之前完成,以看它是否被複制合適的詞,它是)

Wordlenght:6(控制,查看是否lenght字,其中它不匹配)

面膜:_ _ _ _ _ _ñ(忽略下劃線之間的空格,它們只是爲了更容易看到。這是我認爲問題所在,因爲最後加入了額外的字符,在這種情況下是「N」。下劃線的數量匹配的字母數,這是很好)

面膜:_ _ _ _ _ _Ñ(由第二free()功能印刷)

那麼實際遊戲開始。其他一切正常工作(如果玩家放棄或放鬆,並且如果玩家想要或不想再玩)。我檢查int resultat (char* word, char* mask, int count)函數中的實際strcmp()是否正常工作,它確實如此。所以這個錯誤與被比較的字符串有關。我認爲這是當我得到所選詞的長度爲strlen()。當我得到長度時,我減去一個長度,否則我會得到一個長度過長的長度(例如,紙張的長度等於6,但是當我減去一個長度時,我得到5)。

如果有人可以幫助我,或者給我一些提示,我會非常感激!

#include<stdio.h> 
#include<stdlib.h> 
#include<stdbool.h> 
#include<string.h> 
#include<time.h> 

#define MAX_WORD_LEN 20 

char* datorns_val(); 
int ordlengd(char* word); 
char* datorns_val_mask(char* word, int len); 
int spel(char* word, char* mask, int len, int count, int result); 
int resultat (char* word, char* mask, int count); 
char get_user_choice(); 
void hangman(int count, int result); 

const int MAX_GUESS = 6; 
const char ABORT_CH = '0'; 
const int LOOSE = 0; 
const int WIN = 1; 
const int ABORTED = 2; 

/************************************************************ 
* 
*      MAIN 
* 
* 
************************************************************/ 

int main() 
{ 
    char word[MAX_WORD_LEN]; 
    char mask[MAX_WORD_LEN]; 
    int ch; 
    int len; 
    int result; 
    int count; 

    /* -------------------- Programstart -----------------*/ 

    srand(time(NULL)); 

    while (true) 
    { 
      result = 5; 
      count = 0; 
      strcpy(word,datorns_val()); 
      printf("Valt ord 2: %s", word); 
      free(datorns_val()); 
      len = ordlengd(word); 
      strcpy(mask,datorns_val_mask(word,len)); 
      printf("\nMask 2: %s <-----", mask); 
      free(datorns_val_mask(word,len)); 

      printf("\nV\x84lkommen till HANGMAN 2014!\n"); 
      printf("Du har %d gissningar p\x86 dig (avbryt med 0)\n", MAX_GUESS); 
      printf("Datorn har nu valt ett ord p\x86 %d bokst\x84ver\n", len); 

      /* GAME MAIN LOOP */ 

      while (count < 6) 
      { 
       count=spel(word,mask,len,count,result); 
       result=resultat(word,mask,count); 
       hangman(count,result); 
      } 

      /* END MAIN GAME LOOP */ 

      if(result == WIN) 
      { 
       printf("\nGrattis du vann!\n"); 
      } 
      else if(result == LOOSE) 
      { 
       printf("\nTyv\x84rr du f\x94rlorade! Ordet var: %s\n", word); 
      } 
      else 
      { 
       printf("Avbrutet\n"); 
      }  
      printf("Vill du spela igen? (j/n)"); 
      ch = get_user_choice(); 
      if (ch == 'n' || ch == 'N') 
      { 
       break; 
      } 
    } 
} 
/*********************************************************** 
* 
* ---------  Funktionsdefinitioner ---------------- 
* 
***********************************************************/ 
char get_user_choice() 
{ 
        char tkn; 
        scanf(" %c", &tkn); 
        return tkn; 
} 
char* datorns_val() 
{ 
    char ordlista[20]; 
    char* valt_ord = malloc(20); 
    int random; 
    int raknare = 0; 
    random = rand()%4+1; 
    FILE *ptr_file; 
    ptr_file =fopen("hangman.dat","r"); 
    if (!ptr_file) 
    { 
        printf("Filen kunde inte öppnas!"); 
    } 
    while (fgets(ordlista,20, ptr_file)!= NULL) 
    { 
      if (raknare == random) 
      { 
         strcpy(valt_ord, ordlista); 
         break; 
      } 
      raknare=raknare+1; 
    } 
    printf("Valt ord 1: %s",valt_ord); 
    fclose(ptr_file); 
    return valt_ord; 
} 
int ordlengd(char* word) 
{ 
    printf("Valt ord 3: %s", word); 
    int ordlengd; 
    ordlengd=strlen(word)-1; 
    printf("Ordlengd 1: %i", ordlengd); 
    return ordlengd; 
} 
char* datorns_val_mask(char* word, int len) 
{ 
    int j; 
    char* gissning = malloc(20); 
    for (j=0; j<len; j++) 
    { 
     gissning[j]='_'; 
    } 
    printf("\nMask 1: %s <----", gissning); 
    return gissning; 
} 
int spel(char* word, char* mask, int len, int count, int result) 
{ 
    int j; 
    char bokstav; 
    int ratt = 0; 
    printf("\nSkriv en bokstav: "); 
    scanf(" %c", &bokstav); 
    for(j=0; j<len; j++) 
    { 
       if(bokstav==word[j]) 
       { 
            mask[j]=bokstav; 
            ratt = 1; 
       } 
       else if(bokstav=='0') 
       { 
        count = 7; 
        return count; 
       } 

    } 
    if (ratt == 0) 
    { 
        printf("\nBokstaven finns inte i ordet!\n"); 
        count=count+1; 
    } 
    printf("Antal fel: %i\n\n", count); 
    ratt = 0; 
    for (j=0; j<len; j++) 
    { 
     printf("%c", mask[j]); 
     printf(" "); 
    } 
    return count; 
} 
void hangman(int count, int result) 
{ 
    const char* str[20]; 
    int j; 
    str[0]="\n_______ \n"; 
    str[1]=" | \n"; 
    str[2]=" O \n"; 
    str[3]="//|\\\\\n"; 
    str[4]=" | \n"; 
    str[5]="// \\\\\n"; 

    if(result != ABORTED) 
    { 
       for (j=0; j<count; j++) 
       { 
        printf("%s", str[j]); 
       } 
    } 
} 
int resultat (char* word, char* mask, int count) 
{ 
    char* a = "Hej"; 
    char* b = "Hej"; 
     if (count == 6) 
     { 
      return LOOSE; 
     } 
     else if (count < 6 && strcmp(mask,word) == 0) 
     { 
      return WIN; 
     } 
     else if (count == 7) 
     { 
      return ABORTED; 
     } 
} 
+0

我建議你的while循環至少可以用英文翻譯你的函數名稱,你也發佈了完整的代碼,只嘗試發佈可能導致問題的原因,以及你認爲的問題。最後,歡迎來到堆棧溢出 – DrakaSAN

回答

0

周圍有一些代碼的東西:

1)在毫無意義的第一個free()調用:

free(datorns_val()); 

這保留內存的字符串並刪除它,而不作任何用途的。所以擺脫它。 2)使用fgets()從文件中讀取字符串時,也會將行尾的'\ n'字符存儲到字符串中,因此您必須將其刪除。作爲提示,我已經使用了這句話:

while(fscanf(ptr_file,"%s", ordlista) >0) 

不存儲'\ n'字符。 3)在ordlengd(char * word)函數中,你有一個額外字符(上面提到的'\ n')的問題,所以長度和strlen()返回的長度相同,而不是

strlen(word) - 1 

你寫的。

4)您已經考慮另一個條件來結束主函數的while循環。我會建議補充

else return 5; 

在resultat()函數的結束和檢查該值的連接主要功能

while (count < 6 && result == 5) 

希望它可以幫助

+0

嗨lihudi 感謝您抽出寶貴時間來通過我的代碼!它幫助了很多!當我編寫代碼時(我愚蠢的),我沒有考慮'\ n'字符。當我改變它時,代碼完美地工作。只剩下結構化和編輯,我就完成了。 – JonteG