• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wybór opcji w tekstowym menu.

Object Storage Arubacloud
0 głosów
426 wizyt
pytanie zadane 12 lipca 2015 w C i C++ przez Chejron Początkujący (270 p.)
Więc,

Mam pomysł, żeby zrobić w moim programie menu, które działa w sposób następujący::

Kiedy klikam strzałkę w górę  - przed opcją powyżej pojawia się np." -->" Podobnie  z klikaniem w dół. (tu też przydałaby się pomoc, bo umiem zrobić poruszanie się po menu za pomocą "w" i "s", ale nie mam pojęcia jak ze strzałkami, chociaż czy jest to jakieś super ważne?)

I o ile udało mi się to jakoś wykombinować, to problem pojawia się dalej. Miłoby było, gdyby potem po kliknięciu entera program "rozpoznawał" gdzie znajduje się strzałka i w zależności od tego uruchamiał odpowiednią funkcję.

Po długim kombinowaniu i sporej ilości switch-ach program potrzebował podwójnego kliknięcia "w" lub "s", a na dodatek "rozpoznawał" tylko co zostało wcześniej kliknięte, a nie gdzie obecnie jest "kursor". No i w tym miejscu się załamałem.

W skrócie: Potrzebuję 1. Poruszania się góra-dół 2. Rozpoznawanie obecnej pozycji strzałki 3.Uruchomienie odpowiedniej funkcji po kliknięciu enter (w zależności od obecnej pozycji strzałki).

3 odpowiedzi

+1 głos
odpowiedź 12 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
wybrane 13 lipca 2015 przez Chejron
 
Najlepsza

Chwilowo ma takie coś

Mam nadzieję że to minimalnie pomoże:

#include <iostream>
#include <conio.h>
#include <Windows.h>

using namespace std;

int start()
{
    int wyb = 1;
    char wybor;
    while(true)
    {
        system(" cls ");
        cout << "Witaj w czelusciach mojej wyobrazni!" << endl;
        if(wyb==1) cout << "-->";
        cout << "1.Witaj" << endl;
        if(wyb==2) cout << "-->";
        cout << "2.Kim jesteś?" << endl;
        if(wyb==3) cout << "-->";
        cout << "3.A jest tutaj piwo?" << endl;
        wybor = getch();
        if(wybor=='w')
        {
            if(wyb==1) continue;
            wyb -= 1;
        }
        if(wybor=='s')
        {
            if(wyb==3) continue;
            wyb += 1;
        }
        if(wybor=='q') //Taki enter, funkcja zwraca wybrany wybor do innej funkcji
        {
            return wybor;
        }
    }

}

int main()
{
    int ilewyb=0;
    start();

    return 0;
}

 

komentarz 12 lipca 2015 przez Chejron Początkujący (270 p.)
Ooo... wielkie dzięki! Właśnie o coś tego typu chodziło.

A jeszcze pytanko. Jak w tym kodzie działa "q"? Rozumiem, że przyciśnięcie "q" prowadzi do odpowiedniego ifa zależnie od wartości "wyb". Tyle, że nie widzę, w które miejsce. (Nie wiem gdzie mam wstawiać odpowiadające opcjom funkcje)
komentarz 12 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 12 lipca 2015 przez Dorion300

Źle napisałem, powinno być:

return wyb;

Tutaj bardziej rozwinąłem kod:

#include <iostream>
#include <conio.h>
#include <Windows.h>

using namespace std;

int renderujswiat(string *tab,int rozmiar)
{
    int wyb = 1;
    char wybor;
    while(true)
    {
        system(" cls ");
        cout << tab[0] << endl;
        for(int i=1;i<rozmiar;i++)
        {
            if(wyb == i) cout << "-->";
            cout << tab[i] << endl;
        }
        wybor = getch();
        if(wybor=='w')
        {
            if(wyb==1) continue;
            wyb -= 1;
        }
        else if(wybor=='s')
        {
            if(wyb==rozmiar) continue;
            wyb += 1;
        }
        else if(wybor=='q')
        {
            return wyb;
        }
    }

}

int main()
{
    const int rozmiar = 4;
    string tab[rozmiar];
    tab[0] = "Witaj w czelusciach mojej wyobrazni!";
    tab[1] = "1.Witaj";
    tab[2] = "2.Kim jesteś?";
    tab[3] = "3.A jest tutaj piwo?";

    int wybor = renderujswiat(tab,rozmiar);

    system(" cls ");
    cout << "twoj wybor to: '" << tab[wybor] << "'";
    return 0;
}

 

komentarz 12 lipca 2015 przez Chejron Początkujący (270 p.)
Czyli dopiero na samym końcu mam pisać if(wybor==1) if(wybor==2) itd?
komentarz 12 lipca 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 12 lipca 2015 przez Dorion300
Tak.

Ale raczej tu akurat twój wybór.

Możesz zmienić mój kod i zrobić troszeczkę inaczej.

Ja piszę dość specyficznie.

Czyli próbuję rościelić wszystko co się da w osobnych funkciach, obiektach.

Ja napisalem gotową funkcję która ci renderuje "świat" z tablicy i zwraca wybrane pole.
komentarz 12 lipca 2015 przez Chejron Początkujący (270 p.)
Nie do końca rozumiem na czym polega to renderowanie "świata", ale jeszcze chwilę poeksperymentuję, pokasuję co można, pododaję i ogólnie postaram się każdy znak ogarnąć i wtedy mam nadzieję, że zrozumiem jak to działa jako całość ^^. Na razie najważniejsze, że działa i chyba wiem jak edytować na swój sposób
komentarz 12 lipca 2015 przez Dorion300 Szeryf (90,250 p.)

