public static float ScoreBoard(Board PreviousBoard, Board Board) { var previousPlayer = (byte)~Board.Header.WhoseTurnNext; var r = 0.0f; // Taking tiles is good. r += 50000 * (Board.CountOfHeldTiles(previousPlayer) - PreviousBoard.CountOfHeldTiles(previousPlayer)); // Taking pieces is also good. r += 50000 * (PreviousBoard.CountOfPieces(Board.Header.WhoseTurnNext) - Board.CountOfPieces(Board.Header.WhoseTurnNext)); var tierPieceCount = new int[2, ControlTiers.Length]; // Encourage board development. for (int i = 0; i < ControlTiers.Length; ++i) { tierPieceCount[0, i] = 0; tierPieceCount[1, i] = 0; foreach (var triangle in ControlTiers[i]) { if (triangle.Triangle % 2 != previousPlayer) { tierPieceCount[0, i] += PreviousBoard.GetTriangle(triangle); tierPieceCount[1, i] += Board.GetTriangle(triangle); } } } for (int i = 0; i < ControlTiers.Length - 1; ++i) { var tierDifference = tierPieceCount[1, i] - tierPieceCount[0, i]; r += TierValue[i] * tierDifference; } return r; }