//solves the game on its own void godSolve(int dim) { //length of path to search //int pathDepth = 3; int failedCounter = 0; while (true) { //array that will save moves to do int toMove[500]; //create pointer to location in toMove[] int toMoveLoc = 0; //save board int savedBoard[d][d]; int savedZ[2]; for (int i = 0; i < d; i++) for (int j = 0; j < d; j++) savedBoard[i][j] = board[i][j]; savedZ[0] = z[0]; savedZ[1] = z[1]; //set manhattan distance to beat float manDist = manDistance(); //declare manDist for new setup; float manDistNew = manDist; //this is to freeze rows near the top (i.e. tell algorithm to not include //those squares in paths it searches int rowComp = 0; for (int i = 0; i < d*d; i++) { if (board[i/d][i%d] == i+1) rowComp++; else break; } rowComp = rowComp/d; //do up to some# random moves, recording them, breaking early ////Sorry, I know this algorithm isn't really an algorithm, and it's terrible, ////but it meets the specification (solves things up to 4x4 (though really poorly) ////far from optimally). It kind of REALLY sucks for 5x5+... but that's why I was ////trying to figure out how to work out the A* in C (code that was commented out) ////.. but these arrays are difficult to work with, and I ran out of time for (int i = 0; i < d*d + failedCounter; i++) { int j = rand() % 4; if (getTile(j) > rowComp*d) { toMove[toMoveLoc++] = getTile(j); movetile(getTile(j)); manDistNew = manDistance(); if (manDistNew < manDist) break; } } /* STARt OF BETTER ALGORITHM -- COULD NOT COMPLETE IN TIME // Working with arrays in C is a big headache... A* would've been really easy in Java? // I'm probably just a noob though Path pathSet[(int)pow(4,pathDepth)]; Path *tempPathSet = findPaths(pathDepth, pathSet); for (int i = 0; i < pow(4,pathDepth); i++) pathSet[i] = tempPathSet[i]; //for each path for (int i = 0, n = pow(4,pathDepth); i < n; i++) { //for each step in path, move tile for (int j = 0; j < pathDepth; j++) movetile(getTile(pathSet[i].array[j])); //if new board > old board, save moves & reset path depth manDistNew = manDistance(); if (manDistNew < manDist) { toMove = pathSet[i].array; pathDepth = 2; } //reset boards for (int i = 0; i < d; i++) for (int j = 0; j < d; j++) board[i][j] = savedBoard[i][j]; z[0] = savedZ[0]; z[1] = savedZ[1]; } */ //reset boards for (int i = 0; i < d; i++) for (int j = 0; j < d; j++) board[i][j] = savedBoard[i][j]; z[0] = savedZ[0]; z[1] = savedZ[1]; failedCounter ++; //compare new manhattan distance to mandist to beat //if better, do all those moves if (manDistNew < manDist) { //if (pathDepth == 2) { //new algo failedCounter = 0; for (int i = 0; i < toMoveLoc; i++) { moveComplete(toMove[i]); } } // pathDepth++; } }
void MadsPlayer::move() { bool routeFlag = false; if (_moving) { int idx = _routeCount; while (!_v844C0 && (_destPos.x == _playerPos.x) && (_destPos.y == _playerPos.y)) { if (idx != 0) { --idx; SceneNode &node = _madsVm->scene()->getSceneResources()._nodes[_routeIndexes[idx]]; _destPos = node.pt; routeFlag = true; } else if (_v844BE == idx) { // End of walking path _routeCount = 0; _moving = false; turnToDestFacing(); routeFlag = true; idx = _routeCount; } else { _v844C0 = _v844BE; _v844BC = true; _v844BE = 0; _stepEnabled = true; routeFlag = false; } if (!_moving) break; } _routeCount = idx; } if (routeFlag && _moving) startMovement(); if (_newDirection != _direction) dirChanged(); else if (!_moving) updateFrame(); int var1 = _unk1; if (_unk4 && (_hypotenuse > 0)) { int v1 = -(_currentScale - 100) * (_posDiff.x - 1) / _hypotenuse + _currentScale; var1 = MAX(1, 10000 / (v1 * _currentScale * var1)); } if (!_moving || (_direction != _newDirection)) return; Common::Point newPos = _playerPos; if (_v8452E < var1) { do { if (_v8452C < _posDiff.x) _v8452C += _posDiff.y; if (_v8452C >= _posDiff.x) { if ((_posChange.y > 0) || (_v844C0 != 0)) newPos.y += _yDirection; --_posChange.y; _v8452C -= _posDiff.x; } if (_v8452C < _posDiff.x) { if ((_posChange.x > 0) || (_v844C0 != 0)) newPos.x += _xDirection; --_posChange.x; } if ((_v844BC == 0) && (_v844C0 == 0) && (_v844BE == 0)) { routeFlag = _madsVm->scene()->getDepthHighBit(newPos); if (_special == 0) _special = _madsVm->scene()->getDepthHighBits(newPos); } _v8452E += _v84530; } while ((_v8452E < var1) && !routeFlag && ((_posChange.x > 0) || (_posChange.y > 0) || (_v844C0 != 0))); } _v8452E -= var1; if (routeFlag) moveComplete(); else { if (!_v844C0) { // If the move is complete, make sure the position is exactly on the given destination if (_posChange.x == 0) newPos.x = _destPos.x; if (_posChange.y == 0) newPos.y = _destPos.y; } _playerPos = newPos; } }
void AMPIC887EpicsCoordinator::onAllConnected(bool connectedState) { if(connectedState) { if(!controller_->isInValidState()) { qDebug() << "Initialization: Setting Axes status to Error"; xAxisStatus_->move(4); yAxisStatus_->move(4); zAxisStatus_->move(4); uAxisStatus_->move(4); vAxisStatus_->move(4); wAxisStatus_->move(4); } else if (!connectedOnce_) { connectedOnce_ = true; // Initializing x Axis if(!xAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::XAxis))) { qDebug() << "Initialization: Setting x Axis position to " << controller_->currentPosition(AMGCS2::XAxis); xAxisFeedback_->move(controller_->currentPosition(AMGCS2::XAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::XAxisIsMoving) && !xAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting x Axis status to moving"; xAxisStatus_->move(1); } else if (!xAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting x Axis status to move done"; xAxisStatus_->move(0); } // Initializing y Axis if(!yAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::YAxis))) { qDebug() << "Initialzation: Setting y Axis position to " << controller_->currentPosition(AMGCS2::YAxis); yAxisFeedback_->move(controller_->currentPosition(AMGCS2::YAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::YAxisIsMoving) && !yAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting y Axis status to moving"; yAxisStatus_->move(1); } else if (!yAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting y Axis status to move done"; yAxisStatus_->move(0); } // Initializing z Axis if(!zAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::ZAxis))) { qDebug() << "Initialzation: Setting z Axis position to " << controller_->currentPosition(AMGCS2::ZAxis); zAxisFeedback_->move(controller_->currentPosition(AMGCS2::ZAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::ZAxisIsMoving) && !zAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting z Axis status to moving"; zAxisStatus_->move(1); } else if (!zAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting z Axis status to move done"; zAxisStatus_->move(0); } // Initializing u Axis if(!uAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::UAxis))) { qDebug() << "Initialzation: Setting u Axis position to " << controller_->currentPosition(AMGCS2::UAxis); uAxisFeedback_->move(controller_->currentPosition(AMGCS2::UAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::UAxisIsMoving) && !uAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting u Axis status to moving"; uAxisStatus_->move(1); } else if (!uAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting u Axis status to move done"; uAxisStatus_->move(0); } // Initializing v Axis if(!vAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::VAxis))) { qDebug() << "Initialzation: Setting v Axis position to " << controller_->currentPosition(AMGCS2::VAxis); vAxisFeedback_->move(controller_->currentPosition(AMGCS2::VAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::VAxisIsMoving) && !vAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting v Axis status to moving"; vAxisStatus_->move(1); } else if (!vAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting v Axis status to move done"; vAxisStatus_->move(0); } // Initializing w Axis if(!wAxisFeedback_->withinTolerance(controller_->currentPosition(AMGCS2::WAxis))) { qDebug() << "Initialzation: Setting w Axis position to " << controller_->currentPosition(AMGCS2::WAxis); wAxisFeedback_->move(controller_->currentPosition(AMGCS2::WAxis)); } if(controller_->movementStatuses().testFlag(AMGCS2::WAxisIsMoving) && !wAxisStatus_->withinTolerance(1)) { qDebug() << "Initialization: Setting w Axis status to moving"; wAxisStatus_->move(1); } else if (!wAxisStatus_->withinTolerance(0)) { qDebug() << "Initialization: Setting w Axis status to move done"; wAxisStatus_->move(0); } // Initialize system velocity if(!systemVelocityFeedback_->withinTolerance(controller_->systemVelocity())) { qDebug() << "Initialization: Setting system velocity to " << controller_->systemVelocity(); systemVelocityFeedback_->move(controller_->systemVelocity()); } if(!systemVelocitySetpoint_->withinTolerance(controller_->systemVelocity())) { qDebug() << "Initialization: Setting system velocity setpoint to " << controller_->systemVelocity(); systemVelocitySetpoint_->move(controller_->systemVelocity()); } // Initialize the record rate. if(!recordRateFeedback_->withinTolerance(controller_->recordRate())) { qDebug() << "Initialization: Setting record rate to " << controller_->recordRate(); recordRateFeedback_->move(controller_->recordRate()); } if(!recordRateSetpoint_->withinTolerance(controller_->recordRate())) { qDebug() << "Initialization: Setting record rate setpoint to " << controller_->recordRate(); recordRateSetpoint_->move(controller_->recordRate()); } // Initialize data recorder active state double dataRecorderActiveValue = controller_->isDataRecorderActive() ? 1.0 : 0.0; if(dataRecorderActive_->withinTolerance(dataRecorderActiveValue)) { qDebug() << "Initialization: Setting data recorder active status to " << dataRecorderActiveValue; dataRecorderActive_->move(dataRecorderActiveValue); } } connect(systemVelocitySetpoint_, SIGNAL(valueChanged(double)), this, SLOT(onSystemVelocitySetpointChanged(double))); connect(recordRateSetpoint_, SIGNAL(valueChanged(double)), this, SLOT(onRecordRateSetpointPVChanged(double))); connect(dataRecorderActive_, SIGNAL(valueChanged(double)), this, SLOT(onDataRecorderActivePVChanged(double))); connect(stopAll_, SIGNAL(valueChanged(double)), this, SLOT(onStopAll(double))); connect(controller_, SIGNAL(moveStarted(AMGCS2::AxisMovementStatuses)), this, SLOT(onMotionStartedChanged(AMGCS2::AxisMovementStatuses))); connect(controller_, SIGNAL(moveFailed(AMGCS2::AxisMovementStatuses)), this, SLOT(onMotionFailed(AMGCS2::AxisMovementStatuses))); connect(controller_, SIGNAL(moveComplete()), this, SLOT(onMotionCompleted())); connect(controller_, SIGNAL(positionUpdate(AMPIC887AxisMap<double>)), this, SLOT(onPositionUpdate(AMPIC887AxisMap<double>))); connect(controller_, SIGNAL(systemVelocityChanged(double)), this, SLOT(onSystemVelocityChanged(double))); connect(controller_, SIGNAL(recordRateChanged(double)), this, SLOT(onControllerRecordRateChanged(double))); connect(controller_, SIGNAL(dataRecorderActiveStateChanged(bool)), this, SLOT(onControllerDataRecorderActiveChanged(bool))); } }