zapĘtlone menu na switch-ach

0

Witajcie.

Czy ktoś moglby mi pomoc w moich probleme z menu.

W pierwszy menu wybieram '1' ,i jestem w kolejnym, i tu zaczyna sie problem po wyborze innym niz 1,2,3,4 zostaje wyswietlony prawidlowo napisany cout, lecz znowu jestem we wczesniejszym menu i znowu musze wybierac opcje 1,

int main()
{
    menu();
    do
    {
        cout<<"Twoj wybor to: ";
        wybor=getch();
        switch(wybor)
        {
        case '1':
            system("cls");
            iloscgraczy();
            ilugraczy=getch();

            {
                switch(ilugraczy)
                {
                case '1':
                    system("cls");
                    iloscgraczy();
                    cout<<"1"<<endl<<endl;
                    break;
                case '2':
                    system("cls");
                    iloscgraczy();
                    cout<<"2"<<endl<<endl;
                    break;
                case '8':
                    system("cls");
                    menu();
                    break;
                case '9':
                    system("cls");
                    koniecilugraczy ();
                    break;
                default:
                    system("cls");
                    iloscgraczy();
                    cout<<"zl ilosc graczy!!! uzyj klawisza od '1' do '4' ";
                    ilugraczy=getch();
                    break;
                }
                break;
            }
        case '2':
            system("cls");
            menubezdwa ();
            zasady();
            break;
        case '3':
            system ("cls");
            menubeztrzy ();
            ranking();
            break;
        case '4':
            system("cls");
            menubezcztery();
            autor();
            break;
        case '9':
            koniecmenu();
            break;
        default:
            system("cls");
            menu();
            cout<<"-----NIE MA TAKIEJ OPCJI W MENU !!!-----"<<endl<<endl;
            cout<<"=========================================="<<endl<<endl;
            break;
            cout<<endl;
        }
    }
    while (wybor!='9');
    return 0;
0
  1. Dlaczego nikt nie odpowiada w moim wątku?
  2. Językowo, stylistycznie, gramatycznie i ortograficznie ten post jest... marny. Popraw chciaż najbardziej rażące błędy.
  3. Nawet nie wiedziałem, że funkcje można deklarować po przecinku. Pomimo, że nie ma to sensu i jest nieczytelne, to mimo jednak czegoś się od ciebie nauczyłem.
  4. Sam design jest spaprany, powinieneś używać jak najmniejszej liczby wcięć. Poza tym, widzę, że umiesz w funkcje- więc dlaczego ich nie użyjesz?
  5. W ogóle ten kod to jest jakiś wtf.
  6. Jeśli oglądasz Mirka Zelenta to przestań.
0
  • Zapomnij o funkcji getch(), sprawa wiele problemów.
  • A co do twojego problemu, wystarczy, że użyjesz pętli do-while w samym case 1, która będzie się wykonywać dopóki podana liczba graczy jest niepoprawna w przedziale. Np. coś takiego:
case 1:
    do
    {
        std::cout << "Liczba graczy: ";
        std::cin >> quantityPlayers;

        switch (quantityPlayers)
        {

        case 1:
            std::cout << "JEDEN\n";
            break;

        case 2:
            std::cout << "DWA\n";
            break;

        case 3:
            std::cout << "TRZY\n";
            break;

        default:
            std::cout << "ZLA ILOSC";
            break;
        }
    }
    while (quantityPlayers < 1 || quantityPlayers > 3);
    break; 
0

Niestety nie moge tego przeskoczyc:( moze jeszcze jakas rada ??

0

Jeśli chcesz użyć gotowego rozwiązania: https://gist.github.com/KrzaQ/10a035a905d6cfe1a458#file-db-cpp-L135-L290
Idealne nie jest, ale działa.

2

Zacytuję klasyka:
"Bad programmers worry about the code. Good programmers worry about data structures and their relationships." Linus Torvalds.

Mam wrażenie, że w twoim kodzie nie ma w ogóle czegoś takiego jak struktury danych i ich relacje o.O Czemu masz osobne funkcje menubeztrzy czy menubezcztery, zamiast zapisywać gdzieś ostatnio wybraną pozycję w menu i zrobić jedną funkcję, która będzie ukrywała wszystkie pozycje menu oprócz tej jednej?

Albo np. po co ci te dwie case:

   case '1':
                    system("cls");
                    iloscgraczy();
                    cout<<"1"<<endl<<endl;
                    break;
                case '2':
                    system("cls");
                    iloscgraczy();
                    cout<<"2"<<endl<<endl;
                    break;

Skoro to jest dokładnie ten sam kod, po prostu drukujesz wartość zmiennej wybor. Jednak ponieważ nie nauczyłeś się korzystać ze zmiennych, idziesz złą drogą i tworzysz case do każdej wartości zmiennej.

Co jeśli w menu będziesz miał 100 pozycji? Idąc tym tokiem programowania, musiałbyś zrobić 100 funkcji typu menubezsiedemdziesiątjeden oraz 100 case'ów...
Używając zmiennych (używając, w sensie rozumiejac jak działają, a nie tylko deklarują) być może w ogóle byś nie musiał korzystać ze switch/case...

Czyli w skrócie: skupiasz się na złych rzeczach, a nie zauważasz tego, że wszystkie poszczególne przypadki (wybor 1, 2, 3...) należą do tego samego zbioru rozwiązań i nie ma potrzeby robić np. osobnych funkcji do ukrywania dwójki, bo czy dwójka, czy trójka to i tak pewna liczba, pewnego rodzaju "dana".

Nie chodzi o to, żeby obsługiwać każdy przypadek osobno (bo to robisz), tylko o to, żeby napisać prosty kod, który działa dla dużej liczby przypadków (przypadek, np. wartość zmiennej wybór).

0

To jest cały kod tego co na razie napisałem, moze ktos go sobie odpali, i powie w czym błąd, dodam że to jest pierwszy samodzielny program jaki pisze.

0

poczytaj o tablicach, bo pozycje w menu możesz wsadzić do tablicy (albo do innej podobnej struktury danych). Zamiast rozpatrywać każdy przypadek osobno to robisz listę pozycji w menu (czy listę innych rzeczy), np:

#include <iostream>
using namespace std;


int main() {
    char* items[] = {"pierwsza pozycja w menu"/*zerowa*/, "druga pozycja"/*dla komputera pierwsza*/, "trzecia"};
    int len = 3;  
    int selected = 2;
    int index = selected - 1;  // indeksy tablicy zaczynaja sie od zera, wiec musimy odjac 1 od wybranej
    cout << "bez pozycji numer " << selected << "\n";
    for (int i = 0; i < len; i++) {
        if (i != index)
            cout << i + 1 << ". " << items[i] << "\n";
    }
}

(nie wiem na ile jest to zgodne z obecnymi dobrymi praktykami C++, czy może lepiej użyć vectora czy czegoś innego zamiast tablicy, ale chodzi mi o ogólne zasady, nawet jeśli ta prawidłowa implementacja w danym języku będzie trochę inna).

to ci drukuje takie coś:
`bez pozycji numer 2

  1. pierwsza pozycja w menu
  2. trzecia`

więc możesz za pomocą jednej funkcji obsłużyć wszystkie przypadki.

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