我一直在爲一門課程開發一個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;
}
}
我建議你的while循環至少可以用英文翻譯你的函數名稱,你也發佈了完整的代碼,只嘗試發佈可能導致問題的原因,以及你認爲的問題。最後,歡迎來到堆棧溢出 – DrakaSAN