Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zamiana wielu warunków na jeden warunek w pętli for

Ostatnio zmodyfikowano 2009-12-27 02:43
Autor Wiadomość
snake_yaro
Temat założony przez niniejszego użytkownika
Zamiana wielu warunków na jeden warunek w pętli for
» 2009-12-25 11:39:01
Witam. Przejdę do rzeczy - mam taki oto kod:

C/C++
if( ktory == 1 )
{
    mvprintw( 0, 1, "" );
    mvprintw( 0, 2, "" );
    mvprintw( 1, 0, "" );
    mvprintw( 1, 1, "" );
    mvprintw( 1, 2, "" );
    mvprintw( 2, 0, "" );
    mvprintw( 2, 1, "" );
    mvprintw( 2, 2, "" );
    attron( A_REVERSE );
    mvprintw( 0, 0, "" );
}
if( ktory == 2 )
{
    mvprintw( 0, 0, "" );
    mvprintw( 0, 2, "" );
    mvprintw( 1, 0, "" );
    mvprintw( 1, 1, "" );
    mvprintw( 1, 2, "" );
    mvprintw( 2, 0, "" );
    mvprintw( 2, 1, "" );
    mvprintw( 2, 2, "" );
    attron( A_REVERSE );
    mvprintw( 0, 1, "" );
}
if( ktory == 3 )
{
    mvprintw( 0, 0, "" );
    mvprintw( 0, 1, "" );
    mvprintw( 1, 0, "" );
    mvprintw( 1, 1, "" );
    mvprintw( 1, 2, "" );
    mvprintw( 2, 0, "" );
    mvprintw( 2, 1, "" );
    mvprintw( 2, 2, "" );
    attron( A_REVERSE );
    mvprintw( 0, 2, "" );
}

if( ktory == 4 )
{
    mvprintw( 0, 0, "" );
    mvprintw( 0, 1, "" );
    mvprintw( 0, 2, "" );
    mvprintw( 1, 1, "" );
    mvprintw( 1, 2, "" );
    mvprintw( 2, 0, "" );
    mvprintw( 2, 1, "" );
    mvprintw( 2, 2, "" );
    attron( A_REVERSE );
    mvprintw( 1, 0, "" );
}

if( ktory == 5 )
{
    mvprintw( 0, 0, "" );
    mvprintw( 0, 1, "" );
    mvprintw( 0, 2, "" );
    mvprintw( 1, 0, "" );
    mvprintw( 1, 2, "" );
    mvprintw( 2, 0, "" );
    mvprintw( 2, 1, "" );
    mvprintw( 2, 2, "" );
    attron( A_REVERSE );
    mvprintw( 1, 1, "" );
}

if( ktory == 6 )
{
    mvprintw( 0, 0, "" );
    mvprintw( 0, 1, "" );
    mvprintw( 0, 2, "" );
    mvprintw( 1, 0, "" );
    mvprintw( 1, 1, "" );
    mvprintw( 2, 0, "" );
    mvprintw( 2, 1, "" );
    mvprintw( 2, 2, "" );
    attron( A_REVERSE );
    mvprintw( 1, 2, "" );
}

if( ktory == 7 )
{
    mvprintw( 0, 0, "" );
    mvprintw( 0, 1, "" );
    mvprintw( 0, 2, "" );
    mvprintw( 1, 0, "" );
    mvprintw( 1, 1, "" );
    mvprintw( 1, 2, "" );
    mvprintw( 2, 1, "" );
    mvprintw( 2, 2, "" );
    attron( A_REVERSE );
    mvprintw( 2, 0, "" );
}

if( ktory == 8 )
{
    mvprintw( 0, 0, "" );
    mvprintw( 0, 1, "" );
    mvprintw( 0, 2, "" );
    mvprintw( 1, 0, "" );
    mvprintw( 1, 1, "" );
    mvprintw( 1, 2, "" );
    mvprintw( 2, 0, "" );
    mvprintw( 2, 2, "" );
    attron( A_REVERSE );
    mvprintw( 2, 1, "" );
}

if( ktory == 9 )
{
    mvprintw( 0, 0, "" );
    mvprintw( 0, 1, "" );
    mvprintw( 0, 2, "" );
    mvprintw( 1, 0, "" );
    mvprintw( 1, 1, "" );
    mvprintw( 1, 2, "" );
    mvprintw( 2, 0, "" );
    mvprintw( 2, 1, "" );
    attron( A_REVERSE );
    mvprintw( 2, 2, "" );
}
attroff( A_REVERSE );

Dzięki temu kodowi można biegać kursorem po macierzy 3x3. Rozróżnia dziewięć przypadków, wszystko ładnie śmiga, nie ma problemu. Natomiast trudność polega na tym, że zamierzam zrobić macierz 15x15 i tych warunków musiałoby być 225. Dlatego muszę mieć do tego pętle, aby nie robić tego osobno. Oczywiście próbowałem coś zrobić sam, nie żebym przychodził do Was z niczym, jednakże moje wielogodzinne starania spełzły na niczym.

C/C++
for( int i = 1; i <= 9; i++ )
{
    if( ktory == i )
    {
        for( int j = 0; j <= 2; j++ )
        {
            for( int k = 0; k <= j; k++ )
            {
                mvprintw( j, k, "" );
            }
            attron( A_REVERSE );
        }
    }
    attroff( A_REVERSE );
}

Przy tym kodzie kursor od razu przechodzi z pozycji 0,0 do 2,2 tak jakby wszystkie przejścia głównej pętli wykonywały się od razu. Nie działa. Może ktoś ma jakiś inny, lepszy pomysł. Dziękuję za jakikolwiek odzew. 
P-12455
lynx
» 2009-12-25 13:59:06
Możesz zrobić buforek(tablicę) z charów czy czegoś innego. Do niego najpierw przypisać wartości normalnego pola, a następnie podmienić odpowiednie pole na którym 'się znajdujemy' na inny znak. Na koniec wyświetlasz tą tablicę, możliwe że w postaci innych wartości.


Kolejny sposób który wymyśliłem w trakcie pisania postu to zrobienie czegoś takiego:

C/C++
void rysuj( int pol_x, int pol_y ) //pole na którym jesteśmy x i y
{
    for( int y = 0; y < ile ś _tam_y; y++ ) //pętle do rysowania
    {
        for( int x = 0; x < ile ś _tam_x; x++ ) //ileś_tam - to szerokość i dłu. mapy
        {
            if( x == pol_x && y == pol_y
            mvprintw( x, y, "V" ); //wyświetlanie pola na który jesteśmy
            else
            mvprintw( x, y, " " );
        }
    }
}
Ten sposób jest jednak trochę ograniczony bo jak będziesz chciał dodać coś innego do wyświetlania to będziesz musiał go przerobić. Da się go jednak przerobić np. tak by odwoływał się do dynamicznej tablicy (std::vector) która zawiera wskaźniki do obiektów (w nich miałbyś informację o x,y, i np. jak program ma go wyświetlać i inne). Wyglądałoby to w miarę tak:
C/C++
for( int y = 0; y < ile ś _tam_y; y++ ) //pętle do rysowania
{
    for( int x = 0; x < ile ś _tam_x; x++ ) //ileś_tam - to szerokość i dłu. mapy
    {
        for( int i = 0; i < vektor.size(); i++ ) //vektor - dynamiczna tablica z obiektami jakiejś klasy przechowującej dane o obiekcie
        {
            if( vektor->getX() == x && vektor->getY() == y ) //obiekty te udostępniają nam metody takie jak getX getY które zwracają współrzędne x i y
                 mvprintw( x, y, "V" ); //wyświetlanie pola na który jesteśmy
            else
                 mvprintw( x, y, " " );
           
        }
    }
}
To jest już trudniejsze, więc nie wiem czy sobie z tym poradzisz, do tego musisz znać klasy, vector'a itd.



I to jest właśnie programowanie, sposobów na rozwiązanie danego tematu masz wiele to ty wybierasz który chesz, jeden jest prostszy drugi bardziej funkcjonalny.
Jeśli nie masz pomysłu jak coś zrobić, to siądź chwilkę i zastanów się jakby mogło to wyglądać, co Ci jest potrzebne itd. bo praktycznie wszystko da się jakoś zrobić.

P.S. Zobacz jak zedytowałem twój post.
P-12458
snake_yaro
Temat założony przez niniejszego użytkownika
» 2009-12-25 16:46:27
Dzięki za poprawienie. Pamiętam, że już kiedyś tu pisałem i próbowałem kombinacji code="C++", code=C++ i innych. Mniejsza z tym.

Zainspirowany Twoim kursem ncurses - głównie chodzi o proste menu. Stąd wziąłem switcha i przerobiłem to na if'y. Przesuwanie menu jest w zależności od zmiennej ktory, która przypisana jest do klawiszy a oraz z. Twoja funkcja robi praktycznie to samo co moja, przesuwa do ostatniego elementu tablicy.

Potrafiłbyś zastosować Twoją powyższą funkcję do przykładu z Twojego kursu tj. nie korzystając ze switcha?

C/C++
switch( ktory )
{
case 1:
    mvprintw( 6, 5, txt2 );
    mvprintw( 7, 5, txt3 );
    attron( A_REVERSE );
    mvprintw( 5, 5, txt1 );
    break;
   
case 2:
    mvprintw( 5, 5, txt1 );
    mvprintw( 7, 5, txt3 );
    attron( A_REVERSE );
    mvprintw( 6, 5, txt2 );
    break;
   
case 3:
    mvprintw( 5, 5, txt1 );
    mvprintw( 6, 5, txt2 );
    attron( A_REVERSE );
    mvprintw( 7, 5, txt3 );
    break;
}
attroff( A_REVERSE );
P-12461
lynx
» 2009-12-26 22:13:42
Wszystko da się jakoś inaczej zrobić. Zastanów się jak możesz połączyć wiedzę którą posiadasz w zakresie C++(pętle, instrukcje itp.) z biblioteką NCurses do wykonania danego zagadnienia. Pomyśl, zastanów się, jak zrobiłbyś takie menu, planszę do gry czy co tam sobie chcesz gdybyś nie miał podanego tamtego przykładu. Jak sam byś to wymyślił?


Może teraz na tygodniu coś dopiszę tam do kursu, ale wątpię bo muszę się zająć jeszcze innymi rzeczami.

Życzę Ci powodzenia w rozwiązywaniu twojego problemu, ale wybacz nie mogę dać Ci wszystkiego na tacy. Musisz sam też coś pomyśleć. A i satysfakcja, że dokonałeś czegoś zupełnie sam będzie większa. :)
P-12510
snake_yaro
Temat założony przez niniejszego użytkownika
» 2009-12-27 02:43:13
Dzięki Pietrzuch za motywację! Zrobiłem to za pomocą jednej pętli oraz instrukcji move(y, x). Działa na zasadzie łopatologicznej, ale działa. Pozdrawiam. (:
P-12514
« 1 »
  Strona 1 z 1