Esempio n. 1
0
        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");
        }
Esempio n. 2
0
        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;
        }