public static Board GetNewBoard() { Board board = new Board(); board._unplayedPieces.Add(new QueenBee(PieceColor.White, 1)); board._unplayedPieces.Add(new Beetle(PieceColor.White, 1)); board._unplayedPieces.Add(new Beetle(PieceColor.White, 2)); board._unplayedPieces.Add(new Spider(PieceColor.White, 1)); board._unplayedPieces.Add(new Spider(PieceColor.White, 2)); board._unplayedPieces.Add(new Hopper(PieceColor.White, 1)); board._unplayedPieces.Add(new Hopper(PieceColor.White, 2)); board._unplayedPieces.Add(new Hopper(PieceColor.White, 3)); board._unplayedPieces.Add(new Ant(PieceColor.White, 1)); board._unplayedPieces.Add(new Ant(PieceColor.White, 2)); board._unplayedPieces.Add(new Ant(PieceColor.White, 3)); board._unplayedPieces.Add(new QueenBee(PieceColor.Black, 1)); board._unplayedPieces.Add(new Beetle(PieceColor.Black, 1)); board._unplayedPieces.Add(new Beetle(PieceColor.Black, 2)); board._unplayedPieces.Add(new Spider(PieceColor.Black, 1)); board._unplayedPieces.Add(new Spider(PieceColor.Black, 2)); board._unplayedPieces.Add(new Hopper(PieceColor.Black, 1)); board._unplayedPieces.Add(new Hopper(PieceColor.Black, 2)); board._unplayedPieces.Add(new Hopper(PieceColor.Black, 3)); board._unplayedPieces.Add(new Ant(PieceColor.Black, 1)); board._unplayedPieces.Add(new Ant(PieceColor.Black, 2)); board._unplayedPieces.Add(new Ant(PieceColor.Black, 3)); board._hivailableHexes.Add(new Hex(24, 24), Hivailability.GetHivailability(board, new Hex(24, 24), true)); return(board); }
private void RefreshAllHivailability(bool forceBlackCanPlace = false) { _hivailableHexes.Clear(); foreach (Hex hex in _playedPieces.Values) { foreach (Hex directionHex in Neighborhood.neighborDirections) { // don't do the center if (directionHex.Equals(new Hex(0, 0))) { continue; } Hex adjacentHex = hex + directionHex; Piece adjacentPiece; if (!TryGetPieceAtHex(adjacentHex, out adjacentPiece)) { // empty space, add/update hivailability if (!_hivailableHexes.ContainsKey(adjacentHex)) { _hivailableHexes.Add(adjacentHex, Hivailability.GetHivailability(this, adjacentHex, false, forceBlackCanPlace)); } } } } }
/// <summary> /// returns the number of empty neighbors for a piece on the board /// returns .int.MaxValue if the given piece is unplayed /// </summary> /// <param name="piece"></param> /// <returns></returns> public int BreathingSpaces(Piece piece) { Hex hex; if (TryGetHexOfPlayedPiece(piece, out hex)) { var hivailability = Hivailability.GetHivailability(this, hex); return(hivailability.EmptyNeighborHexes(hex).Count); } else { return(6); } }
internal static Hivailability GetHivailability(Board board, Hex hex, bool forceWhitePlacement = false, bool forceBlackPlacement = false) { Hivailability hivailability = new Hivailability(); hivailability._neighborStatus[(int)Position.topright] = GetNeighborStatus(board, hex, Position.topright); hivailability._neighborStatus[(int)Position.right] = GetNeighborStatus(board, hex, Position.right); hivailability._neighborStatus[(int)Position.bottomright] = GetNeighborStatus(board, hex, Position.bottomright); hivailability._neighborStatus[(int)Position.bottomleft] = GetNeighborStatus(board, hex, Position.bottomleft); hivailability._neighborStatus[(int)Position.left] = GetNeighborStatus(board, hex, Position.left); hivailability._neighborStatus[(int)Position.topleft] = GetNeighborStatus(board, hex, Position.topleft); hivailability._isBlocked[(int)Position.topright] = IsDirectionBlocked(Position.topright, Position.topleft, Position.right, hivailability._neighborStatus); hivailability._isBlocked[(int)Position.right] = IsDirectionBlocked(Position.right, Position.topright, Position.bottomright, hivailability._neighborStatus); hivailability._isBlocked[(int)Position.bottomright] = IsDirectionBlocked(Position.bottomright, Position.right, Position.bottomleft, hivailability._neighborStatus); hivailability._isBlocked[(int)Position.bottomleft] = IsDirectionBlocked(Position.bottomleft, Position.bottomright, Position.left, hivailability._neighborStatus); hivailability._isBlocked[(int)Position.left] = IsDirectionBlocked(Position.left, Position.bottomleft, Position.topleft, hivailability._neighborStatus); hivailability._isBlocked[(int)Position.topleft] = IsDirectionBlocked(Position.topleft, Position.left, Position.topright, hivailability._neighborStatus); if (hivailability._neighborStatus.Contains(NeighborStatus.Black)) { hivailability._blackCanPlace = true; } if (hivailability._neighborStatus.Contains(NeighborStatus.White)) { hivailability._whiteCanPlace = true; } if (hivailability._whiteCanPlace && hivailability._blackCanPlace) { hivailability._blackCanPlace = false; hivailability._whiteCanPlace = false; } // the initial hivailable space is just for white if (forceWhitePlacement) { hivailability._whiteCanPlace = true; } // the second turn hivailable spaces are for black despite being next to white if (forceBlackPlacement) { hivailability._blackCanPlace = true; } return(hivailability); }