Direction _323500942_C::HandleAtD() { // checked if finished counting if (m_nUnexploredOrDustyCellsCount == 0) { m_oCurrentState = AlgoState::Finished; return HandleFinish(); } // if about to finish if( m_bAboutTofinish && m_stepsTillFinishing <= 1) return Direction::Stay; // if not charged yet - stay if(m_nBatteryLevel + m_oConfig[BATTERY_RECHARGE_KEY] < m_oConfig[BATTERY_CAPACITY_KEY]) return Direction::Stay; m_oCurrentState = AlgoState::FindWall; return HandleFindWall(); }
int SystemDestruct(void) { save_paper(); //By zjh SetIntSign(); /* cli:: disable creat message */ TimerEnd(); FontEnd(); CloseCache(); PageFinish(); MouseDestruct(); UnlockMouseMemory(); WindowEnd(); ItemFinish(); ChineseLibDone(); GraphFinish(); HandleFinish(); WriteDefaultScreenMode(); ReturnOK(); }
Direction _323500942_C::step(Direction prevStep) { //cout << m_oMatrix << endl; m_oPos.i += (prevStep == Direction::South ? 1 : (prevStep == Direction::North ? -1 : 0)); m_oPos.j += (prevStep == Direction::East ? 1 : (prevStep == Direction::West ? -1 : 0)); if(prevStep != m_oPrevStep) { // reenter AdvanceToClean state; m_bIsCurrentPathInit = false; // recalculate path m_oCurrentState = AlgoState::FindWall; m_oPrevStep = prevStep; m_nMismatchCount++; } // get sensor information SensorInformation oSI = m_pSensor->sense(); int i = m_oPos.i; int j = m_oPos.j; if (m_oMatrix.exists(m_oPos) && m_oMatrix[m_oPos] == '~' && oSI.dirtLevel == 0) m_nUnexploredOrDustyCellsCount--; // update current position dust level if(!(i == 0 && j == 0) && m_oMatrix[m_oPos] != 'C') m_oMatrix[m_oPos] = (char)(oSI.dirtLevel + '0'); if (m_oMatrix[m_oPos] == '0') m_oMatrix[m_oPos] = ' '; if (m_oMatrix[m_oPos] >= '1' && m_oMatrix[m_oPos] <= '9') { m_oMatrix[m_oPos]--; if (m_oMatrix[m_oPos] == '0') // if finished cleaning { //m_oMatrix[m_oPos] = 'C'; m_nUnexploredOrDustyCellsCount--; } } // update neighbours wall information vector<Point> vNeighbours; m_oPos.getNeighbours(vNeighbours); for (Point point : vNeighbours) { int nIndex = DirToInt(direction(m_oPos, point)); if(oSI.isWall[nIndex] == false) { if (!m_oMatrix.exists(point)) { m_oMatrix[point] = '~'; m_nUnexploredOrDustyCellsCount++; } } else { m_oMatrix[point] = 'W'; } } Point prevPos = NeighbourTo(m_oPos, reverseDir(m_oPrevStep)); if(m_oMatrix[prevPos] == ' ' || m_oMatrix[prevPos] == '0') { vector<Point> vNeighbours; prevPos.getNeighbours(vNeighbours); int nWallNeighboursCount = 0; for (Point oNeighbour : vNeighbours) { if(m_oMatrix[oNeighbour] == 'W') nWallNeighboursCount++; } vector<Point> vExtendedNeighbours; prevPos.getNeighbours(vExtendedNeighbours, true); int nWallExtendedNeighboursCount = 0; for (Point oNeighbour : vExtendedNeighbours) { if(isWallOrUnknown(oNeighbour)) nWallExtendedNeighboursCount++; } int nDiagonalNeighbours = nWallExtendedNeighboursCount - nWallNeighboursCount; bool isWallable = false; int i = prevPos.i; int j = prevPos.j; /*if(!(isWallOrUnknown({i + 1, j}) && (isWallOrUnknown({i - 1, j - 1}) || isWallOrUnknown({i - 1, j}) || isWallOrUnknown({i - 1, j + 1}))) && !(isWallOrUnknown({i, j - 1}) && (isWallOrUnknown({i - 1, j + 1}) || isWallOrUnknown({i, j + 1}) || isWallOrUnknown({i + 1, j + 1}))) && !(isWallOrUnknown({i - 1, j}) && (isWallOrUnknown({i + 1, j + 1}) || isWallOrUnknown({i + 1, j - 1}))) && !(isWallOrUnknown({i, j + 1}) && (isWallOrUnknown({i - 1, j - 1}) || isWallOrUnknown({i + 1, j - 1})))) { isWallable = true; }*/ if(nWallNeighboursCount == 0) { if(nDiagonalNeighbours == 1) isWallable = true; } else if(nWallNeighboursCount == 1) { if(!(isWallOrUnknown({i + 1, j}) && (isWallOrUnknown({i - 1, j - 1}) || isWallOrUnknown({i - 1, j + 1}))) && !(isWallOrUnknown({i, j - 1}) && (isWallOrUnknown({i - 1, j + 1}) || isWallOrUnknown({i + 1, j + 1}))) && !(isWallOrUnknown({i - 1, j}) && (isWallOrUnknown({i + 1, j + 1}) || isWallOrUnknown({i + 1, j - 1}))) && !(isWallOrUnknown({i, j + 1}) && (isWallOrUnknown({i - 1, j - 1}) || isWallOrUnknown({i + 1, j - 1})))) { isWallable = true; } } else if(nWallNeighboursCount == 2) { if((isWallOrUnknown({i, j - 1}) && isWallOrUnknown({i + 1, j}) && !isWallOrUnknown({i - 1, j + 1})) || (isWallOrUnknown({i, j - 1}) && isWallOrUnknown({i - 1, j}) && !isWallOrUnknown({i + 1, j + 1})) || (isWallOrUnknown({i, j + 1}) && isWallOrUnknown({i + 1, j}) && !isWallOrUnknown({i - 1, j - 1})) || (isWallOrUnknown({i - 1, j}) && isWallOrUnknown({i, j + 1}) && !isWallOrUnknown({i + 1, j - 1}))) { isWallable = true; } } else if(nWallNeighboursCount == 3) { isWallable = true; } if(isWallable) m_oMatrix[prevPos] = 'W'; } // Handle current state Direction oDir; switch(m_oCurrentState) { case FindWall: oDir = HandleFindWall(); break; case FollowWall: oDir = HandleFollowWall(); break; case AdvanceToD: oDir = HandleAdvanceToD(); break; case AtD: oDir = HandleAtD(); break; case Finished: oDir = HandleFinish(); break; } m_oPrevStep = oDir; // update battery level (according to old position) if (m_oMatrix[i][j] == 'D') m_nBatteryLevel = std::min(m_nBatteryLevel + m_oConfig[BATTERY_RECHARGE_KEY], m_oConfig[BATTERY_CAPACITY_KEY]); else m_nBatteryLevel = std::max(m_nBatteryLevel - m_oConfig[BATTERY_CONSUMPTION_KEY], 0); // update steps to finish if (m_bAboutTofinish) m_stepsTillFinishing--; m_nSteps++; //cout << m_oMatrix << endl; return oDir; }