I'm developing a forcing game in the C language, however I'm having trouble finding where the problem is in the main function program, the play function. I believe the problem is in the for
loop, but I've tried everything and still can not resolve it. I need a way for it to go through all of the positions that have not yet been filled (it's in the penultimate, have a comment above it saying what it is)
void jogar(char *palavra){
int t, i, erros = 0, char_especial = 0, acertou = 0, tentativas = 0;
char letras_tentadas[20];
char *teste = "homem-aranha 3";
//Esse for mede a quantidade de caracteres presentes na palavra a ser adivinhada
for(t = 0; palavra[t] != 'void jogar(char *palavra){
int t, i, erros = 0, char_especial = 0, acertou = 0, tentativas = 0;
char letras_tentadas[20];
char *teste = "homem-aranha 3";
//Esse for mede a quantidade de caracteres presentes na palavra a ser adivinhada
for(t = 0; palavra[t] != '%pre%'; t++){
if(palavra[t] == '-' || palavra[t] == ' '){
char_especial++; //esse contador vai ser usado para subtrair os caracteres especiais para que fiquem visiveis para o usuario
}
}
printf("A palavra possui %d letras\n\n", (t - char_especial));
char* copia_randwrd = ((char*) malloc(t * sizeof(char)));//alocação dinamica para o que vai ser mostrado ao usuario
if(!copia_randwrd){
return;
}
//printa a palavras com as letras substituidas por underlines e mostra espaços e hífens
for(i = 0; palavra[i] != '%pre%'; i++){
if(palavra[i] == '-'){
printf("- ");
}
else if(palavra[i] == ' '){
printf(" ");
}
else{
printf("_ ");
}
}
//preenchi o vetor com espaços vazios para facilitar a validação de um único caractere
for(i = 0; i < 20; i++){
letras_tentadas[i] = '1';
}
for(i = 0; i < t; i++){
copia_randwrd[i] = '_';
}
do{
//Letras tentadas
voltar:
if(tentativas > 0){
printf("\n\nletras tentadas: ");
for(i = 0; i < tentativas; i++){
printf("%c", letras_tentadas[i]);
}
}
printf("\n\nDigite uma letra: ");
scanf(" %c", &letras_tentadas[tentativas]);
//impede que o jogador tente a mesma letra duas vezes.
if(tentativas > 0){
for(i = 0; i <= tentativas; i++){
if(letras_tentadas[i - 1] == letras_tentadas[tentativas]){
printf("Você já tentou a letra %c. Por favor, tente uma letra diferente.\n", letras_tentadas[tentativas]);
goto voltar;
}
}
}
//Confere se foi inserido apenas um caractere
if(letras_tentadas[tentativas + 1] != '1'){
printf("Por favor, digite uma letra de cada vez.\n\n");
goto voltar;
}
letras_tentadas[tentativas] = tolower(letras_tentadas[tentativas]);//transforma o input do usuario em lower case.
//Acredito que o problema esteja neste for
for(i = 0; i < t && i < 20; i++){
if(palavra[i] == letras_tentadas[tentativas]){
copia_randwrd[i] = letras_tentadas[tentativas];
for(i = 0; i < t; i++){
printf("%c ", copia_randwrd[i]);
}
}
//***PROBLEMA***
else{
erros++;
//printf("A letra '%c' não faz parte da palavra secreta.\n", letras_tentadas[tentativas]);
//printf("_ ");
}
}
tentativas++;
if(strcmp(copia_randwrd, palavra) == 0){
acertou++;
}
}while(acertou != 1 || erros < 5); //***PROBLEMA***
if(erros >= 5){
printf("GAME OVER.\n\nA palavra era: ");
for(i = 0; i < t; i++){
printf("%c", palavra[i]);
}
}
else if(acertou == 1){
printf("Parabens, voce venceu!");
}
}
'; t++){
if(palavra[t] == '-' || palavra[t] == ' '){
char_especial++; //esse contador vai ser usado para subtrair os caracteres especiais para que fiquem visiveis para o usuario
}
}
printf("A palavra possui %d letras\n\n", (t - char_especial));
char* copia_randwrd = ((char*) malloc(t * sizeof(char)));//alocação dinamica para o que vai ser mostrado ao usuario
if(!copia_randwrd){
return;
}
//printa a palavras com as letras substituidas por underlines e mostra espaços e hífens
for(i = 0; palavra[i] != '%pre%'; i++){
if(palavra[i] == '-'){
printf("- ");
}
else if(palavra[i] == ' '){
printf(" ");
}
else{
printf("_ ");
}
}
//preenchi o vetor com espaços vazios para facilitar a validação de um único caractere
for(i = 0; i < 20; i++){
letras_tentadas[i] = '1';
}
for(i = 0; i < t; i++){
copia_randwrd[i] = '_';
}
do{
//Letras tentadas
voltar:
if(tentativas > 0){
printf("\n\nletras tentadas: ");
for(i = 0; i < tentativas; i++){
printf("%c", letras_tentadas[i]);
}
}
printf("\n\nDigite uma letra: ");
scanf(" %c", &letras_tentadas[tentativas]);
//impede que o jogador tente a mesma letra duas vezes.
if(tentativas > 0){
for(i = 0; i <= tentativas; i++){
if(letras_tentadas[i - 1] == letras_tentadas[tentativas]){
printf("Você já tentou a letra %c. Por favor, tente uma letra diferente.\n", letras_tentadas[tentativas]);
goto voltar;
}
}
}
//Confere se foi inserido apenas um caractere
if(letras_tentadas[tentativas + 1] != '1'){
printf("Por favor, digite uma letra de cada vez.\n\n");
goto voltar;
}
letras_tentadas[tentativas] = tolower(letras_tentadas[tentativas]);//transforma o input do usuario em lower case.
//Acredito que o problema esteja neste for
for(i = 0; i < t && i < 20; i++){
if(palavra[i] == letras_tentadas[tentativas]){
copia_randwrd[i] = letras_tentadas[tentativas];
for(i = 0; i < t; i++){
printf("%c ", copia_randwrd[i]);
}
}
//***PROBLEMA***
else{
erros++;
//printf("A letra '%c' não faz parte da palavra secreta.\n", letras_tentadas[tentativas]);
//printf("_ ");
}
}
tentativas++;
if(strcmp(copia_randwrd, palavra) == 0){
acertou++;
}
}while(acertou != 1 || erros < 5); //***PROBLEMA***
if(erros >= 5){
printf("GAME OVER.\n\nA palavra era: ");
for(i = 0; i < t; i++){
printf("%c", palavra[i]);
}
}
else if(acertou == 1){
printf("Parabens, voce venceu!");
}
}
Code on GitHub