Member 13699776 Ответов: 2

Здравствуйте у меня есть проблема с проектом который я написал


Здравствуйте,я сделал какой-то небольшой проект под названием hangman game,это в основном программа, которая сравнивает вмененные харатеры с тем,что взято из списка,проблема в том,что когда я ввожу все слово,оно не подтверждает, что я выиграл, но оно продолжает просить больше вменить, можете ли вы сказать мне, как это исправить, оно написано на языке eclipse, c program language
вот этот код:
/*
 * Razvoni_Alati.c
 *
 *  Created on: Dec 18, 2017
 *      Author: Smiley
 */
#include<stdio.h>

#include<string.h>

#include<stdlib.h>

#include<time.h>

#include <ctype.h>

void vesala(int x)                            /**za pokzivanje vesala**/
 {

     switch(x)
     {

     case 0:

	printf("\n\t||===== ");
	printf("\n\t||    | ");
	printf("\n\t||   %cO/",'\\');
	printf("\n\t||    | ");
	printf("\n\t||   / %c",'\\');
	printf("\n\t||      ");
	break;
     case 1:

	printf("\n\t||===== ");
	printf("\n\t||    | ");
	printf("\n\t||   %cO/",'\\');
	printf("\n\t||    | ");
	printf("\n\t||     %c",'\\');
	printf("\n\t||      ");
	break;
     case 2:

	printf("\n\t||===== ");
	printf("\n\t||    | ");
	printf("\n\t||   %cO/",'\\');
	printf("\n\t||    | ");
	printf("\n\t||      ");
	printf("\n\t||      ");
	break;
     case 3:

	printf("\n\t||===== ");
	printf("\n\t||    | ");
	printf("\n\t||   %cO/",'\\');
	printf("\n\t||      ");
	printf("\n\t||      ");
	printf("\n\t||      ");
	break;
     case 4:

	printf("\n\t||===== ");
	printf("\n\t||    | ");
	printf("\n\t||   %cO ",'\\');
	printf("\n\t||      ");
	printf("\n\t||      ");
	printf("\n\t||      ");
	break;
     case 5:

	printf("\n\t||===== ");
	printf("\n\t||    | ");
	printf("\n\t||    O ");
	printf("\n\t||      ");
	printf("\n\t||      ");
	printf("\n\t||      ");
	break;
      }
      return;
 }


