Пишу онлайн-игру, нужно было сделать функцию апдейта ресурсов. В базе есть таблица, в которой прописано количество ресурсов, прибавляемых игроку за период времени.
Допустим, вот такая структура для одного типа ресурсов – power (это лишь кусок )
CREATE TABLE `resource_int` (
`id` mediumint(7) unsigned NOT NULL auto_increment PRIMARY KEY,
`power` smallint(4) unsigned default '1',
`power_t` smallint(5) unsigned default '1',
`power_div` mediumint(8) unsigned default '0',
`last_upd` timestamp NOT NULL default CURRENT_TIMESTAMP
)
`power_t` – период, за который игрок должен получить `power` ресурсов.
В функции я считаю время между последним обращением к таблице и текущим временем. Потом считаю, сколько за это время полльзователь должен получить ресурсов – выходит, как правило, дробное число. Остаток от дроби записываю в `power_div`, целое число ресурсов записываю в другую таблицу, в которой хранятся данные по ресурсам игрока. И перезаписываю время последней записи.
В коде это выглядит вот так:
function get_res_int($user)
{
$query = @mysql_query("SELECT * FROM `resource_int` WHERE `id` = '$user' LIMIT 1");
$result = @mysql_fetch_assoc($query);
return $result;
}
function update_resources($user)
{
$res_int = get_res_int($user);
$time = time() – strtotime($res_int['last_upd']);
$temp_power = $res_int['power'] * $time/$res_int['power_t'];
$new_power = floor($temp_power + $res_int['power_div']);
if($new_power == "0") $div_power = $temp_power;
else $div_power = $temp_power % $new_power;
@mysql_query("UPD?1?T?1? `players` SET `power` = `power` + '$new_power' WHERE `id` = '$user' LIMIT 1");
@mysql_query("UPD?1?T?1? `resource_int` SET `power_div` = '$div_power'', `last_upd` = NOW() WHERE `id` = '$user'");
}
И не покидает меня ощущение, что что то я сделал совсем не так, как надо!
Кто может оценить мой способ решения поставленной задачи?
Уверен, что есть более "красивый" вариант! При условии того, что вызываться эта функция будет ОЧЕНЬ часто, надо минимизировать затраты ресурсов…