BEGINNER - prosta gra, liczenie błędów/ C

0

Nie muszę pewnie dodawać, że jestem mocno początkujący, a szczególnie w C. Probuję zrobić Wisielca w C. Głowna cześc programu ma polegać na tym, że tworzę tablice znaków ze słowem do odgadnięcia i wypelniam ją "podłogami" (znak "_"). Potem jest pętla while, która wykonuje sie do momentu, do kiedy liczba wpisanych znaków jest mniejsza od długości wyrazu. Program pyta użytkownika o literę i wczytuje ją. W tej pętli jest pętla for przeszukująca tablice z naszym słowem, sprawdzająca czy podana przez użytkownika litera zgadza się, jeśli tak to jest ona wpisywana na to samo miejsce w nowej tablicy, która wczesniej była wypełniona samymi podłogami. To wszystko wykonywało się poprawnie. Problem pojawia się, kiedy muszę śledzić ilość błędnie wpisanych liter. Zrobiłem prowizoryczną zmienną miss mającą wartości 1 lub 0 (odpowiedniki logicznych wartosci bool'owskich). Miało to działać tak, że jeśli użytkownik trafi literę to zmienia ona wartośc na 0. Wcześniej miała przypisaną wartość 1. Jeśli użytkownik nie trafi, wartośc nie zmienia się, czyli zostaje 1. Po obejściu pętli był if, który miał zwiększać liczbę błędów o 1, jeśli wartosc miss jest 1.

Niestety, kiedy wpiszę dobrą literę liczba błędów zwiększa się o 1, a jeśli złą to o 2. Wklejam fragment kodu, będzie tam pare linijek "niepotrzebnych", które jednak są potrzebne do całości działania programu.


#include <stdio.h>
#include <math.h>

struct randomWord
{
    char word[20];
    int length;
} w1 = { "menstruacja", 11 }, w2 = { "emancypacja", 11 }, w3 = { "onomatopeja", 11 },
  w4 = { "infrastruktura", 14 };

void hangMan()
{
    int wordIndex = 0;
    srand(time(NULL));
    wordIndex = (rand() % 1) + 1;

    char newWord[20];
    char podloga = '_';
    int liczbaLiterWpisanych = 0;
    int i;
    char letter;
    int nietrafione = 0;
    int miss = 0;

    /* Zape³nianie tablicy z odpowiedzi¹ "pod³ogami" i wypisanie tej tablicy */
    for (i = 0; i < w1.length; i++)
    {
        newWord[i] = podloga;
        printf(" %c ", newWord[i]);
    }

    while (liczbaLiterWpisanych < w1.length)
    {
        if (miss == 1)
            nietrafione++;
        printf("\nLiczba nietrafionych: %i", nietrafione);
        miss = 1;
        printf("\nPodaj litere : ");
        scanf("%c", &letter);
        system("cls");

        for (i = 0; i < w1.length; i++)
        {
            if (w1.word[i] == letter)
            {
                miss = 0;
                newWord[i] = letter;
                liczbaLiterWpisanych++;
            }
        }
        for (i = 0; i < w1.length; i++)
        {
            printf(" %c ", newWord[i]);
        }
    }
}

int main()
{
    hangMan();

    return 0;
}


 

EDIT: kod sformatowany przy pomocy http://format.krzaq.cc/

2
  1. Zapoznaj się z pojęciem formatowania kodu: http://4programmers.net/Forum/998482
  2. Nie nadużywaj postinkrementacji: http://4programmers.net/Forum/1101404 for(i=0;i<10;++i) - działa lepiej.
  3. Zapoznaj się z: memset(), strcpy(), strchr()
  4. Zacznij używać własnych funkcji
  5. Przenieś wypisywanie w jedno miejsce.
2

Dodatkowe zwiększenie się zmiennej jest spowodowane tym, że scanf pobiera ze strumienia wejściowego dwa znaki, a nie jeden. Np. x<ENTER>, gdzie <ENTER> to '\n', czyli na większości systemów 10. Poproś funkcję scanf, aby ignorowała białe znaki: scanf(" %c", &letter); (przed %c jest spacja)

0

Dzięki wielkie @_13th_Dragon i @kq za odpowiedź, problem rozwiązany. Żeby nie zakładać nowego tematu to zapytam tutaj.

Program ma już funkcje pobierającą imie/nick użytkownika (playerName), ma też funkcje (saveScore) która pobiera od funkcji gry (hangMan) wynik gracza i zapisuje ten wynik do pliku. Chcę to teraz połączyć, żeby funkcja pobierająca imie użytkownika także je zwracała do funkcji saveScore. Wtedy funkcja saveScore brałaby dwa argumenty (wynik i imie gracza) i zapisywałaby je do pliku w jednej linii (np. gracz Player, jego wynik 70, w pliku zapisane "1. Player - 70".) I tutaj jest problem, bo domyślam się, że funkcja playerName musi zwrócić tablice znaków, albo wskaźnik do jej pierwszego elementu, jak miałoby to wyglądać? Gdzie nie szukałem, wszędzie były odpowiedzi na postawie C++, co jednak sie troche różni. Także:

  1. Jak napisac funkcje zwracającą imie gracza i jak napisać tę funkcję jako zmienną (np. char a = funkcja(); ?)
  2. Jak dopisac do argumentu funkcji pobierającej imie gracza tę tablicę/wskaźnik.
  3. Wstawię też fragment kodu zapisującego wynik do pliku przerobiony prowizorycznie na kod, który zapisywałby wynik i imie gracza, do sprawdzenia.
int saveScore (int wynik, /*tutaj imie gracza jako argument */)
{
    system ("cls");
    FILE *plik;
    int score = wynik;
    /*w tym miejscu deklaracja zmiennej z imieniem gracza*/

    plik=fopen("highscore.txt", "a");

    fprintf(plik, "%s\t%i\n", /*imiegracza*/, score);

    fclose(plik);
}
1

Nie maż po ekranie w funkcjach nie zajmujących się ekranem, chodzi o system ("cls");

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