public IActionResult GetQuestionData(int id) { var questionSpecification = new QuizQuestionSpecification(id); var question = _questionRepository.Query(questionSpecification).First(); var answerSpecification = new QuizAnswerSpecification(questionId: id); var answers = _answerRepository.Query(answerSpecification); question.Answers = answers; return(Ok(question)); }
public QuizResult EndGame(User user, bool won = true, bool timeOver = false) { var gameIndex = _runningGames.FindIndex(g => g.UserId == user.UserId); // TODO: Throw error if no game has been found (gameIndex = -1) var runningGame = _runningGames[gameIndex]; _runningGames.RemoveAt(gameIndex); var game = new Game { Start = runningGame.TimeStarted, UserId = user.UserId }; var gameId = _gameRepository.Create(game); if (runningGame.CurrentQuestion != null) { runningGame.CurrentQuestion.TimeAnswered = DateTime.Now; runningGame.AskedQuestions.Add(runningGame.CurrentQuestion); } foreach (var question in runningGame.AskedQuestions) { var round = new Round { Duration = (int)(question.TimeAnswered - question.TimeAsked).TotalSeconds, AnswerId = question.AnsweredAnswer?.AnswerId, GameId = gameId, QuestionId = question.QuestionId, UsedJoker = question.JokerUsed }; _roundRepository.Create(round); } foreach (var category in runningGame.Categories) { var categoryGame = new CategoryGame(category, gameId); _categoryGameRepository.Create(categoryGame); } var result = runningGame.End(won, timeOver); var questionId = runningGame.CurrentQuestion?.QuestionId ?? runningGame.AskedQuestions.Last().QuestionId; var answerSpecification = new QuizAnswerSpecification(questionId: questionId, correct: true); var answer = _answerRepository.Query(answerSpecification).First(); result.CorrectAnswer = answer.Answer; return(result); }
public List <QuizQuestion> GetQuestions(int categoryId) { var quizQuestionSpecification = new QuizQuestionSpecification(categoryId: categoryId); var quizQuestions = _questionRepository.Query(quizQuestionSpecification); foreach (var question in quizQuestions) { var quizAnswerSpecification = new QuizAnswerSpecification(questionId: question.QuestionId); var quizAnswers = _answerRepository.Query(quizAnswerSpecification); question.Answers = quizAnswers; } return(quizQuestions); }
public void DeleteQuestion(int id) { var quizAnswerSpecification = new QuizAnswerSpecification(questionId: id); var quizAnswers = _answerRepository.Query(quizAnswerSpecification); foreach (var answer in quizAnswers) { _answerRepository.Delete(answer); } var quizQuestionSpecification = new QuizQuestionSpecification(id); var quizQuestion = _questionRepository.Query(quizQuestionSpecification).First(); _questionRepository.Delete(quizQuestion); }
public void TestAskQuestion() { var quizQuestion = _questionRepository.List.First(); var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId); var quizAnswers = _answerRepository.Query(answerSpecification); quizQuestion.Answers = quizAnswers; var question = new GameQuestion(quizQuestion, 0, 0); var game = new RunningGame(0, new[] { 0 }); game.AskQuestion(question); Assert.Equal(question, game.CurrentQuestion); }
public void TestUseJoker() { var quizQuestion = _questionRepository.List.First(); var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId); var quizAnswers = _answerRepository.Query(answerSpecification); quizQuestion.Answers = quizAnswers; var question = new GameQuestion(quizQuestion, 0, 0); var game = new RunningGame(0, new[] { 0 }); game.AskQuestion(question); game.UseJoker(); Assert.True(game.JokerUsed); }
public IQuestion <GameAnswer> GetQuestion(User user) { var gameIndex = _runningGames.FindIndex(g => g.UserId == user.UserId); var game = _runningGames[gameIndex]; // TODO: Throw error if no game has been found // TODO: Check if current question is unanswered var quizQuestionSpecification = new QuizQuestionSpecification(categories: game.Categories, excludeQuestions: game.QuestionIds); var quizQuestions = _questionRepository.Query(quizQuestionSpecification); var random = new Random(); QuizQuestion quizQuestion; if (quizQuestions.Count != 0) { var index = random.Next(quizQuestions.Count); quizQuestion = quizQuestions[index]; } else { throw new NoMoreQuestionsException( "There are no more questions available in the selected categories for this quiz!"); } var quizAnswerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId); var quizAnswers = _answerRepository.Query(quizAnswerSpecification); quizQuestion.Answers = quizAnswers; var correctAnswer = quizAnswers.First(a => a.Correct); var roundSpecification = new RoundSpecification(questionId: quizQuestion.QuestionId); var rounds = _roundRepository.Query(roundSpecification); var correctlyAnswered = rounds.Count(r => r.AnswerId == correctAnswer.AnswerId); var question = new GameQuestion(quizQuestion, rounds.Count, correctlyAnswered); _runningGames[gameIndex].AskQuestion(question); return(question); }
public void TestAnswerQuestionIncorrect() { var quizQuestion = _questionRepository.List.First(); var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId); var quizAnswers = _answerRepository.Query(answerSpecification); quizQuestion.Answers = quizAnswers; var question = new GameQuestion(quizQuestion, 0, 0); var game = new RunningGame(0, new[] { 0 }); game.AskQuestion(question); var answer = quizAnswers.First(a => !a.Correct); var result = game.AnswerQuestion(answer); Assert.True(!result.Correct); }
public void TestEndGame() { var quizQuestion = _questionRepository.List.First(); var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId); var quizAnswers = _answerRepository.Query(answerSpecification); quizQuestion.Answers = quizAnswers; var question = new GameQuestion(quizQuestion, 0, 0); var game = new RunningGame(0, new[] { 0 }); game.AskQuestion(question); var answer = quizAnswers.First(a => a.Correct); var answerResult = game.AnswerQuestion(answer); var result = game.End(answerResult.Correct && !answerResult.TimeOver, answerResult.TimeOver); Assert.Equal(30, result.Points); }
public void TestUseJoker() { var quizQuestion = _questionRepository.List.First(); var answerSpecification = new QuizAnswerSpecification(questionId: quizQuestion.QuestionId); var quizAnswers = _answerRepository.Query(answerSpecification); quizQuestion.Answers = quizAnswers; // Would be much better: /* * var question = new GameQuestion(quizQuestion, quizAnswers, 0, 0); */ var question = new GameQuestion(quizQuestion, 0, 0); question.UseJoker(); var hiddenAnswers = question.Answers.Where(a => a.HiddenAnswer); Assert.Equal(2, hiddenAnswers.Count()); }
public dynamic AnswerQuestion(User user, int questionId, int answerId) { var gameIndex = _runningGames.FindIndex(g => g.UserId == user.UserId); // TODO: Throw error if no game has been found (gameIndex = -1) var quizQuestionSpecification = new QuizQuestionSpecification(questionId); var quizQuestion = _questionRepository.Query(quizQuestionSpecification).FirstOrDefault(); // TODO: Check if question doesn't exist // TODO: Check if question is the currently asked question var quizAnswerSpecification = new QuizAnswerSpecification(answerId, questionId); var quizAnswer = _answerRepository.Query(quizAnswerSpecification).FirstOrDefault(); // TODO: Check if answerId is valid var result = _runningGames[gameIndex].AnswerQuestion(quizAnswer); return(result.Correct && !result.TimeOver ? (dynamic)result : EndGame(user, result.Correct && !result.TimeOver, result.TimeOver)); }
public List <Game> GetGames(User user = null) { var games = _gameRepository.List.ToList(); // Grab all the games to calculate the rank foreach (var game in games) { var roundSpecification = new RoundSpecification(game.GameId); var rounds = _roundRepository.Query(roundSpecification); game.Rounds = rounds; var lastAnswerSpecification = new QuizAnswerSpecification(rounds.Last().AnswerId); var lastAnswer = _answerRepository.Query(lastAnswerSpecification).First(); var gameWon = lastAnswer.Correct && rounds.Last().Duration <= 120; int duration = 0; int points = 0; foreach (var round in rounds) { duration += round.Duration; if (!gameWon) { continue; } var answerSpecification = new QuizAnswerSpecification(round.AnswerId); var answer = _answerRepository.Query(answerSpecification).First(); if (answer.Correct) { points += 30; } } game.Duration = duration; game.Points = points; game.WeightedPoints = game.Points / Math.Max(game.Duration, 1); var categoryGameSpecification = new CategoryGameSpecification(gameId: game.GameId); var categoryGames = _categoryGameRepository.Query(categoryGameSpecification); foreach (var categoryGame in categoryGames) { game.Categories.Add(categoryGame.CategoryId); } if (user != null && game.UserId != user.UserId) { continue; // Saves time by not grabbing information for unneeded games } } var weightedPointsComparer = new GameWeightedPointsComparer(); games.Sort(weightedPointsComparer); if (user != null) { games = games.Where(g => g.UserId == user.UserId || g.Points > 0 && !g.Hidden).ToList(); var currRank = 1; foreach (var game in games) { if (game.Points <= 0 || game.Hidden) { continue; } game.Rank = currRank; currRank++; } games = games.Where(g => g.UserId == user.UserId).ToList(); var dateComparer = new GameDateComparer(); games.Sort(dateComparer); } else { games = games.Where(g => g.Points > 0 && !g.Hidden).ToList(); for (int i = 0; i < games.Count; i++) { games[i].Rank = i + 1; } } return(games); }