Trochę przeanalizowałam program i myślę, że go nawet rozumiem.
Board( char * file_name )
{
add_segment( file_name );
robot_x_ = 1;
robot_y_ = rows_.size() - 2;
}
Rozumiem, że jest to konstruktor, który stwarza obiekt Planszę funkcję "add_segment" oraz przechowuję informację o pozycji robota w planszy.
void add_segment( char * file_name )
{
fstream file( file_name );
string row;
int y = 0;
while( getline( file, row ) )
{
if( rows_.size() <= y )
rows_.push_back( row );
else
rows_[ y ] += row;
++y;
}
}
"file" jest naszą zmienną, która pozwala nam na wszelkie operacje na pliku, zaś "row" jest nazwą obiektu klasy string, w której funkcja getline ma umieścić wczytywany tekst. Samo "getline" pozwala nam wczytywać bardzo wiele wyrazów bez konieczności wcześniejszego rezerwowania miejsca w tablicy. Ponadto "getline" wczytuje nasz plik wierszami.
getline( file, row ) jest naszym warunkiem kończącym pętle, czyli jak cały plik się wczyta to pętla się zakończy. W samej pętli mamy warunek, że jeśli rozmiar wierszy (size() zwraca nam rozmiar/długość zmiennej rows, czyli wszystkich wierszy, tak?) jest mniejszy lub równy 0 to zostanie dodany nowy element, w naszym wypadku cała plansza, na końcu tablicy (z prawej strony).
W przeciwnym wypadku... no właśnie, o co chodzi z tym "else"? Bo rozumiem, że doda nam planszę wtedy tylko, gdy jest ona takiego samego rozmiaru co tablica pierwsza, ale nie za bardzo rozumiem ten warunek "else".
void show()
{
for( int y = 0; y < rows_.size(); ++y )
{
const string & row = rows_[ y ];
if( y == robot_y_ )
cout << row.substr( 0, robot_x_ ) << robot << row.substr( robot_x_ + 1, string::npos ) << '\n';
else
cout << row << '\n';
}
}
Tej funkcji nie rozumiem za bardzo. Pętla for inicjuje nam działanie od y=0, ++y - wpierw nam zwiększa o 1, potem zwraca tę wartość, pętla zakończy się w momencie gdy y będzie mniejsze do rozmiaru zmiennej "rows", czyli wszystkich wierszy.
const string & row = rows_[ y ];
Tego nie rozumiem całkowicie. I z tym miejscem mam też problemy podczas podziały programu na pliki (na koniec postu dodam mój program).
Dalej mamy warunek, że jeśli y jest równy położeniu robot_y to wyświetli nam się... i tu też problem. nie rozumiem tego ciągu. Z tego, co wyczytałam to "substr" zwraca nam nowy string, który powstał poprzez skopiowanie ilości znaków łańcucha "row". czy chodzi o to, że on zwraca nam planszę wpierw od pozycji 0 to pozycji "x" robota, następnie sam robot jest umieszczany, a następnie znów zwraca się nam plansza od kolejnej linii "pod" robotem oraz reszta znaków planszy?
W przeciwnym razie pętla wyświetli nam całą planszę.
bool move_robot( int dx, int dy )
{
const int new_x = robot_x_ + dx;
const int new_y = robot_y_ + dy;
if( new_x >= 0 && new_x < rows_[ 0 ].size() && new_y >= 0 && new_y < rows_.size() && rows_[ new_y ][ new_x ] != wall )
{
rows_[ robot_y_ ][ robot_x_ ] = trace;
robot_x_ = new_x;
robot_y_ = new_y;
return true;
}
return false;
}
Tutaj mamy funkcię odpowiedzialną za ruch robota. Przypisuję ona nowym zmiennym "new_x, new_y" sumę starej pozycji robota oraz podane "dx, dy". Jeśli nowe zmienne są większe lub równe 0, mniejsze od rozmiaru wiersza_[0] (dla new_x), mniejsze od rozmiaru wszystkich wierszy (dla new_y) oraz pozycja wiersza (jakiś punkt x,y) nie jest ścianą to ruch jest możliwy. W miejscu starej pozycji robota pojawi się ślad "x", zaś starym pozycją zostanie przypisana nowa pozycja. Funckaja zwróci prawdę.
W przeciwnym razie, gdy ruch nie będzie możliwe, zwróci fałsz i ruch się nie wykona.
private:
int robot_x_, robot_y_;
vector < string > rows_;
Prywatne zmienne położenia robota. A jak dokładnie zrozumieć tę drugą linijkę? Deklaruje wektor rows typu "string"?
Main cały rozumiem, więc go nie zamieszczam.
Próbowałam sama napisać program, jednak wyszło, że bardzo opierałam się na Twoim, co trochę jest załamujące, że nie potrafię nic stworzyć.