Час

crazy_pi4

Registered
Един френд е тръгнал да прави онлайн игра и иска да има час в нея... но една игрална минута да е равна на 20 наши секунди и така.. демек времето да тече 3 пъти по-бързо... как ще стане?
 
За time(); и безподобно модулно делене, друго не се сещам...

Времето, с което ще работите ще е винаги в реални секунди, а когато трябва да го показвате на потребителя съобразно времето на играта ще го преобръщате.

Ето ви примерни съотношения:

$minuta=20;
$chas=$minuta*60;
$den=$chas*24;

можете да си ги сметнете като стойност в секунди или да ги ползвате като констатнта или пък да ги обърнете в алгоритъм...

Играта стартира:

$nachalo=time();

Стойността на $nachalo си го записвате някъде, после всеки път, когато ви трябва текущо време:

$sega=time();

Изминало време:

$vreme=$sega - $nachalo;

Предстоящо бъдещо събитие, напр след 3 часа:

$bydeshte=$sega+($chas*3);

3 часа назад:

$minalo=$sega - ($chas*3);

3 часа и 50 мин назад:

$minalo=$sega - (($chas*3)+($min*50));

Така винаги имате стойността в секунди. После си я обръщате в минути, часове или дни... Ако искате да сте по-прецизни, ще трябва да използвате модулно делене (с %) и да въртите цикъл за да получите точни дни, часове, сек...

Ето една функция, к обръща резултата (задачката ми се струва занимателна) в хронологично време според условието на играта:


function f_gameTime($sega, $nachalo=0)
{
$minuta=20;
$chas=$minuta*60;
$den=$chas*24;
$mesec=$den*30;
$godina=$mesec*12;

$vremeSek=$sega - $nachalo;


if($vremeSek > ($godina-1))
{
$minus4=$vremeSek % $godina;
$godini=($vremeSek-$minus4)/$godina;

$minus3=$vremeSek % $mesec;
$meseci=($minus4-$minus3)/$mesec;

$minus2=$vremeSek % $den;
$dni=($minus3-$minus2)/$den;

$minus1=$vremeSek % $chas;
$chasove=($minus2-$minus1)/$chas;

$minus=$vremeSek % $minuta;
$minuti=($minus1-$minus)/$minuta;
}


elseif($vremeSek > ($mesec-1))
{
$minus3=$vremeSek % $mesec;
$meseci=($vremeSek-$minus3)/$mesec;

$minus2=$vremeSek % $den;
$dni=($minus3-$minus2)/$den;

$minus1=$vremeSek % $chas;
$chasove=($minus2-$minus1)/$chas;

$minus=$vremeSek % $minuta;
$minuti=($minus1-$minus)/$minuta;
}


elseif($vremeSek > ($den-1))
{
$minus2=$vremeSek % $den;
$dni=($vremeSek-$minus2)/$den;

$minus1=$vremeSek % $chas;
$chasove=($minus2-$minus1)/$chas;

$minus=$vremeSek % $minuta;
$minuti=($minus1-$minus)/$minuta;
}


elseif($vremeSek > ($chas-1))
{
$minus1=$vremeSek % $chas;
$chasove=($vremeSek-$minus1)/$chas;

$minus=$vremeSek % $minuta;
$minuti=($minus1-$minus)/$minuta;
}


elseif($vremeSek > ($minuta-1))
{
$minus=$vremeSek % $minuta;
$minuti=($vremeSek-$minus)/$minuta;
}


else
{
$minus=$vremeSek;
}


$sekundi=$minus*3;


$vreme[1]=$godini;
$vreme[2]=$meseci;
$vreme[3]=$dni;
$vreme[4]=$chasove;
$vreme[5]=$minuti;
$vreme[6]=$sekundi;

return $vreme;
}

Функцията връща масив, к може да си обходите с ето тази функция :) :

function f_echoTime($vreme)
{
$name[1]="Години";
$name[2]="Месеци";
$name[3]="Дни";
$name[4]="Часа";
$name[5]="Минути";
$name[6]="Секунди";



for($i=1; $i < (count($vreme)+1); $i++)
{

if(!empty($vreme[$i]))
{
$vremeRaz[]=$vreme[$i]." ".$name[$i];
}

}


$kolko=(count($vremeRaz)-1);

if($kolko!=0)
{

for($i=1; $i < $kolko; $i++)
{
$vremeList.=", ".$vremeRaz[$i];
}

$vremeNiz=$vremeRaz[0].$vremeList." и ".$vremeRaz[$kolko];
}
else
{
$vremeNiz=$vremeRaz[0];
}


return $vremeNiz;
}
?>

... която ще го върне като низ, к просто принтирате. Този низ не е за сметки. Горната смята, тази връща за принтиране.

Как ги извиквате:

Ако искате да сметнете времето м/у два момента, да кажем ето този пример от по-горе:

$vreme=$sega - $nachalo;

$vreme=f_gameTime($sega ,$nachalo);

Ако искате да вземете само изминалите месеци без възможни години или пък по-малки стойности като дни или часове:

echo $vreme[2];

Ако икате да получите пълното хронологично време:

$list=f_echoTime($vreme);
echo $list;


Толкова...
Подробности за математическите оператори + акцент на модулното делене:

http://www4u.search.bg/index2.php?ph&c=1&PHPSESSID=249f1f634b833657ff27853238b0a701

От вас зависи дали е имало полза или съм си загубил времето :)
Успех!
 

Back
Горе