void T_Map::Intersect(T_Spirit* spirit) { int col = spirit->_pos.x / PIXEL; int row = spirit->_pos.y / PIXEL; CvRect player = { spirit->_pos.x,spirit->_pos.y,spirit->_width,spirit->_height }; CvRect relate_wall = { col*PIXEL,(row + 1)*PIXEL,PIXEL,PIXEL }; CvRect relate_wall_1 = { (col + 1)*PIXEL,row*PIXEL,PIXEL,PIXEL }; CvRect relate_wall_2 = { (col + 1)*PIXEL,(row + 1)*PIXEL,PIXEL,PIXEL }; if (CantMove(col, row) || (CantMove(col, row + 1) && T_Tool::Intersect(player, relate_wall))|| (CantMove(col + 1, row) && T_Tool::Intersect(player, relate_wall_1)) || (CantMove(col + 1, row + 1) && T_Tool::Intersect(player, relate_wall_2))) { spirit->_pos = spirit->_prePos; } }
bool Solve(SceneSize scene_size, int scene[][scene_size.height], Action actions[], int index, size_t len) { if (IsFinished(scene_size, scene)) return true; if (index == len) return false; int (*new_scene)[scene_size.height]; for (int x = 0; x < scene_size.width; x++) { for (int y = 0; y < scene_size.height; y++) { if (scene[x][y] == 0) { break; } for (Direction foward = EAST; foward < DirectionButtom; foward++) { if (CantMove(x, y, foward, scene_size)) { continue; } new_scene = (int (*)[scene_size.height])malloc( sizeof(int) * scene_size.height * scene_size.width); if (new_scene == NULL) { printf("new_scene == NULL\n"); abort(); } memcpy(new_scene, scene, scene_size.width * scene_size.height * sizeof(int)); actions[index].x = x; actions[index].y = y; actions[index].foward = foward; Move(scene_size, new_scene, actions[index]); if (Solve(scene_size, new_scene, actions, index+1, len)) { free(new_scene); return true; } free(new_scene); } } } return false; }