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

Статус
В этой теме нельзя размещать новые ответы.

a_n_d_y

Гуру форума
Регистрация
26 Мар 2006
Сообщения
470
Реакции
62
Сделал скрипт создания расписания чемпионата футбольных команд.
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 раз подряд дома...
 
Немного сокращу задачу.
Проверил вот эти функции.
get_teams - возвращает 16 команд (ок)
get_rasp - возвращает 120 пар (ок)
check - возвращает 120 измененных пар (ок)
Соответственно засада где-то в функциях разбивки на туры. Думаю это get_tur... Но что там не так не пойму...
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху