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

Funkcja nie tworzy odpowiednich współrzędnych

Ostatnio zmodyfikowano 2014-05-11 23:05
Autor Wiadomość
Sorbet
Temat założony przez niniejszego użytkownika
Funkcja nie tworzy odpowiednich współrzędnych
» 2014-04-27 13:52:14
Usznowanko,
Próbuję ostatnio napisać program, który losuje ścieżkę na polu podobnym do szachownicy, ale 4x4.
Zacząłem go testować i pojawił się problem. Funkcja losujNastęny, która ma losować kolejny krok w ścieżce czasem tworzy duplikat poprzedniego kroku. Np. obecny = {4,1}; następny = {4,1}. Zamiast np. obecny = {4,1}; następny = {3,1};
Mam nadzieję, że przybliżyłem wystarczająco, aby prosić o pomoc.
Załączam kod źródłowy.
Z góry dziękuję.
~Sorbet
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>

//1 = góra(y++), 2 = prawo(x++), 3 = dół(y--), 4 = lewo(x--)
int losujKierunek()
{
    return rand() % 4 + 1;
}

void wylosujStart( int tablica[] )
{
    int m[ 2 ] = { 1, 4 };
    tablica[ 0 ] = m[ rand() % 2 ];
    tablica[ 1 ] = m[ rand() % 2 ];
}

void losujNastepny( int obecny[], int nastepny[] )
{
    int x = obecny[ 0 ];
    int y = obecny[ 1 ];
    do
    {
        switch( losujKierunek() )
        {
        case 1: //góra
            if( y < 4 )
                 y++;
           
            break;
        case 2: //prawo
            if( x < 4 )
                 x++;
           
            break;
        case 3: //dół
            if( y > 0 )
                 y--;
           
            break;
        case 4: //lewo
            if( x > 0 )
                 x--;
           
            break;
            default:
            break;
        }
    } while( obecny[ 0 ] == nastepny[ 0 ] || obecny[ 1 ] == nastepny[ 1 ] );
   
    nastepny[ 0 ] = x;
    nastepny[ 1 ] = y;
}

int main()
{
    srand( time( NULL ) );
    //Punkt startowy [x, y]
    int start[ 2 ];
    wylosujStart( start );
   
    int testowy[ 2 ];
    losujNastepny( start, testowy );
   
    std::cout << "Start: " << start[ 0 ] << ", " << start[ 1 ] << std::endl;
    std::cout << "Test: " << testowy[ 0 ] << ", " << testowy[ 1 ] << std::endl;
    return 0;
}
P-108795
pekfos
» 2014-04-27 14:03:23
W losujNastepny() w warunku używasz nastepny[], podczas gdy nie ma tam aktualnie wylosowanych współrzędnych.
P-108796
Sorbet
Temat założony przez niniejszego użytkownika
» 2014-04-27 20:05:01
Czyli jeśli przypiszę wartości do następny [] w środku pętli to zadziała? Dzięki wielkie!
P-108813
Sorbet
Temat założony przez niniejszego użytkownika
Jednak dalej nie działa
» 2014-05-10 23:23:30
Po kolejnych próbach z uwzględnieniem wskazówki kolegi pekfosa nadal nie mogę znaleźć rozwiązania mojego problemu. Jest postęp, bo widzę, że funkcja porównuje wartości, ale wydaje mi się, że petla w losujNastępny() działa do momentu aż obecny[0] != x i obecny[1] != y, kiedy wyraźnie napisałem tam
while( obecny[ 0 ] == x || obecny[ 1 ] == y );
 Proszę o pomoc, bo bardzo nurtuje mnie ten problem. Jeszcze raz załączam kod źródłowy z poprawkami
C/C++
//1 = góra(y++), 2 = prawo(x++), 3 = dół(y--), 4 = lewo(x--)
int losujKierunek()
{
    return rand() % 4 + 1;
}

void wylosujStart( int tablica[] )
{
    int m[ 2 ] = { 1, 4 };
    tablica[ 0 ] = m[ rand() % 2 ];
    tablica[ 1 ] = m[ rand() % 2 ];
}

