a_n_d_y
Гуру форума
- Регистрация
- 26 Мар 2006
- Сообщения
- 470
- Реакции
- 62
- Автор темы
- #1
Сделал скрипт создания расписания чемпионата футбольных команд.
Вроде все нормально, но в некоторых турах получается 7 пар вместо 8, а иногда и 6. Может я не правильно алгоритм придумал?
PS И может кто подскажет как сделать так чтоб одна команда не играла больше 2 раз подряд дома...
PHP:
class Controller_Rasp extends Controller_Base{
private $already=array();
private $checks=array('home'=>array(), 'away'=>array());
private $got_ids=array();
// Берем айди команд из базы
private function get_teams($d){
$res=$this->m['db']->prepare("select id from teams where d='$d'");
$res->execute();
$r=$res->fetchAll(PDO::FETCH_ASSOC);
foreach ($r as $v){
$t[]=$v['id'];
}
return $t;
}
// Составляем пары команд (должно быть 8*15 8 пар 15 туров в первом круге)
private function get_rasp($d){
$t=$this->get_teams($d);
$num=0;
foreach ($t as $v){
$this->already[]=$v;
foreach ($t as $v1){
if (in_array($v1, $this->already)) continue;
$rasp[]=array($v, $v1);
$num++;
}
if ($num==120) break;
}
return $this->check($rasp);
}
// Команда должна играть не более 8 раз дома в течение круга
private function check($r){
unset($this->checks['home']);
unset($this->checks['away']);
foreach($r as $k => $v){
if (!isset($this->checks['home'][$v[0]])) $this->checks['home'][$v[0]]=0;
$this->checks['home'][$v[0]]++;
if ($this->checks['home'][$v[0]]>8){
$r[$k]=array($v[1], $v[0]);
}
}
return $this->check_turs($r);
}
// разбиваем расписание на туры
private function check_turs($r){
shuffle($r);
$turs=array();
for ($tur=1; $tur<=30; $tur++){
if ($tur==16) {
shuffle($r);
$this->got_ids=array();
}
$turs[$tur]=$this->get_tur($r, $tur);
}
return $turs;
}
// Получаем пары определенного тура
private function get_tur($r, $t){
$checked_ids=array();
$tur=array();
foreach ($r as $k=>$v){
if (in_array($k, $this->got_ids) || in_array($v[0], $checked_ids) || in_array($v[1], $checked_ids)){
continue;
}
$this->got_ids[]=$k;
$checked_ids[]=$v[1];
$checked_ids[]=$v[0];
if ($t<16){
$tur[]=$v;
}
else $tur[]=array_reverse($v);
if (count($tur)==8) break;
}
return $tur;
}
function index(){
$con='';
$a=$this->get_rasp('div1');
foreach ($a as $t => $m){
$con.="$t тур<br>";
$l=1;
foreach ($m as $v){
$con.=$l." $v[0] - $v[1]<br>";
$l++;
}
$con.="<hr>";
}
$con.=$this->m->arr($a);
$this->m['sm']->assign('title', 'Расписание');
$this->m['sm']->assign('main_con', $con);
$this->m['sm']->display('index.tpl');
}
}
PS И может кто подскажет как сделать так чтоб одна команда не играла больше 2 раз подряд дома...