/// <summary> /// Select good player based on /// 1. CompletedSessions/TotalSessions /// 2. Currently returns the first from the list of good players /// </summary> /// <param name="neighbors"></param> /// <returns></returns> private string selectBestPlayer(List<string> neighbors) { List<string> goodPlayers = new List<string>(); List<string> newPlayers = new List<string>(); double maxFraction = 0; string discoveredNeighborStr = "Discovered Neighbors = "; //Following loop selects goodPlayers (players with nonzero game-playing history). //and newPlayers(players present in credibilityStore but have no game history => totalSessions == 0) foreach (string neighbor in neighbors) { discoveredNeighborStr += neighbor + " "; //consider pr only if it is in credibilityDataStore PlayerHistoryRecord pr = credibilityDataStore.Find(delegate(PlayerHistoryRecord player) { return neighbor.Equals(player.PlayerDevID); }); if (pr != null) { if (pr.TotalSessions != 0 && maxFraction < (double)pr.CompletedSessions / (double)pr.TotalSessions) { maxFraction = (double)pr.CompletedSessions / (double)pr.TotalSessions; goodPlayers.Clear(); goodPlayers.Add(pr.PlayerDevID); } else if (pr.TotalSessions != 0 && maxFraction == (double)pr.CompletedSessions / (double)pr.TotalSessions) goodPlayers.Add(pr.PlayerDevID); else if (pr.TotalSessions == 0) //TEST THIS newPlayers.Add(pr.PlayerDevID); } else //found new neighbor playing with this App. Add this by default to good players. { PlayerHistoryRecord newPlayer = new PlayerHistoryRecord(neighbor); lock (credibilityDataStore) { credibilityDataStore.Add(newPlayer); } newPlayers.Add(newPlayer.PlayerDevID); } } logAndDisplay(discoveredNeighborStr); string goodNeighborsStr = "Good Neighbors = "; foreach (string player in goodPlayers) goodNeighborsStr += player + " "; logAndDisplay(goodNeighborsStr); if (goodPlayers.Count != 0) { Random generator = new Random(); int index = generator.Next(0, goodPlayers.Count - 1); return goodPlayers.ToArray()[index]; } else if (newPlayers.Count != 0) { Random generator = new Random(); int index = generator.Next(0, newPlayers.Count - 1); return newPlayers.ToArray()[index]; } return null; }
/// <summary> /// Reads Playing History of the neighbors from a file and loads into credibilityDataStore. /// Called at application initialization /// </summary> private void ReadCredibilityHistory() { credibilityDataStore = new List<PlayerHistoryRecord>(); StreamReader reader = null; if (File.Exists(credibilityFilePath) == false) return; reader = File.OpenText(credibilityFilePath); lock (credibilityDataStore) { while (reader.EndOfStream == false) { string playerID = reader.ReadLine().Trim(); PlayerHistoryRecord player = new PlayerHistoryRecord(playerID); int completedSessions = Int32.Parse(reader.ReadLine().Trim()); player.CompletedSessions = completedSessions; int totalSessions = Int32.Parse(reader.ReadLine().Trim()); player.TotalSessions = totalSessions; //It is important to read sessions line, even if it is blank. string[] sessions = reader.ReadLine().Trim().Split(new char[] { ' ' }); if (totalSessions != 0) { foreach (string session in sessions) { bool status = session.Equals("1") ? true : false; player.updateHistory(status); } } credibilityDataStore.Add(player); } } reader.Close(); }