Добрый день уважаемые пользователи данного портала. Пишу вам с просьбой помочь мне доделать алгоритм распределения матчей и генерации данной сетки. Суть проблемы: если при регистрации турнира указать максимум 16 команд и в процессе регистрации на турнир зарегистрируются 16 команд, то всё норм, а если хотя бы на одну команду меньше, то вот здесь уже начинается проблемос. Вот как должно работать, если хотя бы на 1 команду меньше. Ниже описывается сколько участников всупят в первый день, у меня же это считается первая стадия, точнее максимальная(Стадия - Круг, в котором встречаются четыре игрока, называется полуфиналом. При числе участников свыше 16 круг, ему предшествующий, т. е. в котором встречаются восемь игроков, называется четвертьфиналом.) Теперь что у меня не получается: я могу расчитать количество команд, которые должны начать играть в первый день, и вот тут начинается проблемос. Возьмем например максимум 16 команд, это 4 стадии. У меня зарегистрировались всего 9, получается на 4 стадии играют 2 команды(рассчитывая по формуле), а остальные 7 начинают с третьей стадии. Сетка генерируется по матчам, таблица матчей выглядит так: Так вот как мне сделать, чтобы скрипт правильно понимал, сколько команд в первой стадии, а остальных кидал на предыдущую стадию. Если нужен скрипт, который генерирует данный запрос, выложу. Помогите пожалуйста. Третий день голову ломаю, ничего придумать не могу(
Как должна строиться сетка, если собралось нечетное количество команд, например 3? Добавлено спустя 5 минут 58 секунд: Отставить, вопрос снят ))) Просто начни писать код и покажи. Если хочешь чтобы за тебя всё целиком сделали, то тебе в другой раздел — "Фриланс", там за деньги договариваются.
Код у меня есть и работает. Я же написал, если регистрируется команд столько, сколько заявлено на турнир, то все норм, а если хотя бы на одну меньше, то тут уже нужно рассчитывать по формуле, приведенной выше. Код, которым я генерирую сетку: Контроллер Код (Text): public function tournament_grid ($tour_id = NULL) { // Получаем данные турнира $query = $this->dyn_tournaments->info_tournament($tour_id); // Получаем список матчей турнира $matches = $this->dyn_tournaments->get_all_matchs_in_tour_user($tour_id)->result_array(); // Список участников if($query[0]['type_register'] == 1) { $teams_players = $this->dyn_tournaments->get_all_teams_in_tour($tour_id)->result_array(); } elseif ($query[0]['type_register'] == 2) { $teams_players = $this->dyn_tournaments->get_all_players_in_tour($tour_id)->result_array(); } // Расчитываем количество стадий $stage = ceil(log($query[0]['numbers_teams'])/log(2)); $count = $query[0]['numbers_teams'] / 2; $counts = $count; $datas = array("8" => array(), "7" => array(), "6" => array(), "5" => array(), "4" => array(), "3" => array(), "2" => array(), "1" => array()); foreach ($matches as $key=>$value) { if ($matches[$key]['stage'] == '8') { $datas['8'][] = array( 'team_id_1' => $matches[$key]['name_1'], 'team_id_2' => $matches[$key]['name_2'], 'stage' => $matches[$key]['stage'], 'cell' => $matches[$key]['cell'], 'score' => $matches[$key]['score_1'].':'.$matches[$key]['score_2'], 'date' => $matches[$key]['date_match'], ); } elseif ($matches[$key]['stage'] == '7') { $datas['7'][] = array( 'team_id_1' => $matches[$key]['name_1'], 'team_id_2' => $matches[$key]['name_2'], 'stage' => $matches[$key]['stage'], 'cell' => $matches[$key]['cell'], 'score' => $matches[$key]['score_1'].':'.$matches[$key]['score_2'], 'date' => $matches[$key]['date_match'], ); } elseif ($matches[$key]['stage'] == '6') { $datas['6'][] = array( 'team_id_1' => $matches[$key]['name_1'], 'team_id_2' => $matches[$key]['name_2'], 'stage' => $matches[$key]['stage'], 'cell' => $matches[$key]['cell'], 'score' => $matches[$key]['score_1'].':'.$matches[$key]['score_2'], 'date' => $matches[$key]['date_match'], ); } elseif ($matches[$key]['stage'] == '5') { $datas['5'][] = array( 'team_id_1' => $matches[$key]['name_1'], 'team_id_2' => $matches[$key]['name_2'], 'stage' => $matches[$key]['stage'], 'cell' => $matches[$key]['cell'], 'score' => $matches[$key]['score_1'].':'.$matches[$key]['score_2'], 'date' => $matches[$key]['date_match'], ); } elseif ($matches[$key]['stage'] == '4') { $datas['4'][] = array( 'team_id_1' => $matches[$key]['name_1'], 'team_id_2' => $matches[$key]['name_2'], 'stage' => $matches[$key]['stage'], 'cell' => $matches[$key]['cell'], 'score' => $matches[$key]['score_1'].':'.$matches[$key]['score_2'], 'date' => $matches[$key]['date_match'], ); } elseif ($matches[$key]['stage'] == '3') { $datas['3'][] = array( 'team_id_1' => $matches[$key]['name_1'], 'team_id_2' => $matches[$key]['name_2'], 'stage' => $matches[$key]['stage'], 'cell' => $matches[$key]['cell'], 'score' => $matches[$key]['score_1'].':'.$matches[$key]['score_2'], 'date' => $matches[$key]['date_match'], ); } elseif ($matches[$key]['stage'] == '2') { $datas['2'][] = array( 'team_id_1' => $matches[$key]['name_1'], 'team_id_2' => $matches[$key]['name_2'], 'stage' => $matches[$key]['stage'], 'cell' => $matches[$key]['cell'], 'score' => $matches[$key]['score_1'].':'.$matches[$key]['score_2'], 'date' => $matches[$key]['date_match'], ); } elseif ($matches[$key]['stage'] == '1') { $datas['1'][] = array( 'team_id_1' => $matches[$key]['name_1'], 'team_id_2' => $matches[$key]['name_2'], 'stage' => $matches[$key]['stage'], 'cell' => $matches[$key]['cell'], 'score' => $matches[$key]['score_1'].':'.$matches[$key]['score_2'], 'date' => $matches[$key]['date_match'], 'win' => $query[0]['win'], ); } } // вывод в шаблон $data = array( 'stage' => $stage, 'count' => $count, 'counts' => $counts, 'matches' => $matches, 'datas' => $datas, 'teams_players' => $teams_players ); $this->template->load_view('grid', $data); } Вывод Код (Text): <?php $pixel = 20; $pixel_b = 20; $height = 60; $height2 = 20; $height3 = 20; $px = 2; $px_1 = 1; $margin = 0; $margin_top = 0; $width = 0; $text = "<div class='table_teams' style='text-align:center'>"; $text .= "<div class='table_matchs'>"; for($x=$stage+1;$x>0;$x--) { if ($x == 1) { $text_stage = "Победитель"; } else if ($x == 2 ) { $text_stage = "Финал"; } else if ($x == 3) { $text_stage = "Полуфинал"; } else { $text_stage = '1/'.$counts; } $text .= "<div style='float:left; margin-left:10px; width:100px; margin-right:10px;'><div class='table_text first'>".$text_stage."</div></div>"; $counts = $counts / 2; } $text .= "</div>"; $text .= "<div class='table_teams'>"; $teams = array("8" => array(), "7" => array(), "6" => array(), "5" => array(), "4" => array(), "3" => array(), "2" => array(), "1" => array()); for ($x=$stage;$x>0;$x--) { $text .= "<div class='table_team'>"; for ($i=0; $i<$count;$i++) { if(!empty($data)) {if ($datas[$x][$i]['score'] == ':') $datas[$x][$i]['score'] = "Нет информации";} $text .= $teams[$x][] = "<div class='table_tr' style='margin-top:".$pixel."px; margin-bottom:".$pixel_b."px;' match_id='".$i."'><a href='#'>". "<div class='table_text first'><div class = 'lcenter' style='float:left;width:".$width."px;height:20px'></div>".(empty($datas[$x][$i]['team_id_1']) ? " " : $datas[$x][$i]['team_id_1'])."<div class = 'tr_corner' style = 'float:right; width:10px; height:20px;'></div></div>". "<div class='table_text2' style='height:".$height2."px; line-height:".$height2."px;'><div class = 'line_vertical_corner' style = 'float:right; width:10px; height:".$height2."px;'></div><div style = 'float:right;margin-right:20'>".(empty($datas[$x][$i]['score']) ? " " : $datas[$x][$i]['score'])."</div></div>". "<div class='table_text last'><div class = 'lcenter' style='float:left;width:".$width."px;height:20px'></div>".(empty($datas[$x][$i]['team_id_2']) ? " " : $datas[$x][$i]['team_id_2'])."<div class = 'br_corner' style = 'float:right; width:10px; height:20px;'></div></div>". "</a></div>"; } $px = $px * 2; $px_1 = $px - 1; $pixel = $pixel * 2; $pixel_b = $pixel_b * 2 + 20; $height = 20 + $pixel + 20; $height2 = $height3 * $px_1; $count = $count / 2; $text .= "</div>"; if( $x == 1 ) { $text .= $teams[$x][] = "<div class='table_team'> <div class='table_tr' style='margin-top:".$pixel."px; margin-bottom:".$pixel_b."px;' match_id='".$i."'>". "<div class='table_text first'><div class = 'lcenter' style='float:left;width:".$width."px;height:20px'></div>".(empty($datas[$x][$i-1]['win']) ? " " : $datas[$x][$i-1]['win'])."</div>". "</div> </div>"; } $width = 10; } $text .= "</div>"; $text .= "</div>"; echo $text; ?> В таблицу матчей заносятся вот такой запрос: Код (Text): INSERT `matchs` (id_tour,stage,cell,next_stage,next_cell,next_team_id,team_id_1,team_id_2) VALUES (1, 4, 1, 3, 1, 'team_id_1', '5', '3'), (1, 4, 2, 3, 1, 'team_id_2', '1', '8'), (1, 4, 3, 3, 2, 'team_id_1', '6', '2'), (1, 4, 4, 3, 2, 'team_id_2', '4', '7'), (1, 4, 5, 3, 3, 'team_id_1', '', '9'), (1, 4, 6, 3, 3, 'team_id_2', '', ''), (1, 4, 7, 3, 4, 'team_id_1', '', ''), (1, 4, 8, 3, 4, 'team_id_2', '', ''), (1, 3, 1, 2, 1, 'team_id_1', '', ''), (1, 3, 2, 2, 1, 'team_id_2', '', ''), (1, 3, 3, 2, 2, 'team_id_1', '', ''), (1, 3, 4, 2, 2, 'team_id_2', '', ''), (1, 2, 1, 1, 1, 'team_id_1', '', ''), (1, 2, 2, 1, 1, 'team_id_2', '', ''), (1, 1, 1, 0, 1, 'team_id_1', '', ''); Как видите у меня все написано, только вот переделать немного нужно, чтобы работало как я описал выше, а на это у меня уже знаний не хватает
Не понял про "регистрируется меньше, чем заявлено на турнир". Ты должен просто работать с тем числом команд, которое регистрируется, сколько бы ни было. Не? Правила расписывают сколько команд должно соревноваться в этот день, в зависимости от того, сколько их всего. Это формула. И в чем твоя заминка?
сейчас объясню что я не могу сделать, когда создаю турнир, указываю сколько команд максимум может принять участие, например возьмем 16, но на турнир зарегистрировалось 9 команд. Чтобы сетка выводила всё правильно, нужно создать вот такой запрос на 15 матчей: Код (Text): INSERT `matchs` (id_tour,stage,cell,next_stage,next_cell,next_team_id,team_id_1,team_id_2) VALUES (1, 4, 1, 3, 1, 'team_id_1', '5', '3'), (1, 4, 2, 3, 1, 'team_id_2', '1', '8'), (1, 4, 3, 3, 2, 'team_id_1', '6', '2'), (1, 4, 4, 3, 2, 'team_id_2', '4', '7'), (1, 4, 5, 3, 3, 'team_id_1', '', '9'), (1, 4, 6, 3, 3, 'team_id_2', '', ''), (1, 4, 7, 3, 4, 'team_id_1', '', ''), (1, 4, 8, 3, 4, 'team_id_2', '', ''), (1, 3, 1, 2, 1, 'team_id_1', '', ''), (1, 3, 2, 2, 1, 'team_id_2', '', ''), (1, 3, 3, 2, 2, 'team_id_1', '', ''), (1, 3, 4, 2, 2, 'team_id_2', '', ''), (1, 2, 1, 1, 1, 'team_id_1', '', ''), (1, 2, 2, 1, 1, 'team_id_2', '', ''), (1, 1, 1, 0, 1, 'team_id_1', '', ''); То есть матчей по такой системе всегда на 1 меньше чем команд. так вот как мне сформировать такой запрос в базу чтобы матчи правильно рассчитались, сколько в первой стадии, сколько во второй. Если не совсем понятно и сейчас(нету у меня дара хорошо и понятно описывать), могу постараться с сделать скриншоты и с ними объяснить.
Не надо скриншотов. Ты бы помог, если бы дал прямую ссылку на полное описание системы. Кажется я уже сам нашел: http://www.offsport.ru/games/sistema-rozygrysha-s-vybyvanie ... nija.shtml
PHP это всего лишь язык. Если бы ты представил четко алгоритм, не было бы проблемы выразить его хоть на PHP, хоть на чём. Я могу написать программу (уже написал), но чем это тебе поможет? Ты ничему не научишся. Давай-ка сам делай. У тебя должны быть маленькие конкретные вопросы, а не "напишите всё за меня". Подсказка 1: забудь на время про HTML и всякие таблицы. Тебе нужно написать функцию, дающую число n == степень двойки, ближайшую к A. Добавлено спустя 5 минут 38 секунд: Моя эмуляция турнира: Код (Text): Starts from 12 teams Day: 1, 8 teams: (3, 4, 5, 6, 7, 8, 9, 10), Off: 4, 5, 8, 10, Day: 2, 8 teams: (1, 2, 3, 6, 7, 9, 11, 12), Off: 2, 6, 7, 11, Day: 3, 4 teams: (1, 3, 9, 12), Off: 3, 9, Day: 4, 2 teams: (1, 12), Off: 12, Team #1 wins!!!
$k = ($count_teams - $out)*2; прошу) есть такая функция)) только выводит не степень, а число 2,4,8,16,32 и ид)) Добавлено спустя 1 минуту 1 секунду: Код (Text): $out = 0; if($count_teams == 4) { $out = 2; } else if ($count_teams > 4 AND $count_teams < 8) { $out = 4; } else if ($count_teams == 8) { $out = 4; } else if ($count_teams > 8 AND $count_teams < 16) { $out = 8; } else if ($count_teams == 16) { $out = 8; } else if ($count_teams > 16 AND $count_teams < 32) { $out = 16; } else if ($count_teams == 32) { $out = 16; } else if ($count_teams > 32 AND $count_teams < 64) { $out = 32; } else if ($count_teams == 64) { $out = 32; } else if ($count_teams > 64 AND $count_teams < 128) { $out = 64; } else if ($count_teams == 128) { $out = 64; } и вот ещё
ага, возможно. на коротком диапазоне чисел. но за такое карают анально. причём дважды — ты заметил, что каждый ответ повторяется по два раза? зачем???????????????? не показывай такое никому! Добавлено спустя 1 минуту 33 секунды: Подсказка 2: чтобы вычислить это самое ближайшее к А число, ты можешь сделать цикл.
ты мне подскажи как мне с матчами разобраться) в будущем я всё равно буду код улучшать, а сейчас нужно сделать его чтобы он вообще работал))
Ну так там же формула. Она всегда работает! Через эту степень двойки вычисляешь кол-во команд в текущем розыгрыше, берешь из середины списка это число команд и собственно всё! Каждый второй из этих избранных вылетит, а с оставшимися итерация повторится на следующем розыгрыше. Добавлено спустя 7 минут 20 секунд: Подсказка 3: раз ты новичек, расскажу про полезную встроенную функцию PHP "взять из массива кусочек, начиная с какого-то отступа": Код (PHP): $today_teams = array_slice($teams, $offset, $n);
ну так а до этого то массив как-то сформировать нужно с матчами, я так понимаю, прежде чем выбирать то
не может у тебя быть массива с матчами. ты что, знаешь заранее кто выиграет? у тебя может (должен) быть массив с командами. из них в розыгрыше какие-то выбывают. выражаясь на PHP это Код (PHP): $index_to_off = array_search($number, $teams); unset($teams[$index_to_off]); выражаясь на SQL это Код (Text): DELETE FROM `teams` WHERE `number`=:number оставшийся список команд это точно такой же список как в самом начале, только короче ну же! неужели еще не всё понятно?
ну теоретически понятно, а так что-то туплю)) без обид))) просто в голове по другому сформирована идея, поэтому трудно немного понять, как ты объясняешь))
стой) не уходи)) покажи пример массива, как ты там предполагаешь) просто я не пойму как это все по стадиям раскинуть))