void losujNastepny( int obecny[], int nastepny[] )
{
    int x = obecny[ 0 ];
    std::cout << "x = " << x << std::endl;
    int y = obecny[ 1 ];
    std::cout << "y = " << y << std::endl;
    do
    {
        switch( losujKierunek() )
        {
        case 1: //góra
            if( y < 4 )
            {
                y++;
                std::cout << "y++\n";
            }
            break;
        case 2: //prawo
            if( x < 4 )
            {
                x++;
                std::cout << "x++\n";
            }
            break;
        case 3: //dół
            if( y > 0 )
            {
                y--;
                std::cout << "y--\n";
            }
            break;
        case 4: //lewo
            if( x > 0 )
            {
                x--;
                std::cout << "x--\n";
            }
            break;
            default:
            break;
        }
    } while( obecny[ 0 ] == x || obecny[ 1 ] == y );
   
    nastepny[ 0 ] = x;
    std::cout << "nastepny[0] = " << x << std::endl;
    nastepny[ 1 ] = y;
    std::cout << "nastepny[1] = " << y << std::endl;
   
}

int _tmain( int argc, _TCHAR * argv[] )
{
    srand( time( NULL ) );
    //Punkt startowy [x, y]
    int start[ 2 ];
    wylosujStart( start );
    std::cout << "Start: " << start[ 0 ] << ", " << start[ 1 ] << std::endl;
   
    int testowy[ 2 ];
    losujNastepny( start, testowy );
    std::cout << "Test: " << testowy[ 0 ] << ", " << testowy[ 1 ] << std::endl;
    return 0;
}
P-109660
pekfos
» 2014-05-11 15:10:41
ale wydaje mi się, że petla w losujNastępny() działa do momentu aż obecny[0] != x i obecny[1] != y, kiedy wyraźnie napisałem tam
C/C++
while( obecny[ 0 ] == x || obecny[ 1 ] == y );

Dobrze się wydaje, ale źle myślisz. Pętla kończy się, gdy warunek jest fałszywy, a twój, po zanegowaniu, to jest właśnie "obecny[0] != x i obecny[1] != y".
P-109685
Sorbet
Temat założony przez niniejszego użytkownika
» 2014-05-11 18:35:17
Jedyne rozwiązanie jakie przyszło mi do głowy to zrobić tak (inny, krótszy przykład)
C/C++
int main()
{
    srand( time( NULL ) );
    int a1 = 2;
    int b1 = 1;
    int a2, b2;
    do
    {
        a2 = rand() % 3;
        std::cout << "a2 = " << a2 << std::endl;
        b2 = rand() % 3;
        std::cout << "b2 = " << b2 << std::endl;
    } while( !( a2 != a1 || b2 != b1 ) );
   
    return 0;
}
Po wypróbowaniu wygląda, że działa, ale moje pytanie brzmi: Czym różni się od pierwszej wersji?
P-109712
pekfos
» 2014-05-11 19:03:22
C/C++
!( a2 != a1 || b2 != b1 )
To jest dokładnie to samo, co
C/C++
a2 == a1 && b2 == b1
P-109720
Sorbet
Temat założony przez niniejszego użytkownika
» 2014-05-11 21:40:27
Wydaje mi się, że właśnie zrozumiałem to, co chciałeś mi cały czas powiedzieć. Pętla działa do momentu aż wyrażenie w nawiasach będzie fałszywe. Więc w wypadku
while( obecny[ 0 ] == x || obecny[ 1 ] == y );
 Będzie prawdziwe do momentuz aż
( obecny[ 0 ] != x && obecny[ 1 ] != y );
. Bo operator || będzie zwracał wartość
true
 A w wypadku
while( obecny[ 0 ] == x && obecny[ 1 ] == y );
 wyrażenie w nawiasach przyjmie wartość
false
, kiedy tylko jeden z warunków nie będzie spełniony. Dobrze zrozumiałem?
P-109755
« 1 » 2
  Strona 1 z 2 Następna strona