int main()
{
	setvbuf(stdout, NULL, _IONBF, 0);
	srand(time(NULL));
    char Uneta_rec[100];
    char pogodjena_slova[100];
    int brojac_greske = 6 , brojac_pogodjenih = 0;

    int brojac = 0 , pozicija = 0, pobeda, duzina , i;
    char unet_karakter;

    char nasumicna_rec [10][20];
    int ubacene_reci=0;

    FILE *lista_reci=fopen("Lista.txt","r");
    if(lista_reci==NULL){


    	printf("failed to open the file");
    	return 0;
    }
    char input[20];

    while(fgets(input,20,lista_reci)){
    	sscanf(input,"%s",nasumicna_rec[ubacene_reci]);
    	printf("scannd:input:%s nasumicna_rec[%d]:%s\n",input,ubacene_reci,nasumicna_rec[ubacene_reci]);
    	ubacene_reci++;
    }
    printf("Total words read in:%d\n",ubacene_reci);
    fclose(lista_reci);


    int nasumicni_broj= rand() % ubacene_reci;




    duzina = strlen(nasumicna_rec[nasumicni_broj]);

    for ( i = 0; i <9999; i++ )
    {
        printf("\n");/**za pomeranje konzole na dole kako se ne bi videlo resenje(zadata rec)**/

    }

    printf("\n\n Dobrodosli :D \n\n");
    printf("\n\n Imate 5 pokusaja da pogodite zadatu rec");


    printf("\n\n Pritisnite:Enter \n\n ");
    getchar();



        printf("\n\t||===== ");                 /**prikaz vesala**/
	printf("\n\t||    | ");
        printf("\n\t||      ");
        printf("\n\t||      ");
        printf("\n\t||      ");
        printf("\n\t||      ");

    printf("\n\n   Zadata rec ima %d slova \n\n",duzina);  /**za merenje duzine zadate reci,i obavestavanje igracu koliko zadata rec ima slova**/
    for( i = 0; i < duzina ; i++)
    {
        pogodjena_slova[i] = '_';
        pogodjena_slova[duzina] = '\0';
    }

    for(i = 0 ; i < duzina ; i++)
    {
        printf(" ");
        printf("%c",pogodjena_slova[i]);        /**za ispis n praznih crtica gde je n broj slova u zadatoj reci**/

    }
    while(brojac_greske != 0)
    {
        brojac_pogodjenih = 0;
        printf("\n\n   Unesite slovo od a-z!");
        printf("\n\n\t Unesite ovde --> ");

	    scanf("%c",&unet_karakter);

	    if(toupper(unet_karakter) < 'A' || toupper(unet_karakter) > 'Z') /**ako igrac unese karakter koji ne ulazi u opseg od a-z,program trazi da se unese ponovo**/
	        {

	           printf("\n\n\t Netacan karakter,pokusajte ponovo. ");
	            brojac_pogodjenih = 2;
	        }

    if (brojac_pogodjenih != 2)
    {
        for(brojac=0;brojac<duzina;brojac++)    /**za proveru da li uneto slovo postoji u nizu zadate reci**/
	    {
		    if(tolower(unet_karakter)==(nasumicna_rec[nasumicni_broj])[brojac])
		     {
		       brojac_pogodjenih = 1;
                     }
            }

	   if(brojac_pogodjenih == 0)                      /**u slucaju pogresno pogodjenog slova**/
	    {
     	      printf("\n\n Imate jos %d pokusaja :( \n\n ",--brojac_greske);

              vesala(brojac_greske);

	    }

	   else
	   {
	     for(brojac = 0; brojac < duzina; brojac++)
             {
     	         brojac_pogodjenih = 0;
                 if(tolower(unet_karakter) == (nasumicna_rec[nasumicni_broj])[brojac])
	          {
     		     pozicija = brojac ;
     		     brojac_pogodjenih = 1;
	          }
    	      if(brojac_pogodjenih == 1)
	          {
                 for(i = 0 ; i < duzina ; i++)
                 {
                      if( i == pozicija)
                  	  {
                          pogodjena_slova[i] = tolower(unet_karakter); /**za stavljanje pogodjenog slova na pravo mesto**/
                      }
                      else if( pogodjena_slova[i] >= 'a' && pogodjena_slova[i] <= 'z' ) /** ako pogodjeno slovo vec postoji na tom mesto ono se preskoci **/
                      {
                          continue;
                  	  }

                      else
                      {
                          pogodjena_slova[i] = '_';            /** za stavaljenje donje crte na mestu ne pogodjenih slova **/
                      }
                }
                Uneta_rec[pozicija] = tolower(unet_karakter);      /**za uporedjivanje unesenog slova i slova u zadatoj reci**/

                pobeda = strcmp(Uneta_rec,nasumicna_rec[nasumicni_broj]);      /**za uproredjivanje stringova**/

                if(pobeda == 0)                             /**u slucaju da igrac pogodi svako slovo zadate reci**/
                {
                    printf("\n\n\n  POBEDA!!!");
                    printf("\n\n\t zadata rec je bila : %s ",nasumicna_rec[nasumicni_broj]);
                    printf("\n\n Preziveli ste!!\n\n");
                    getchar();
                    return 0;
                }
	       }
	    }
      }
     }

    printf("\n\n\t");
    for(i = 0 ; i < duzina ; i++)
      {
          printf(" ");
          printf("%c",pogodjena_slova[i]);                /**pokazuje prazna mesta zajedno sa tacno unetim slovima**/
      }

    getchar();
    }

      if(brojac_greske <= 0)                                 /**u slucaju da igrac ne pogodi rec**/
      {
          printf("\n\n\t Zadata rec je bila: %s ",nasumicna_rec[nasumicni_broj]);
          printf("\n\n\n Stavljeni ste na vesala :/ ");


      }
getchar();
return 0;
}


Что я уже пробовал:

Помогите pls :DD,нужно это для моей оценки

