Срипт расписания, не могу найти ошибку...

Тема в разделе "PHP", создана пользователем a_n_d_y, 23 окт 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Сделал скрипт создания расписания чемпионата футбольных команд.
    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');
        }
    }
    Вроде все нормально, но в некоторых турах получается 7 пар вместо 8, а иногда и 6. Может я не правильно алгоритм придумал?

    PS И может кто подскажет как сделать так чтоб одна команда не играла больше 2 раз подряд дома...
     
  2. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Немного сокращу задачу.
    Проверил вот эти функции.
    get_teams - возвращает 16 команд (ок)
    get_rasp - возвращает 120 пар (ок)
    check - возвращает 120 измененных пар (ок)
    Соответственно засада где-то в функциях разбивки на туры. Думаю это get_tur... Но что там не так не пойму...
     
Статус темы:
Закрыта.