コード例 #1
0
ファイル: PieceManager.cpp プロジェクト: essarrdee/Schaak
void PieceManager::randomMove(PieceID p, Board* b)
{
	pieces[p].displace(b);
	std::vector<sf::Vector2i> movePossibilities;
	for(auto it = pieces[p].myType->moveAttackOffsets.begin(); it != pieces[p].myType->moveAttackOffsets.end(); ++it)
	{
		sf::Vector2i newPosition = pieces[p].position + *it;
		if(onMap(newPosition))
			movePossibilities.push_back(newPosition);
	}
	for(auto it = pieces[p].myType->moveOffsets.begin(); it != pieces[p].myType->moveOffsets.end(); ++it)
	{
		sf::Vector2i newPosition = pieces[p].position + *it;
		if(onMap(newPosition))
			movePossibilities.push_back(newPosition);
	}
	sf::Vector2i chosenPosition = vectorRandomChoice(movePossibilities,pieces[p].position);
	killPiece(b->occupants[chosenPosition.x][chosenPosition.y],b);
	pieces[p].place(b,chosenPosition);
}
コード例 #2
0
ファイル: MapKnowledge.cpp プロジェクト: atompacman/Xerof
void MapKnowledge::discover(const Position& i_Pos, const RangeOfSight& i_ROS)
{
    m_LastTile = toSCoord(i_Pos.tileCoord());
    m_LastDir = i_Pos.facingDir();
    m_LastROS = &i_ROS;
    SCoord ulCorner(i_ROS.getWindowULCorner(m_LastDir));
    SCoord lrCorner(i_ROS.getWindowLRCorner(m_LastDir));

    SCoord centered;
    for (    centered.y = ulCorner.y; centered.y < lrCorner.y; ++centered.y) {
        for (centered.x = ulCorner.x; centered.x < lrCorner.x; ++centered.x) {
            Coord onMap(toCoord(m_LastTile + centered));
            if (!(onMap < m_Dim)) {
                continue;
            }
            std::vector<bool>::reference curr(operator()(onMap));
            curr = curr || i_ROS.isVisible(centered, m_LastDir);
        }
    }
}
コード例 #3
0
ファイル: PieceManager.cpp プロジェクト: essarrdee/Schaak
void PieceManager::AIMove(PieceID p, Board* b)
{
	Behaviour* bh = pieces[p].isBlack ? pieces[p].myType->behaviourBlack : pieces[p].myType->behaviourWhite;
	pieces[p].displace(b);
	movePossibilities.clear();
	//std::vector<std::tuple<int,int,sf::Vector2i> > movePossibilities;
	for(auto it = pieces[p].myType->moveAttackOffsets.begin(); it != pieces[p].myType->moveAttackOffsets.end(); ++it)
	{
		sf::Vector2i newPosition = pieces[p].position + *it;
		if(onMap(newPosition))
		{
			PieceID pp = b->occupants[newPosition.x][newPosition.y];
			if(!nullPiece(pp))
				if(pieces[pp].isBlack == pieces[p].isBlack)
					continue;
			int value = valuePosition(newPosition,p,b,bh,!nullPiece(pp));
			movePossibilities.push_back(std::make_tuple(value,rand(),newPosition));
		}

	}
	for(auto it = pieces[p].myType->moveOffsets.begin(); it != pieces[p].myType->moveOffsets.end(); ++it)
	{
		sf::Vector2i newPosition = pieces[p].position + *it;
		if(onMap(newPosition))
		{
			if(nullPiece (b->occupants[newPosition.x][newPosition.y]))
			{
				int value = valuePosition(newPosition,p,b,bh,false);

				movePossibilities.push_back(std::make_tuple(value,rand(),newPosition));
			}
		}
	}
	for(auto it = pieces[p].myType->attackOffsets.begin(); it != pieces[p].myType->attackOffsets.end(); ++it)
	{
		sf::Vector2i newPosition = pieces[p].position + *it;
		if(onMap(newPosition))
		{
			PieceID pp = b->occupants[newPosition.x][newPosition.y];
			if(!nullPiece(pp))
			{
				if(pieces[pp].isBlack != pieces[p].isBlack)
				{
					int value = valuePosition(newPosition,p,b,bh,true);
					movePossibilities.push_back(std::make_tuple(value,rand(),newPosition));
				}
			}
		}
	}
	std::sort(movePossibilities.begin(),movePossibilities.end(),
		[]
	(const std::tuple<int,int,sf::Vector2i>& left, const std::tuple<int,int,sf::Vector2i>& right) -> bool
	{
		if(std::get<0>(left) != std::get<0>(right))
			return std::get<0>(left) < std::get<0>(right);
		return std::get<1>(left) < std::get<1>(right);
	}
		);
	sf::Vector2i chosenPosition = pieces[p].position;
	bool successfulKill;
	if(movePossibilities.size() > 0)
	{
		chosenPosition = std::get<2>(movePossibilities.back());
		successfulKill = killPiece(b->occupants[chosenPosition.x][chosenPosition.y],b);
	}
	if(successfulKill)
		pieces[p].place(b,chosenPosition);
	else
		pieces[p].place(b,pieces[p].position);
}