bool Board::findPath(int x1, int y1, int x2, int y2, Path& p) const { p.clear(); if(findSimplePath(x1, y1, x2, y2, p)) return true; // Find a path of 3 segments const int dx[4] = { 1, 0, -1, 0 }; const int dy[4] = { 0, 1, 0, -1 }; for(int i = 0; i < 4; i++) { int newx = x1 + dx[i]; int newy = y1 + dy[i]; while(newx >= -1 && newx <= x_tiles() && newy >= -1 && newy <= y_tiles() && getField(newx, newy) == EMPTY) { if(findSimplePath(newx, newy, x2, y2, p)) { p.push_front(Position(x1, y1)); return true; } newx += dx[i]; newy += dy[i]; } } return false; }
bool Board::findPath(int x1, int y1, int x2, int y2) { clearHistory(); if(findSimplePath(x1, y1, x2, y2)) return TRUE; else { // find 3-way path int dx[4] = {1, 0, -1, 0}; int dy[4] = {0, 1, 0, -1}; int i; for(i = 0; i < 4; i++) { int newx = x1 + dx[i], newy = y1 + dy[i]; while(getField(newx, newy) == EMPTY && newx >= -1 && newx <= x_tiles() && newy >= -1 && newy <= y_tiles()) { if(findSimplePath(newx, newy, x2, y2)) { // make place for history point for(int j = 3; j > 0; j--) history[j] = history[j-1]; // insert history point history[0].x = x1; history[0].y = y1; return TRUE; } newx += dx[i]; newy += dy[i]; } } clearHistory(); return FALSE; } return FALSE; }