private KamokoGameStateServer NewGameState(CreateGameRequest req, DateTime start, DateTime end) { var course = _courses[req.Course]; #region Random Selection var init = new List <int>(); for (int i = 0; i < course.Length; i++) { init.Add(i); } var rand = new List <int>(); while (init.Count > 0) { if (init.Count == 1) { rand.Add(init[0]); break; } var idx = _rnd.Next(0, init.Count); var tmp = init[idx]; init.RemoveAt(idx); rand.Add(tmp); } var select = new QuestSentence[req.Questions]; for (var i = 0; i < select.Length; i++) { var idx = _rnd.Next(0, rand.Count); var tmp = rand[idx]; rand.RemoveAt(idx); select[i] = course[tmp]; } #endregion return(new KamokoGameStateServer { AdminId = Guid.NewGuid(), Course = req.Course, Difficult = req.Difficult, Start = start, End = end, GameId = Guid.NewGuid(), Questions = select, Timeout = req.Timeout < 5 ? 5 : req.Timeout }); }
static void Main(string[] args) { var ofd = new OpenFileDialog(); ofd.ShowDialog(); var sen = new List <Sentence>(); foreach (var path in ofd.FileNames) { using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read)) { var xml = new XmlSerializer(typeof(Course)); var course = xml.Deserialize(fs) as Course; foreach (var d in course.Documents) { foreach (var s in d.Sentences) { var valid = true; foreach (var f in s.Fragments) { if (f is ConstantFragment) { continue; } if (f is VariableFragment v) { if (v.Fragments.Any(x => x is VariableFragment)) // Keine zu komplexen Beispiele auswählen { valid = false; break; } foreach (var o in v.Fragments) // optionen { var option = o as ConstantFragment; if (option == null) { continue; } if (option.SpeakerVotes.Count < 2) { valid = false; break; } var first = option.SpeakerVotes.First().Vote; // Wird (A) für die Überprüfung für gleiches Urteil UND (B) als Wert für QuestionSentence verwendet. if (first is VoteReservation) // Akzeptiere keine "Bedingte Zustimmung" { valid = false; break; } for (var i = 1; i < option.SpeakerVotes.Count; i++) // Alle Muttersprachler müssen das gleiche Urteil fällen. { if (option.SpeakerVotes[i].Vote.Level != first.Level) { valid = false; break; } } if (!valid) { break; } } if (!valid) { break; } } } sen.Add(s); } } } } var sfd = new SaveFileDialog { Filter = "KAMOKO-QuestionSample (*.kamokoQuest)|*.kamokoQuest" }; sfd.ShowDialog(); var quests = new List <QuestSentence>(); foreach (var s in sen) { var ns = new QuestSentence(); foreach (var f in s.Fragments) { if (f is ConstantFragment c) { ns.AddConstant(c.Content); } if (!(f is VariableFragment v)) { continue; } var texts = new List <string>(); var votes = new List <int>(); foreach (var cf in v.Fragments.OfType <ConstantFragment>()) { if (cf.SpeakerVotes.Count < 2) { continue; } texts.Add(cf.Content); votes.Add(cf.SpeakerVotes.First().Vote.Level == 10 ? 1 : -1); } if (votes.Count == 0) { ns = null; break; } ns.AddOption(texts.ToArray(), votes.ToArray()); } if (ns != null) { quests.Add(ns); } } File.WriteAllText(sfd.FileName, JsonConvert.SerializeObject(quests.ToArray()), Encoding.UTF8); }