Ejemplo n.º 1
0
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();
}
Ejemplo n.º 2
0
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();
}
Ejemplo n.º 3
0
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;
}