edge *topFirstTraverse(tree *T, edge *e) /*topFirstTraverse starts from the top of T, and from there moves stepwise down, left before right*/ /*assumes tree has been detrifurcated*/ { edge *f; if (NULL == e) return(T->root->leftEdge); /*first Edge searched*/ else if (!(leaf(e->head))) return(e->head->leftEdge); /*down and to the left is preferred*/ else /*e->head is a leaf*/ { f = moveUpRight(e); return(f); } }
void MoveToTheVictim::moveToTheCell(std::vector<int> &x_coord, std::vector<int> &y_coord, TVector &cell, TPlayer &bot/*, rbw::Player * bot_n*/) { //std::cout << "moveToTheCell -> "; TVector new_coord,old_coord; //----------------it's new---------------------// int x_start, x_end, y_start, y_end; if(bot.coord.x != x_coord[cell.x] + 1) { new_coord.x = (x_coord[cell.x] + x_coord[cell.x+1]) / 2 + 1; x_start = new_coord.x - 1; x_end = new_coord.x; } else { new_coord.x = (x_coord[cell.x] + x_coord[cell.x+1]) / 2; x_start = new_coord.x; x_end = new_coord.x + 1; } if(bot.coord.y != y_coord[cell.y] + 1) { new_coord.y = (y_coord[cell.y] + y_coord[cell.y+1]) / 2 + 1; y_start = new_coord.y - 1; y_end = new_coord.y; } else { new_coord.y = (y_coord[cell.y] + y_coord[cell.y+1]) / 2; y_start = new_coord.y; y_end = new_coord.y + 1; } if( this->pixelIsInTheWall(new_coord) ) for(int i = x_start; (i < x_end)&&(this->pixelIsInTheWall(new_coord))&& (new_coord.x == bot.coord.x)&&(new_coord.y == bot.coord.y); i++) for(int j = y_start; (j < y_end)&&(this->pixelIsInTheWall(new_coord))&& (new_coord.x == bot.coord.x)&&(new_coord.y == bot.coord.y); j++) { new_coord.x = i; new_coord.y = j; } //------------------------------------------// /* if(this->pixelIsInTheWall(new_coord)) { if(this->) } */ //std::cout << "Bot want move to (" << new_coord.x << "," << // new_coord.y << ");" << std::endl; // std::cout << "This pixel is in the wall: " << this->pixelIsInTheWall(new_coord) << ";" << std::endl; //std::cout << "x_coord: " << x_coord[cell.x] << " - " << x_coord[cell.x+1] << ";" << std::endl; //std::cout << "y_coord: " << y_coord[cell.y] << " - " << y_coord[cell.y+1] << ";" << std::endl; //else // new_coord.y = (y_coord[cell.y] + y_coord[cell.y+1]) / 2; old_coord = bot.coord; std::cout << "Bot_coord: (" << old_coord.x << "," << old_coord.y << ");\n"; int way_part1,way_part2,time1,time2; /*TVector real_speed; sf::Vector2f speed = bot_n->GetSpeed(); real_speed.x = (int)speed.x; real_speed.y = (int)speed.y; EvadeFromTheRocket stells_system(this->server); stells_system.saveDirection(*bot_n,real_speed); */ if( (new_coord.x >= bot.coord.x)&&(new_coord.y <= bot.coord.y ) ) { // std::cout << "IF\n"; if(new_coord.x - bot.coord.x < bot.coord.y - new_coord.y) { way_part1 = new_coord.x - bot.coord.x; way_part2 = bot.coord.y - new_coord.y - way_part1; num = (way_part1 + way_part2)/2 + 1; // --- // time1 = int(way_part1 / bot.speed * 1000) + 1; time2 = int(way_part2 / bot.speed * 1000); if(time1 < unthinkable_time) time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2); else { time1 = unthinkable_time; time2 = 0; } //if(time1 != 0) // std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y - 1 << ");\n"; moveUpRight(time1); //if(time2 != 0) // std::cout << "Next_coord: (" << old_coord.x << "," << old_coord.y - 1 << ");\n"; moveUp(time2); return; } else { way_part1 = bot.coord.y - new_coord.y; way_part2 = new_coord.x - bot.coord.x - way_part1; num = (way_part1 + way_part2)/2 + 1; // --- // time1 = int(way_part1 / bot.speed * 1000) + 1; time2 = int(way_part2 / bot.speed * 1000); if(time1 < unthinkable_time) time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2); else { time1 = unthinkable_time; time2 = 0; } //if(time1 != 0) // std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y - 1 << ");\n"; moveUpRight(time1); //if(time2 != 0) // std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y << ");\n"; moveRight(time2); return; } } if( (new_coord.x >= bot.coord.x)&&(new_coord.y >= bot.coord.y ) ) { //std::cout << "IF\n"; if(new_coord.x - bot.coord.x < new_coord.y - bot.coord.y) { way_part1 = new_coord.x - bot.coord.x; way_part2 = new_coord.y - bot.coord.y - way_part1; num = (way_part1 + way_part2)/2 + 1; // --- // time1 = int(way_part1 / bot.speed * 1000) + 1; time2 = int(way_part2 / bot.speed * 1000); if(time1 < unthinkable_time) time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2); else { time1 = unthinkable_time; time2 = 0; } //if(time1 != 0) // std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y + 1 << ");\n"; moveDownRight(time1); //if(time2 != 0) // std::cout << "Next_coord: (" << old_coord.x << "," << old_coord.y - 1 << ");\n"; moveDown(time2); return; } else { way_part1 = new_coord.y - bot.coord.y; way_part2 = new_coord.x - bot.coord.x - way_part1; num = (way_part1 + way_part2)/2 + 1; // --- // time1 = int(way_part1 / bot.speed * 1000) + 1; time2 = int(way_part2 / bot.speed * 1000); if(time1 < unthinkable_time) time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2); else { time1 = unthinkable_time; time2 = 0; } //if(time1 != 0) // std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y + 1 << ");\n"; moveDownRight(time1); //if(time2 != 0) // std::cout << "Next_coord: (" << old_coord.x + 1 << "," << old_coord.y << ");\n"; moveRight(time2); return; } } if( (new_coord.x <= bot.coord.x)&&(new_coord.y >= bot.coord.y ) ) { //std::cout << "IF\n"; if(bot.coord.x - new_coord.x < new_coord.y - bot.coord.y) { way_part1 = bot.coord.x - new_coord.x; way_part2 = new_coord.y - bot.coord.y - way_part1; num = (way_part1 + way_part2)/2 + 1; // --- // time1 = int(way_part1 / bot.speed * 1000) + 1; time2 = int(way_part2 / bot.speed * 1000); if(time1 < unthinkable_time) time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2); else { time1 = unthinkable_time; time2 = 0; } //if(time1 != 0) // std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y + 1 << ");\n"; moveDownLeft(time1); //if(time2 != 0) // std::cout << "Next_coord: (" << old_coord.x << "," << old_coord.y + 1 << ");\n"; moveDown(time2); return; } else { way_part1 = new_coord.y - bot.coord.y; way_part2 = bot.coord.x - new_coord.x - way_part1; num = (way_part1 + way_part2)/2 + 1; // --- // time1 = int(way_part1 / bot.speed * 1000) + 1; time2 = int(way_part2 / bot.speed * 1000); if(time1 < unthinkable_time) time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2); else { time1 = unthinkable_time; time2 = 0; } //if(time1 != 0) // std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y + 1 << ");\n"; moveDownLeft(time1); //if(time1 != 0) // std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y << ");\n"; moveLeft(time2); return; } } if( (new_coord.x <= bot.coord.x)&&(new_coord.y <= bot.coord.y ) ) { //std::cout << "IF\n"; if(bot.coord.x - new_coord.x < bot.coord.y - new_coord.y) { way_part1 = bot.coord.x - new_coord.x; way_part2 = bot.coord.y - new_coord.y - way_part1; num = (way_part1 + way_part2)/2 + 1; // --- // time1 = int(way_part1 / bot.speed * 1000) + 1; time2 = int(way_part2 / bot.speed * 1000); if(time1 < unthinkable_time) time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2); else { time1 = unthinkable_time; time2 = 0; } //if(time1 != 0) // std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y - 1 << ");\n"; moveUpLeft(time1); //if(time2 != 0) // std::cout << "Next_coord: (" << old_coord.x << "," << old_coord.y - 1 << ");\n"; moveUp(time2); return; } else { way_part1 = bot.coord.y - new_coord.y; way_part2 = bot.coord.x - new_coord.x - way_part1; num = (way_part1 + way_part2)/2 + 1; // --- // time1 = int(way_part1 / bot.speed * 1000) + 1; time2 = int(way_part2 / bot.speed * 1000); if(time1 < unthinkable_time) time2 = (unthinkable_time - time1 < time2 ? unthinkable_time - time1 : time2); else { time1 = unthinkable_time; time2 = 0; } //if(time1 != 0) // std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y - 1 << ");\n"; moveUpLeft(time1); //if(time2 != 0) // std::cout << "Next_coord: (" << old_coord.x - 1 << "," << old_coord.y << ");\n"; moveLeft(time2); return; } } }
void NNIupdateAverages(double **A, edge *e, edge *par, edge *skew, edge *swap, edge *fixed, tree *T) { node *v; edge *elooper; v = e->head; /*first, v*/ A[e->head->index][e->head->index] = (swap->bottomsize* ((skew->bottomsize*A[skew->head->index][swap->head->index] + fixed->bottomsize*A[fixed->head->index][swap->head->index]) / e->bottomsize) + par->topsize* ((skew->bottomsize*A[skew->head->index][par->head->index] + fixed->bottomsize*A[fixed->head->index][par->head->index]) / e->bottomsize) ) / e->topsize; elooper = findBottomLeft(e); /*next, we loop over all the edges which are below e*/ while (e != elooper) { A[e->head->index][elooper->head->index] = A[elooper->head->index][v->index] = (swap->bottomsize*A[elooper->head->index][swap->head->index] + par->topsize*A[elooper->head->index][par->head->index]) / e->topsize; elooper = depthFirstTraverse(T,elooper); } elooper = findBottomLeft(swap); /*next we loop over all the edges below and including swap*/ while (swap != elooper) { A[e->head->index][elooper->head->index] = A[elooper->head->index][e->head->index] = (skew->bottomsize * A[elooper->head->index][skew->head->index] + fixed->bottomsize*A[elooper->head->index][fixed->head->index]) / e->bottomsize; elooper = depthFirstTraverse(T,elooper); } /*now elooper = skew */ A[e->head->index][elooper->head->index] = A[elooper->head->index][e->head->index] = (skew->bottomsize * A[elooper->head->index][skew->head->index] + fixed->bottomsize* A[elooper->head->index][fixed->head->index]) / e->bottomsize; /*finally, we loop over all the edges in the tree on the far side of parEdge*/ elooper = T->root->leftEdge; while ((elooper != swap) && (elooper != e)) /*start a top-first traversal*/ { A[e->head->index][elooper->head->index] = A[elooper->head->index][e->head->index] = (skew->bottomsize * A[elooper->head->index][skew->head->index] + fixed->bottomsize* A[elooper->head->index][fixed->head->index]) / e->bottomsize; elooper = topFirstTraverse(T,elooper); } /*At this point, elooper = par. We finish the top-first traversal, excluding the subtree below par*/ elooper = moveUpRight(par); while (NULL != elooper) { A[e->head->index][elooper->head->index] = A[elooper->head->index][e->head->index] = (skew->bottomsize * A[elooper->head->index][skew->head->index] + fixed->bottomsize* A[elooper->head->index][fixed->head->index]) / e->bottomsize; elooper = topFirstTraverse(T,elooper); } }