示例#1
0
        public PartialGameState GetPartialGameState()
        {
            return(new PartialGameState
            {
                PartialVoteStates = CurrentVotingOptions.Select(x =>
                {
                    var votesForOption = CurrentVotes.Values.Count(y => y == x.Id);

                    return new PartialVoteState
                    {
                        Id = x.Id,
                        Count = votesForOption
                    };
                })
            });
        }
示例#2
0
        public CompleteGameState GetCompleteGameState()
        {
            return(new CompleteGameState
            {
                PreviousResultDescription = PreviousVoteDescription,
                CurrentRound = _currentVotingRound,
                VoteOptionsState = CurrentVotingOptions.Select(x =>
                {
                    var votesForOption = CurrentVotes.Values.Count(y => y == x.Id);

                    return new FullVoteOptionState
                    {
                        Description = x.Description,
                        Id = x.Id,
                        Count = votesForOption
                    };
                }).ToArray()
            });
        }
示例#3
0
        public async Task CastClientVote(int votedOptionId, string voterIPAddress, int round)
        {
            if (round != _currentVotingRound)
            {
                return;
            }

            if (!CurrentVotingOptions.Any(x => x.Id == votedOptionId))
            {
                return;
            }

            logger.LogDebug($"Casting vote from {voterIPAddress} for {votedOptionId} during round {round}");

            var hasVoterAlreadyVoted = CurrentVotes.TryGetValue(voterIPAddress, out var existingValue);

            if (hasVoterAlreadyVoted && existingValue.Equals(votedOptionId))
            {
                return;
            }

            if (hasVoterAlreadyVoted)
            {
                CurrentVotes.TryUpdate(voterIPAddress, votedOptionId, existingValue);
            }
            else
            {
                CurrentVotes.TryAdd(voterIPAddress, votedOptionId);
            }

            var currentVote = GetCurrentVoteOptionFromVotes();

            if (currentVote.Id != _currentVotingOption)
            {
                await PushNewVoteResultToHost(currentVote.ChaosId);
            }

            _currentVotingOption = currentVote.Id;

            await PushVoteStateToClients();
        }
示例#4
0
        public async Task SetNewVoteOptions(VoteOption[] newVotingOptions)
        {
            logger.LogInformation("Setting new vote options");

            PreviousVoteDescription = CurrentVotingOptions?.FirstOrDefault(x => x.Id == _currentVotingOption)?.Description
                                      ?? "No Voting rounds completed yet";

            CurrentVotingOptions = newVotingOptions;

            CurrentVotes.Clear();

            _currentVotingRound++;

            logger.LogInformation("Updating Game State");

            var currentVote = GetCurrentVoteOptionFromVotes();

            _currentVotingOption = currentVote.Id;

            await PushNewVoteResultToHost(currentVote.ChaosId);
            await PushNewVoteOptionsToClients();
        }
示例#5
0
        private VoteOption GetCurrentVoteOptionFromVotes()
        {
            var options = CurrentVotingOptions.Clone() as VoteOption[];
            var votes   = CurrentVotes.Values.ToArray();

            if (!votes.Any())
            {
                var randomIndex = random.Next(0, options.Length - 1);

                var randomVote = options[randomIndex];

                return(randomVote);
            }
            else
            {
                var groupings = votes.Where(x => options.Any(y => y.Id == x))
                                .GroupBy(x => x)
                                .OrderByDescending(x => x.Count());

                var maxCount = groupings.First().Count();

                var relevantGroupings = groupings.Where(x => x.Count() == maxCount);

                if (relevantGroupings.Count() == 1)
                {
                    return(options.First(x => x.Id == relevantGroupings.First().Key));
                }
                else
                {
                    var randomizedGroupingIndex = random.Next(0, relevantGroupings.Count());

                    var randomizedGrouping = relevantGroupings.ElementAt(randomizedGroupingIndex);

                    return(options.First(x => x.Id == randomizedGrouping.Key));
                }
            }
        }