Nieskończona pętla, która nie powinna być nieskończona....

0

Witam. Uczę się programowanie już trochę czasu i nigdy nie zdarzyło mi się nie rozwiązać tak prostego problemu. Otóż piszę grę Quiz w konsoli, która z założenia ma zadawać pytania z różnych dziedzin wiedzy wybranej ilości użytkownikom, sprawdzać poprawność odpowiedzi, przyznawać punkty, a na końcu oczywiście wyłonić zwycięzcę. Na samym początku pisania tej aplikacji spotkałem się z dziwnym błędem. Otóż gdy uruchomię aplikację testując działanie funkcji Dodaj_Usera(), po podaniu ilości graczy program wypisuję w konsoli niezależnie od podanej ilości dwa razy "Podaj nazwę użytkownika: ", a gdy się poda, w nieskończoność robi to samo (a przecież pętla nie jest nieskończona!!!), lecz potem program wypisuję "Podaj nazwę użytkownika: " tylko raz. Proszę o pomoc.


    static void Main(string[] args)
    {
        wszystkiePytania();

        Console.WriteLine("Podaj ilość graczy biorących udział w rozgrywce: ");
        ilosc = Console.Read();

        Dodaj_Usera(ilosc);

        //////////////////////////////////////////////////////////////////////////////////////////////

        Console.WriteLine("Z jakiej dziedziny wiedzy chcesz się zmierzyć z botem lub przeciwnikiem/przeciwnikami?");
        Console.WriteLine("a - programowania"); Console.WriteLine("b - historii"); Console.WriteLine("c - muzyki"); Console.WriteLine("d - fizyki");
        Console.WriteLine("e - matematyki"); Console.WriteLine("f - biologii"); Console.WriteLine("g - wszystkich na raz");

        jaka_dziedzina = Console.ReadLine();
    }

    static void Dodaj_Usera(int ile)
    {

      string[] nazwa = new string[ile];

       while (ile > 0)
        {
            Console.WriteLine("Podaj nazwę użytkownika: "); nazwa[ile - 1] = Console.ReadLine();

            Users.Add(new User { nick = nazwa[ile - 1], pkt = 0 });

            ile--;
        } 

    }
0

Na pewno do poprawy masz to, że po wykonaniu Console.Read() w buforze konsoli w dalszym ciągu zostaje znak nowej linii (enter), przez co następne ReadLine jest od razu wykonywane (no bo wciąż ten enter tam wisi).
Poza tym mieszasz nazewnictwo polskie oraz angielskie oraz raz_piszesz_w_taki_sposób aPotemZnowuWTaki i-it-LoOkS-brzyDKo.

Edit: no i nie zbijaj instrukcji w jedną linię - mówię o tych Console.WriteLine z dziedzinami: jedno Console.WriteLine - jedna linijka kodu.

0

@Patryk27 Poprawiłem

 ilosc = Console.Read; 

na ilosc = Console.ReadLine();

, ale wyświetla mi się komunikat: "Reads the next line of characters from the standard input stream".
0

I w czym problem? To jest definicja metody ReadLine i oznacza tyle, że jak coś wpiszesz i wciśniesz Enter, to ten wpisany tekst (bez znaku nowej linii) wyląduje w zmiennej, a znak nowej linii zostanie wczytany i przepadnie. W ten sposób zostanie wyeliminowany problem pojawiania się dwa razy "Podaj nazwę użytkownika: ", o czym już napisał @Patryk27. Aha, jeszcze sprawdzaj metodą int.TryParse, czy wpisany tekst jest liczbą.

0

@ness W tym problem, że kompilator wyrzuca mi błąd, a gdy uruchomię aplikację nadal wyrzuca mi "Podaj nazwę użytkownika: " dwa razy. I nadal nie wiem dlaczego ta pętla jest nieskończona.

0

A ten błąd kompilatora to...?
Ten kod:

        static void Main(string[] args)
        {
            Console.WriteLine("Podaj ilość graczy biorących udział w rozgrywce: ");
            string answer = Console.ReadLine();
            int ilosc;

            if (!int.TryParse(answer, out ilosc))
                return;

            Dodaj_Usera(ilosc);

            Console.WriteLine("Z jakiej dziedziny wiedzy chcesz się zmierzyć z botem lub przeciwnikiem/przeciwnikami?");
            Console.WriteLine("a - programowania"); Console.WriteLine("b - historii"); Console.WriteLine("c - muzyki"); Console.WriteLine("d - fizyki");
            Console.WriteLine("e - matematyki"); Console.WriteLine("f - biologii"); Console.WriteLine("g - wszystkich na raz");

            string jaka_dziedzina = Console.ReadLine();
        }

        static void Dodaj_Usera(int ile)
        {

            string[] nazwa = new string[ile];

            while (ile > 0)
            {
                Console.WriteLine("Podaj nazwę użytkownika: "); 
                nazwa[ile - 1] = Console.ReadLine();
                ile--;
            }
        }

działa mi prawidłowo (wycięłam pewne fragmenty, bo nie wstawiłeś wszystkiego i nie kompilowało się u mnie).

0

Nie wyrzucało mi w kompilatorze właśnie żadnego błędu, ale pętla była nieskończona. Ale problem już rozwiązany bardzo Ci dziękuję za pomoc :) i wszystkim którzy odpowiedzieli.

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