В вашем коде и в логах c вашей программы много ошибок:
char ans[3]; //should be ans[4] to be able to read the word yes for example
функция void body(int n)
в теле switch(n)
, в другом случае вы никогда не используете break
для каждого отдельного случая. Решение:
switch(n){
case 6: parts[5] = '\\'; break;
case 5: parts[4] = '/'; break;
case 4: parts[3] = '\\'; break;
case 3: parts[2] = '/'; break;
case 2: parts[1] = '|'; break;
case 1: parts[0] = 'O'; break;
}
другая сложная в вашем коде логика c это:
if(res == 1){
printf("Yes! The secret word is \"%s\"! You have won!\n");
break
}
Когда res == 1
слова не совпадают, также в
printf ("Да! Секретное слово \"% s \ "! Вы выиграли! \ N");
сгенерировать предупреждение, поскольку вы не добавляете вейл для %s
. Решение:
if(res == 0){
printf("Yes! The secret word is \"%s\"! You have won!\n", word[gen]);
break;
}
Но главная проблема в вашем логе кода состоит в том, что вы никогда не ловите письмо от пользователя и не обновляете состояние игры. Решением может быть добавление функции для этого после функции generate(gen)
для этой функции, например:
void readLetterUpdateLife(int gen){
bool find = false;
char letter;
scanf(" %s", &letter);
for(int i=0; i<strlen(word[gen]); ++i){
if(word[gen][i] == letter){
blanks[i] = letter;
find = true;
}
}
if(!find) mwords[life++] = letter;
}
и, наконец, если вы хотите снова заплатить за игру, вам следует сбросить все переменные, которые вы используете для игры, например:
printf("Do you want to play again? (yes or no): ");
scanf(" %s", ans);
if(strcmp (ans, "yes") == 0){
life = 0; //Reset the life
srand(time(0)); //Select a new seed for rand
gen = rand() % 3; //Reset the word
for(int i = 0; i < strlen(word[gen]); i++){
blanks[i] = '_'; //Clear blanks
}
strcpy(mwords," "); //Reset wrong letters
strcpy(parts," "); //Reset parts
}
на основе всех изменений, которые я предлагаю, окончательная программа:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
#include <string.h>
char word[3][10] = {"gabb", "mnl", "josh"};
char parts[6] = {" "};
char mwords[6] = {" "};
char blanks[10];
int life = 0;
int len;
char guess;
void body(int);
void generate(int);
int compare(int);
void readLetterUpdateLife(int);
int main(){
int res;
char ans[4];
int gen;
srand(time(0));
gen = rand() % 3;
for(int i = 0; i < strlen(word[gen]); i++){
blanks[i] = '_';
}
do{
while(life < 6){
body(life);
generate(gen);
readLetterUpdateLife(gen);
res = compare(gen);
if(res == 0){
printf("Yes! The secret word is \"%s\"! You have won!\n", word[gen]);
break;
}
}
printf("Do you want to play again? (yes or no): ");
scanf(" %s", ans);
if(strcmp (ans, "yes") == 0){
life = 0; //Reset the life
srand(time(0)); //Select a new seed for rand
gen = rand() % 3; //Reset the word
for(int i = 0; i < strlen(word[gen]); i++){
blanks[i] = '_'; //Clear blanks
}
strcpy(mwords," "); //Reset wrong letters
strcpy(parts," "); //Reset parts
}
}while(strcmp (ans, "yes") == 0);
}
void body(int n){
char guess;
switch(n){
case 6: parts[5] = '\\'; break;
case 5: parts[4] = '/'; break;
case 4: parts[3] = '\\'; break;
case 3: parts[2] = '/'; break;
case 2: parts[1] = '|'; break;
case 1: parts[0] = 'O'; break;
}
printf("H A N G M A N\n");
printf("\t+---+\n");
printf("\t| %c\n", parts[0]);
printf("\t| %c%c%c\n",parts[2], parts[1], parts[3]);
printf("\t|\\ %c %c\n", parts[4], parts[5]);
printf("\t===\n");
}
void generate(int a){
len = strlen(word[a]);
printf("Missed words: ");
for(int i = 0; i < 6; i++){
if(mwords[i] == '\0')
break;
else
printf("%c",mwords[i]);
}
printf("\n");
printf("Mystery word: ");
for(int i = 0;i < len; i++){
printf("%c ", blanks[i]);
}
printf("\n");
}
int compare(int comp){
if(strcmp (word[comp], blanks) == 0)
return 0;
else
return 1;
}
void readLetterUpdateLife(int gen){
bool find=false;
char letter;
scanf(" %c", &letter);
for(int i=0; i<strlen(word[gen]); ++i){
if(word[gen][i] == letter){
blanks[i] = letter;
find = true;
}
}
if(!find) mwords[life++] = letter;
}