2 Ответов

Рейтинг:
1

Rick York

Я не могу помочь с логикой программы, потому что не могу прочитать язык, на котором написаны все комментарии, переменные и строки.

Но я могу дать тебе небольшой совет насчет рисунка. Во - первых, вот некоторый код для рисования объекта :

// with zero wrong guesses - just started
printf("\t||=====\n" );
printf("\t||    |\n" );
printf("\t||     \n");
printf("\t||     \n");
printf("\t||     \n");
printf("\t||     \n");
printf("\t||     \n");

// with all wrong guesses - game lost
printf("\t||=====\n" );
printf("\t||    |\n");
printf("\t||    O\n");
printf("\t||    |\n");
printf("\t||   /|\\\n");
printf("\t||    |\n");
printf("\t||   / \\\n");
Обратите внимание на два момента : я всегда ставлю символ новой строки в конце, поэтому каждая новая строка начинается с нулевой позиции. Вы можете добавить интервал или что-то еще, если хотите начать с отступа. Кроме того, обратная косая черта действует как escape-символ. Чтобы отобразить обратную косую черту, она должна быть "экранирована", поэтому используйте двойную обратную косую черту. Вы можете увидеть это с правой рукой и правой ногой.

Самый простой способ сделать это с минимальным количеством повторяющихся кодов-использовать логику и основывать ее на том, сколько неверных предположений было сделано. Вы можете решить, как нарисовать каждую линию фигуры, основываясь на том, сколько было неправильных предположений. Вот некоторый код для этого :
void DrawObject( int wrongGuesses )
{
    char emptyLine[] = "\t||\n";
    // these two lines are always drawn
    printf( "\t||=====\n" );
    printf( "\t||    |\n" );
    // third line - just the head
    if( wrongGuesses > 0 )
        printf( "\t||    O\n" ); 
    else
        printf( emptyLine );
    // fourth line - adds the upper torso
    if( wrongGuesses > 1 )
        printf( "\t||    |\n" ); 
    else
        printf( emptyLine );
    // fifth line - adds the left arm
    if( wrongGuesses > 2 )
        printf( "\t||   /|\n" ); 
    else
        printf( emptyLine );
    // sixth line - adds the right arm
    if( wrongGuesses > 3 )
        printf( "\t||   /|\\\n" ); 
    else
        printf( emptyLine );
    // seventh line - adds the abdomen
    if( wrongGuesses > 4 )
        printf( "\t||    |\n" ); 
    else
        printf( emptyLine );
}
Для неправильных догадок 6 и 7 (>5 и >6) Вы можете скопировать код, чтобы нарисовать секцию оружия.

Если вы предпочитаете тернарный оператор вы можете написать логику следующим образом :
void DrawObject( int wrongGuesses )
{
    char emptyLine[] = "\t||\n";
    // these two lines are always drawn
    printf( "\t||=====\n" );
    printf( "\t||    |\n" );
    // third line - just the head
    printf( wrongGuesses > 0 ? "\t||    O\n" : emptyLine );
    // fourth line - adds the upper torso
    printf( wrongGuesses > 1 ? "\t||    |\n" : emptyLine ); 
    // fifth line - adds the left arm
    printf( wrongGuesses > 2 ? "\t||   /|\n" : emptyLine );
    // sixth line - adds the right arm
    printf( wrongGuesses > 3 ? "\t||   /|\\\n" : emptyLine );
    // seventh line - adds the abdomen
    printf( wrongGuesses > 4 ? "\t||    |\n" : emptyLine );
    // eighth line - adds the left leg
    printf( wrongGuesses > 5 ? "\t||   /\n" : emptyLine );
    // ninth line - adds the right leg
    printf( wrongGuesses > 6 ? "\t||   / \\\n" : emptyLine );


Рейтинг:
0

OriginalGriff

Это ваше домашнее задание, и заставить его работать должным образом - часть задачи, поэтому мы не можем просто сказать вам, в чем проблема и как ее решить! (И, честно говоря, я понятия не имею, что он делает, поскольку ни одно из имен переменных или комментариев не имеет для меня смысла - я не говорю по-Югославски!)

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!