Показать сообщение отдельно
Непрочитано 14.09.2010, 00:07   #3
Пользователь

По умолчанию Re: PHP скрипты и просто код, который можно и нужно использовать на своем сайте

Я бы кое-что поправил.
1. Запросто может быть необходимость дергать getCurrentLevel() несколько раз за время выполнения скрипта для разных игроков, соотв. надо бы закешировать (в статик-поле) чтение xml-ки.
2. Искать в отсортированном массиве лучше все-таки бинарным поиском. Итераций меньше.

PHP код:
<?php
/**
 * Класс PlayerInfo
 * @author PROGRAMMATOR <admin@zone-game.info>
 * @link http://forum.zone-game.info/showthread.php?t=10110
 * @copyright http://zone-game.info
 */
class PlayerInfo
{
    const 
PLAYER_EXPERIENCE_TABLE_FILE 'player_experience_table.xml';
    private static 
$playerExperienceTable = array();
    
/**
     * Конструктор класса PlayerInfo
     */
    
public function __construct() {
        
// здесь может быть ваш код ;)
    
}
    
    
/**
     * Метод определения текущего уровня персонажа
     * @param <int> $experience количество exp
     * @return <int> текущий уровень
     */
    
public function getCurrentLevel($experience) {
        
$expList self::getPlayerExperienceTable();
        
$maxLevel sizeof($expList) - 1;
        
        if (
$experience <= 0) {
            return 
1;
        }
        if (
$experience >= $expList[$maxLevel]) {
            return 
$maxLevel;
        }
        
        
$iMin 1;
        
$iMid 0;
        
$iMax $maxLevel;
        while ((
$iMax $iMin) > 1) {
            
$iMid = ($iMin $iMax) >> 1;
            if (
$experience == $expList[$iMid]) {
                return 
$iMid;
            } elseif (
$experience $expList[$iMid]) {
                
$iMin $iMid;
            } elseif (
$experience $expList[$iMid]) {
                
$iMax $iMid;
            }
        }
        return 
$iMin;
    }
    
    
/**
     * Метод разбора XML файла player_experience_table.xml
     * @return <array> собранный массив $level => $exp
     */
    
private static function getPlayerExperienceTable() {
        if (
sizeof(self::$playerExperienceTable) == 0) {
            
$xml simplexml_load_file(realpath(dirname(__FILE__)) . '/' self::PLAYER_EXPERIENCE_TABLE_FILE);
            foreach (
$xml->exp as $key => $value) {
                
self::$playerExperienceTable[] = $value;
            }
        }
        return 
self::$playerExperienceTable;
    }
}  
?>
Blakkky вне форума Ответить с цитированием