"Nie do końca rozumiem na czym polega to renderowanie "świata""

Po prostu tworzysz tablice, w elemencie [0] dajesz główne pytanie.

Resztę dajesz odpowiedzi.

Następnie dajesz do funkcji tablicę i jej wielkość.

Następnie funkcja robi resztę roboty.

A gdy skończy, daje ci wynik w postaci int'a (Zwraca wybrany wybór)

I tutaj robisz resztę rzeczy.

Popełniłem mały błąd w kodzie i powinno być:

int renderujswiat(string *tab,int rozmiar)
{
    int wyb = 1;
    char wybor;
    while(true)
    {
        system(" cls ");
        cout << tab[0] << endl;
        for(int i=1;i<rozmiar;i++)
        {
            if(wyb == i) cout << "-->";
            cout << tab[i] << endl;
        }
        wybor = getch();
        if(wybor=='w')
        {
            if(wyb==1) continue;
            wyb -= 1;
        }
        else if(wybor=='s')
        {
            if(wyb==rozmiar) continue; //Tutaj poprawiłem
            wyb += 1;
        }
        else if(wybor=='q')
        {
            return wyb;
        }
    }

}

Ponieważ kursor się nie ruszał gdy dochodził do np. 4

komentarz 12 lipca 2015 przez Chejron Początkujący (270 p.)
Z tobą życie staje się prostsze
komentarz 12 lipca 2015 przez Chejron Początkujący (270 p.)
A jakbym chciał zrobić tak, żeby nad tym wszystkim był jakiś tekst, to jak to zrobić? Bo w "renderujswiat" jest system("cls"), które skutecznie uniemożliwia taki zabieg ...
komentarz 12 lipca 2015 przez Dorion300 Szeryf (90,250 p.)

Możesz w "rederujswiat" dodać ten tekst.

Jeśli tekst będzie statyczny (Nie będzie się zmieniał) to śmiało taką rzecz zrób.

while(true)
{
     system(" cls ");
     cout << "BrutalGame" << endl;
     //dalszy kod w renderujswiat

 

komentarz 13 lipca 2015 przez Chejron Początkujący (270 p.)
Jeszcze jedno. ^^ Jeślibym chciał mieć dużo podobnego typu menu, to muszę robić takie same schematy dla każdego kolejnego? Czy jest jakaś sposób, aby nie używać tyle razy "kopiuj-wklej"?
0 głosów
odpowiedź 12 lipca 2015 przez niezalogowany
Hm, niby proste, ale jednak teraz tego nie napiszę, bo nie ma mnie na konputerze :| Ale mogę ci dać rady ;) No więc: stwórz zmienną, która będzie wyczuwała (getch()) która strzałka została naciśnięta, a następnie w if()-ie sprawdź czy została wciśnięta strzałka w jakąś_tam_stronę i sprawdź czy bool opcjaPierwsza jest równa true, a pozostałe false. Ta jedna będzie true, bo pierwszy string to będzie "--> Opcja pierwsza", a nie " Opcja pierwsza". Następnie if()-y, które znowu sprawdzają bool-e, dzięki czemu wiedzą, którą funkcję wykonać... Oj, nie wygląda to jak przepis ns program, ale teraz nie mogę trgo napisać :'( Jak nikt nie napisze, to zrobię ci to jutro ;)
0 głosów
odpowiedź 12 lipca 2015 przez hit02 Nałogowiec (33,970 p.)
edycja 12 lipca 2015 przez hit02

Akurat miałem chęć na kodzenie, więc napisałem takie proste menu. Funkcja przyjmuje tablicę C-stringów zakończoną NULL i zwraca indeks wybranej opcji. Starałem się pisać uniwersalnie, więc powinno zadziałać w większości przypadków. smiley

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int menu(char *tab[])
{
	int selected = 0, enter = 0, length = 0, key = 0;
	
	//Liczenie długości tablicy
	for(; tab[length] != NULL; length++);
	
	while(!enter)
	{
		system("cls");
		for(int i = 0; i < length; i++)
		{
			if(i == selected)
			{
				printf(">>%s<<\n", tab[i]);
			}
			else
			{
				printf("  %s\n", tab[i]);
			}
		}
		key = getch();
		
		//Obsługa entera
		if(key == 13)
		{
			enter = 1;
		}
		
		//Sprawdzanie, czy klawisz należy do
		//klawiszy specjalnych (np. strzałki) i
		//czy jest jeszcze kod klawisza w buforze
		if(key == 224 && kbhit())
		{
			key = getch();
			//strzałka w górę
			if(key == 72)
			{
				selected--;
				if(selected < 0)
					selected = length - 1;
			}
			//strzałka w dół
			if(key == 80)
			{
				selected++;
				if(selected >= length)
					selected = 0;
			}
		}
	}
	return selected;
}

int main()
{
	char *tab[] =
	{
		"Pierwszy element",
		"Drugi element",
		"Enty element",
		"Trolololo",
		"alamakota",
		"hahaha",
		"lol",
		"ToJuzKoniec",
		NULL
	};
	printf("Wybrales opcje numer: %i!!!", menu(tab));
	return 0;
}

Podobne pytania

0 głosów
3 odpowiedzi 201 wizyt
pytanie zadane 7 kwietnia 2019 w C i C++ przez boniek Nowicjusz (190 p.)
+1 głos
2 odpowiedzi 535 wizyt
0 głosów
2 odpowiedzi 300 wizyt

92,584 zapytań

141,433 odpowiedzi

319,668 komentarzy

61,966 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...