void nextTakt() { Game.Teames[] currTeam; //deadLine = DateTime.Now.AddMinutes(3); if (gm.iCon > 12) { gm.step = 10; tm.Stop(); //for (int s = 0; s < 3; s++) udp.Send("ii" + JsonConvert.SerializeObject(gm), IP[s]); } else { //deadLine = DateTime.Now.AddMinutes(4); switch (Takt) { #region 0 такт - определение темы вопроса. Ожидание ставок от команд case 0: //Array.Clear(ok, 0, ok.Length); deadLine = DateTime.Now.AddSeconds(70); Takt = 1; string strZapros; SQLiteCommand cmdl; int questsCount = 0; gm.step = 2; //deadLine = null; do { gm.Cell = rn.rnd(); gm.theme = (byte)((gm.Cell + 5) / 6); if (gm.theme != 0) { //Проверим, сколько в выбранной теме осталось "незасвеченных" вопросов для данной игровой тройки //и при отсутствии таковых сменим тему на ту, в которой такие вопросы остались. strZapros = "select count(quests.id) as qCount " + "from quests left join i_see on (quests.id = i_see.quest_id and i_see.user_id in (" + usersid + ")) " + "where i_see.id is null and quests.themeId = " + themeID[gm.theme].ToString(); cmdl = new SQLiteCommand(strZapros, conn); try { questsCount = Convert.ToInt32(cmdl.ExecuteScalar()); if (questsCount < 3) { MessageBox.Show("Количество 'незасвеченных' вопросов в теме \"" + theme[gm.theme] + "\" - " + questsCount + " шт. " + Environment.NewLine + (questsCount == 0 ? "Будет произведена замена темы!" : "Добавьте в тему несколько новых вопросов!"), "Внимание!", MessageBoxButtons.OK, MessageBoxIcon.Warning); } } catch (SQLiteException ex) { Console.WriteLine(ex.Message); } } } while (questsCount == 0 && gm.theme != 0); // txb.Text += "ogg" + gm.step; //tm.Start(); //Установим размер начальных ставок в минимальное значение gm.team.ToList().ForEach(x => x.stavka = 25); break; #endregion #region 1 такт - обработка полученных ставок, определение очереди, получение вопроса case 1: Array.Clear(ok, 0, ok.Length); //deadLine = DateTime.Now.AddSeconds(25); gm.step = 3; gm.Cell = rn.rnd(); //if (gm.Cell == 0) gm.Cell = 1; /* if (gm.Cell == 0) * { * gm.step = 2; * //gm.iCon++; * //Takt = 0; * endOfIqon = true; * txb.Text += "ogg-zerro" + gm.step; * //tmSync.Start(); * for (int i = 0; i < 3; i++) ok[i] = false; * break; * }*/ //stavka = stavka.Select(value => (value == 0) ? 25 : value).ToArray(); gm.team.ToList().ForEach(x => { x.stavka = x.stavka == 0 ? 25 : x.stavka; x.iQash -= x.stavka; x.answer = ""; x.correct = false; }); /*for (int i = 0; i < 3; i++) * { * //stavka[i] = (stavka[i] == 0) ? 25 : stavka[i]; * // if (stavka[i] > gm.team[i].iQash) stavka[i] = gm.team[i].iQash; ВАЖНО!!! * if(gm.team[i].stavka == 0) * gm.team[i].stavka = 25; * gm.team[i].iQash -= gm.team[i].stavka; * gm.team[i].answer = ""; * gm.team[i].correct = false; * }*/ int[] st = gm.team.Select(x => x.stavka).ToArray(); //{ gm.team[0].stavka, gm.team[1].stavka, gm.team[2].stavka }; byte[] bAnsOrder = rul.ResponsePriority(gm.Cell, st); //if (gm.Cell != 0) //{ for (byte i = 0; i < gm.team.Count(); i++) { gm.team[bAnsOrder[i] - 1].answerOrder = i; } //} gm.activeTable = bAnsOrder[0]; #region получение вопроса string temaID; if (gm.theme != 0) { temaID = themeID[gm.theme].ToString(); } else { temaID = tema; //если тема кот в мешке, то выбираем все темы } string zaprosSpiskaVoprosov = "select quests.id " + "from quests left join i_see on (quests.id = i_see.quest_id and i_see.user_id in (" + usersid + ")) " + "where i_see.id is null and quests.themeId in (" + temaID + ") " + "GROUP BY quests.id ORDER BY quests.id LIMIT 10"; SQLiteCommand cml = new SQLiteCommand(zaprosSpiskaVoprosov, conn); DataTable dtVopros = new DataTable(); using (SQLiteDataReader sqr = cml.ExecuteReader()) { dtVopros.Load(sqr); } //questID = (dtVopros.Rows.Count * rn.rnd()) / 37;//определяем случайно id вопроса из списка в таблице dtVopros //questID = Convert.ToInt32(dtVopros.Rows[questID][0]);//questID - id случайного вопроса questID = Convert.ToInt32(dtVopros.Rows[0][0]); //Id первого незасвеченного вопроса //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* string listOfQuestions = "select quests.text from quests"; * SQLiteCommand cm = new SQLiteCommand(listOfQuestions, conn); * SQLiteDataReader rd = cm.ExecuteReader(); * DataTable dat = new DataTable(); * using (rd) //если есть данные, то записываем в таблицу dat * { * if (rd.HasRows) dat.Load(rd); * } * var stringArr = dat.AsEnumerable().Select(r => r.Field<string>("text")).ToArray(); * * string key = "Qade123asdasdasdqwewqeqw423412354232343253***????///"; * string cryptMessage; * for (int i = 0; i < stringArr.Length; i++) * { * cryptMessage = Crypt.Encrypt(stringArr[i], key); * stringArr[i] = cryptMessage; * }*/ /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// string zaprocVoprosa = "select quests.text, answer, IFNULL(media,'') " + "from quests where id = " + questID; cml = new SQLiteCommand(zaprocVoprosa, conn); SQLiteDataReader reader = cml.ExecuteReader(); if (reader.HasRows) { reader.Read(); gm.quest = Crypt.Decrypt(reader.GetString(0), key); gm.rightAnswer = Crypt.Decrypt(reader.GetString(1), key); if (!reader.IsDBNull(1)) { answerQ = Crypt.Decrypt(reader.GetString(1), key); } gm.idQuest = questID; //надо ли его посылать?? gm.media = reader.GetString(2); } #endregion Takt = 3; //log(); // txb.Text += "ogg" + gm.step; tmOtvet.Interval = 90000; //запускаем таймер с ожиданием ответа 1 команды deadLine = DateTime.Now.AddSeconds(90); tmOtvet.Start(); correct = false; break; #endregion #region 2 такт - обработка ответа первой команды case 3: //ответ первой команды if (gm.Cell == 0) { tmOtvet.Stop(); gm.step = 0; endOfIqon = true; // Array.Clear(ok, 0, ok.Length); } else { gm.step = 5; currTeam = gm.team.OrderBy(x => x.answerOrder).ToArray(); currTeam[0].correct = correct; //gm.team[gm.o1 - 1].correct = correct; if (correct) { ////Takt = -1; //gm.team[gm.o1 - 1].iQash += 4 * gm.team[gm.o1 - 1].stavka; currTeam[0].iQash += 3 * currTeam[0].stavka; //gm.iCon++; endOfIqon = true; //for (int i = 0; i < 3; i++) ok[i] = false; Array.Clear(ok, 0, ok.Length); } else //если ответ не верен запускаем таймер для приема ответа 2-ой команды { tmOtvet.Stop(); tmOtvet.Interval = 40000; deadLine = DateTime.Now.AddSeconds(50); tmOtvet.Start(); gm.activeTable = currTeam[1].table; //gm.o2; } Takt = 4; //log(); // txb.Text += "ogg" + gm.step; } break; #endregion #region 3 такт - обработка ответ второй команды (если дойдет дело) case 4: //ответ второй команды gm.step = 6; currTeam = gm.team.OrderBy(x => x.answerOrder).ToArray(); currTeam[1].correct = correct; //gm.team[gm.o2 - 1].correct = correct; if (correct) { //Takt = -1; //gm.iCon++; currTeam[1].iQash += 2 * currTeam[1].stavka; //gm.team[gm.o2 - 1].iQash += 2 * gm.team[gm.o2 - 1].stavka; endOfIqon = true; //for (int i = 0; i < 3; i++) ok[i] = false; Array.Clear(ok, 0, ok.Length); } else //если ответ не верен запускаем таймер для приема ответа 3-ой команды { gm.activeTable = currTeam[2].table; tmOtvet.Stop(); tmOtvet.Interval = 40000; deadLine = DateTime.Now.AddSeconds(50); tmOtvet.Start(); } Takt = 5; //log(); // txb.Text += "ogg" + gm.step; break; #endregion #region 4 такт - обработка ответ третьей команды (если дойдет дело) case 5: //ответ третьей команды gm.step = 7; currTeam = gm.team.OrderBy(x => x.answerOrder).ToArray(); currTeam[2].correct = correct; //gm.team[gm.o3 - 1].correct = correct; if (correct) { currTeam[2].iQash += currTeam[2].stavka; } //gm.team[gm.o3 - 1].iQash += gm.team[gm.o3 - 1].stavka; endOfIqon = true; Array.Clear(ok, 0, ok.Length); //log(); //txb.Text += "ogg" + gm.step; break; #endregion } } //Отправим сообщение всем столам данной игровой тройки if (gm.step != 0) { //if (gm.Cell != 0) Send2All("ogg"); } if (endOfIqon) { endOfIqon = false; //gm.step = 7; log(); stavka = stavka.Select(x => x = 25).ToArray(); //Array.Clear(stavka, 0, stavka.Length); Array.Clear(ok, 0, ok.Length); deadLine = DateTime.Now.AddSeconds(150); gs.stopButton.PerformClick(); gm.iCon++; gm.step = 1; Takt = 0; Task.Factory.StartNew(() => { System.Threading.Thread.Sleep(7000); Send2All("ogg"); }); //System.Threading.Thread.Sleep(7000); //stopGame(); if (gm.iCon > 12) { gm.Cell = rn.rnd(); gm.quest = ""; gm.theme = 0; //////////////////////////////////////Перерасчет рейтинга на конец игры//////////////////////////////////////////////////////////// var mesta = ResponsePriority(gm.Cell, gm.team.Select(x => x.iQash << 2).ToArray()); for (int i = 0; i < 3; i++) { gm.team[mesta[i] - 1].answerOrder = (byte)i; gm.team[mesta[i] - 1].answer = ""; gm.team[mesta[i] - 1].correct = false; gm.team[mesta[i] - 1].stavka = 0; } Ratings rating = new Ratings(this, mycon, mesta); var rat = rating.getRatings(); Array.Sort(rat); Array.Reverse(rat); for (int i = 0; i < 3; i++) { foreach (teams.members member in this.data.team[mesta[i] - 1].member) { if (member != null) { member.rait += rat[i]; string sql = "UPDATE users SET rating=" + member.rait + " WHERE id=\"" + member.id + "\""; MySqlCommand cm = new MySqlCommand(sql, mycon); cm.ExecuteNonQuery(); } } } log(); WebBrowser webBrowser = new WebBrowser(); webBrowser.ScriptErrorsSuppressed = true; String requestString = String.Format("700iq.by/{0}/{1}", bin2Hex("calc_game_stat"), bin2Hex(String.Format("game_id={0}&zone_id={1}", data.idGame, data.GameZone))); webBrowser.Navigate(requestString); string logs = "select * from logs where gameid = " + data.idGame + " AND zone = " + data.GameZone; MySqlCommand cm1 = new MySqlCommand(logs, mycon); MySqlDataReader rd = cm1.ExecuteReader(); DataTable dat = new DataTable(); using (rd) //если есть данные, то записываем в таблицу dat { if (rd.HasRows) { dat.Load(rd); } } var loggs = dat.AsEnumerable().Select(r => r.Field <string>("command")).ToArray(); SendLog [] jsonobj = new SendLog[loggs.Length]; for (int i = 0; i < loggs.Length; i++) { jsonobj[i] = JsonConvert.DeserializeObject <SendLog>(loggs[i]); } Questions qt = new Questions(); for (int i = 0; i < loggs.Length - 1; i++) { qt.quest[i] = jsonobj[i].gmLog.quest; qt.answer[i] = jsonobj[i].gmLog.rightAnswer; } string str = JsonConvert.SerializeObject(qt); bytes = Encoding.UTF8.GetBytes("lst" + JsonConvert.SerializeObject(qt)); for (int i = 0; i < 3; i++) { if (endpoint[i] is IPEndPoint) { udp.Send(bytes, bytes.Length, endpoint[i]); } } } } //if (gm.Cell == 0) //Send2All("ogg"); }
void log() //сохранение данных - логирование { SendLog sLog = new SendLog(); //string vopr = gm.quest; //gm.quest = ""; //Если не хотим писать текст вопроса в лог sLog.gmLog = gm; sLog.dataLog = data; sLog.idTheme = themeID; sLog.Themes = theme; sLog.usersid = usersid; //sLog.gmLog.iCon--; //Записываем в базу данные не на начало следующего айкона, а на конец текущего. string sql = " insert into logs (gameid, zone, iqon_num, command) value (" + data.idGame + ", " + data.GameZone + ", " + sLog.gmLog.iCon + ",'" + JsonConvert.SerializeObject(sLog) + "')"; sql = sql.Replace("\\", "\\\\"); //mycon.Open(); MySqlCommand cmd = new MySqlCommand(sql, mycon); cmd.ExecuteNonQuery(); try { //определение есать ли у вопроса владелец, если есть владелец то внести в таблицу Payment//////////////////////////////////// double WiQash = 0; int ownerId = Convert.ToInt32(ReadString("SELECT user_id from questOwner WHERE quest_id = " + gm.idQuest + "")); for (int i = 0; i < 3; i++) { if (gm.team[i].correct) { switch (gm.team[i].answerOrder) { case 0: WiQash = 0; break; case 1: { for (int j = 0; j < 3; j++) { if (gm.team[j].answerOrder == 0) { WiQash = Math.Round(gm.team[j].stavka * 0.03); } } } break; case 2: { for (int j = 0; j < 3; j++) { if (gm.team[j].answerOrder == 0 || gm.team[j].answerOrder == 1) { WiQash += gm.team[j].stavka; } } WiQash = Math.Round(WiQash * 0.04); } break; } } } if ((gm.team[0].correct == gm.team[1].correct == gm.team[2].correct == false) && (gm.Cell != 0)) { WiQash = Math.Round((gm.team[0].stavka + gm.team[1].stavka + gm.team[2].stavka) * 0.05); } cmd = new MySqlCommand("insert into questPayment (gameid, zone, userid, questid, iqash) value(" + data.idGame + ", " + data.GameZone + "," + ownerId + "," + gm.idQuest + "," + WiQash + ")", mycon); cmd.ExecuteNonQuery(); //конец записи в Payment ////////////////////////////////////////////////////////////////////////////////////////////// } catch { }; var gmMembers = data.team.SelectMany(x => x.member.Where(c => c != null)); //отберем всех участников игровой тройки foreach (var tUser in gmMembers) //и занесем в базу "засвеченный" вопрос { sql = String.Format("INSERT INTO i_see (user_id, quest_id) values ({0}, {1})", tUser.id, gm.idQuest); SQLiteCommand cml = new SQLiteCommand(sql, conn); cml.ExecuteNonQuery(); } this.gs.iCon.Text = (sLog.gmLog.iCon + 1).ToString(); sLog = null; }