Pętla do wisielca

0

Witam,
od niedawna uczę się programowania w języku C. Zabrałam się za pisanie gry typu wisielec. Pętla "while" która sprawdza i ewentualnie podstawia litery do tablicy "finałowej" działa, chciałam jednak ograniczyć ilość podanych błędnie liter. W tym momencie jednak, przy liczeniu errorów występuje błąd - przy podaniu litery która faktycznie została wpisana bo znajduje się w haśle dodaje się jeden błąd, przy podaniu litery która nie znajduje się w haśle dodają się dwa błędy. Zupełnie nie wiem skąd pojawia się ten błąd.
Serdecznie proszę o pomoc, wyjaśnienie. :)

 void gra(int j, char slowo[])
{

    int powt = 1, errors = 0, traf, i;
    char litera, wynik[j - 1];

    printf("Twoje haslo sklada sie z %d liter\n\n", j);

    for (i = 0; i < j;++i) {
        wynik[i] = '_';
        printf("%c ", wynik[i]);
    }
    printf("\n\n\n");

    while (powt > 0) {
        powt = 0;
        printf("Podaj litere:");
        litera = getchar();
        system("cls");
        traf = 0;
        for (i = 0; i < j; ++i) {
            if (wynik[i] == '_') {
                if (litera == slowo[i]) {
                    traf = 1;
                    wynik[i] = slowo[i];
                }
                else
                    powt = powt + 1;
            };
        }
        if (traf == 0) {
            errors = errors + 1;
            printf("errors: %d", errors);
        }

        znaki(j, wynik);
        if (powt < 1) {
            wygrana();
        }
    }
}
0
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Pozbądź się smrodku od inkrementacji: http://4programmers.net/Forum/1101404
    Wtedy może komuś się zechce analizować twój kod.
scanf(" %c", &litera);
0

wynik[j - 1]; - jeżeli dajesz tb[10] to masz 10 indeksów od tb[0] do tb[9] - masz za mała tablicę. Do tego radzę wykorzystać kolejne bity w uint64_t
Pętle wyświetlająca wynik przenieś do głównej pętli.
W sumie tu więcej złych wierszy niż dobrych, znalazłem tu jakiś stary kod:

#include <stdio.h>
#include <ctype.h>
#include <string.h>

void game(char word[])
  {
   char tb[]="    +\n    |\n    O\n   /|\\\n    |\n   /'\\\n   | |\n\n"; /* może jeden znak trzeba na spacje zamienić */
   char ch;
   size_t i,count,used,found,length,error=0;    
   unsigned long long mask=0,one=1,add; /* maska dla liter */
   length=strlen(word);   
   for(;;)
     {
      for(i=count=found=0;tb[i];++i)
        {
         if((isspace(tb[i]))||(found++<error)) putchar(tb[i]);
         else
           {
            putchar(' ');
            ++count;
           }
        }
      for(i=0;word[i];++i) putchar(mask&(one<<i)?toupper(word[i]):'*');
      printf("\n");
      if(!count)
        {
         printf("Wiselec skoncozny, przegrales\n");
         return;
        }
      if(mask+1==one<<length)
        {
         printf("Odkryles cale slowo, wygrales\n");
         return;
        }
      printf("Podaj litere: ");
      scanf(" %c", &ch);
      ch=toupper(ch);
      while(getchar()!='\n') {} /* opróżniamy bufor klawiatury */
      for(found=used=i=0;i<length;++i)
        {
         if(toupper(word[i])==ch)
           {
            add=one<<i;
            if(mask&add)
              {
               used=1;
               break;
              }
            mask|=add;
            ++found;
           }
        }
      if(used) printf("litera %c już jest widoczna\n\n",ch);
      else if(found) printf("litera %c wystepuje %d razy\n\n",ch,found);
      else printf("litera %c nie wystepuje. Nieodpowiednia litera %d razy\n\n",ch,++error);
     }
  }

int main()
  {
   game("reprodukcja");
   return 0;
  }
0

Dziękuje za pomoc. Mogłabym się dowiedzieć jednak na czym polega użycie "for(;;)"? Próbowałam googlować, nie mogę jednak nic znaleźć.

1 użytkowników online, w tym zalogowanych: 0, gości: 1