Лог нанесённого урона

242
10 марта 2017, 00:51

Добрый день.

Многие текстовые игры используют лог, где отображается нанесённый урон в виде строк, и в тоже время он сохраняет результат.

К примеру:

Вы нанесли урон 1

Вы нанесли урон 1

Вы нанесли урон 1

Враг нанес вам урон 2

Но лог имеет ограничения, в 10 строк, то есть каждая первая строка заменяется на новое значение, 10 стирается и туда помещается ранее 9 я строка. Как они это сделали?

В словах, спасибо.

Answer 1

Лог сообщений где-то хранится (в базе, например, или в сессии), а когда строится для вывода, выбираются только последние N сообщений.

Пример на php:

interface ICache {
    public function has($key);
    public function get($key);
    public function set($key, $val);
}
class Cache implements ICache {
    private $storage = [];
    public function has($key) {return isset($this->storage[$key]);}
    public function get($key) {return $this->storage[$key];}
    public function set($key, $val) {$this->storage[$key] = $val;}
}
class SessionCache implements ICache {
    public function has($key) {return isset($_SESSION[$key]);}
    public function get($key) {return $_SESSION[$key];}
    public function set($key, $val) {$_SESSION[$key] = $val;}
}
class BattleLog{
    private $storage;
    private $key;
    private $length;
    public function __construct(ICache $storage, $N, $id) {
        $this->storage = $storage;
        $this->length = $N;
        $this->key = 'battle_log_'.$id;
        if (!$this->storage->has($this->key)) {
            $this->storage->set($this->key, []);
        }
    }
    public function log($message) {
        $log = $this->storage->get($this->key);
        array_unshift($log, $message);
        $log = array_slice($log, 0, $this->length);
        $this->storage->set($this->key, $log);
    }
    public function render() {
        $log = $this->storage->get($this->key);
        foreach ($log as $message) {
            echo "$message\n";
        }
    }
}
$log = new BattleLog(new Cache, 3, 27);
$log->log('Вы нанесли урон 1');
$log->log('Вы нанесли урон 1');
$log->log('Вы нанесли урон 2');
$log->log('Вы нанесли урон 3');
$log->log('Вы нанесли урон 5');
$log->log('Вы нанесли урон 8');
$log->log('Вы нанесли урон 13');
$log->render();

Осталось только реализовать более персистентное хранилище, чем Cache.

READ ALSO
Нужно смешать 2 массива определенным образом

Нужно смешать 2 массива определенным образом

Есть 2 массива c названиями животных:

444
Сортировка массивов php

Сортировка массивов php

Стала задача отсортировать массив, приходящий из БДОдин элелемент из этого массива выглядит так:

246
Добавить CDATA в xml?

Добавить CDATA в xml?

Как в первом случае обновить в элементе offer_text секцию <![CDATA[ ]]> на содержимое переменной $text, а во втором добавить ее?

223
Валидация входящих данных Yii по integer

Валидация входящих данных Yii по integer

Вечер добрый, не получается сделать валидацию входящих данных в Yii2, в модели пишу правило, но вылетает исключение

261