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 #include <iostream> #include <ctime> #include <cstdlib>
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: if( y < 4 ) y++; break; case 2: if( x < 4 ) x++; break; case 3: if( y > 0 ) y--; break; case 4: 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 ) ); 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; }
|
|
pekfos |
» 2014-04-27 14:03:23 W losujNastepny() w warunku używasz nastepny[], podczas gdy nie ma tam aktualnie wylosowanych współrzędnych. |
|
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! |
|
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 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: if( y < 4 ) { y++; std::cout << "y++\n"; } break; case 2: if( x < 4 ) { x++; std::cout << "x++\n"; } break; case 3: if( y > 0 ) { y--; std::cout << "y--\n"; } break; case 4: 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 ) ); 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; }
|
|
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 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". |
|
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) 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? |
|
pekfos |
» 2014-05-11 19:03:22 !( a2 != a1 || b2 != b1 )
|
To jest dokładnie to samo, co |
|
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? |
|
« 1 » 2 |