Игра "Master Of Labyrinths" ver. 1.6




Принцип обмена данными из 1С с сайтом (на MySQL) и выдачи (публикации) этих данных по запросу.
PHP-Скрипт автоматической загрузки данных из файла данных в формате CSV в базу данных сайта работающего на WordPress.

В продолжение моей темы: 1С:Альфа-Авто Автосалон Автосервис: обмен с сайтом.
С помощью данного скрипта можно загружать в автоматическом режиме, по расписанию, данные сервисных книжек (ремонтов авто) из 1С:Альфа-Авто Автосалон Автосервис.
Также можно загружать данные в ручном режиме: для этого делается скрытая страница, где размещается специальная кнопка.
Комментарии размещенные внутри скрипта разъяснят логику и порядок действия.
Комментарии с "/////    echo" использовались для отладки.
Дополнительно создана таблица для журналирования результатов загрузки данных.
Скрипт включает в себя защиту от SQL инъекций (думаю безопасность соблюдена в полной мере).
В кратце:
1. Пишется скрипт, который запускает этот.
2. Создается регламентное задание в WordPress, по которому запускается скрипт из п.1. 
3. Этот скрипт осуществляет проверку на существование файла обмена в папке.
4. Если данные не новые, загрузка не производится.
5. Если данные новые, очищается таблица сервисных книжек.
6. Загружаются новые данные.

Собственно сам скрипт:

<?php // Полная загрузка сервисных книжек, создан 2024-01-05 12:44:55

global $wpdb2;
global $failure;
global $file_hist;

/////  echo '<H2><b>Старт загрузки</b></H2><br>';

$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
/////   echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}

$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
/////   echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}

/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
/////   echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
/////    echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist);   ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7];    ////получаем размер файла
$m_mtime_file=$masiv_data_file[9];   ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file

/////   echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
/////   echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
/////   echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);

if ($results)
{   foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));

////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
/////   echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
/////   echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}

////загружаем данные
$table='vin_history';         // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация     // (путь от корня web-сервера)
$delim=';';          // Разделитель полей в CSV файле
$enclosed='"';      // Кавычки для содержимого полей
$escaped='\

58 Comments

  1. venger

    Кстати, по алгоритму Прима будет быстрее, но по Краскалу запутаннее получается. А на лист (A4), гте-то 25 на 45 локаций, чтоб полностью покрывал, по алгоритму Краскала у меня минут 20-ть уходит, по приму минут 5-6-ть. Отрисовка и замеры, конечно, тоже жрут…

    Reply
  2. CheBurator

    Зачет!

    Reply
  3. CheBurator

    скриншот, который игровой — глаза режет разлинейка ТЗ — неудобно…

    Reply
  4. CheBurator

    размеры 26-15-2 — получаем сплошное зеленое поле

    26-15-1 — «умерло», прервал по ескейпу…

    размер в локациях, а локации в клетках экрана — порвал себе мозг…. сгенерить на весь экран так и не смог.. 😉

    Reply
  5. CheBurator

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

    Reply
  6. CheBurator

    и решение рисовать лучше не чиними квадратиками, а Симв(149) каким -нибуль и вкаждой клеточке пути!!!

    короче — зачетн6о, только жаль что экрна маленький — навороченный лабиринт не рисуется… Но вот если в профиле Душелова взять компоненту для генерации изображений и генерить лабиринт не ТЗ, а изображением — то получится гораздо красившее…

    Reply
  7. venger

    (4) Размер локации меньше трех клеток ставить нет смысла. Вот локация на 3:

    ***

    ***

    ***

    Т.е. две стенки и пространство внутри. А вот ширина и высота уже тогда можно хоть 500х500 локаций, только ждать придется:-)

    Попробуй 50х50 и размер локации 3 или 4.

    Reply
  8. venger

    (7) По Краскалу такой (50-50-3) будет минут 20-ть генериться, но пока идет время на форме, значит не завис, просто подождать. Т.е. генерить больше экрана не проблема, тем более что полосы прокрутки на ТЗ никто не отменял:-)

    Reply
  9. venger

    (0) Теорию отсюда спер:-) Правда примеры там, судя по всему, на паскале и с использованием goto, встречаются, в академических целях, судя по всему:-)

    Да и в 1С так целиком не по перерисовываешь:-) Но суть таже:-)

    http://opensource.com.ua/contents/978594723853p.html

    Reply
  10. CheBurator

    (7) да я допер, побаловался.. неудобно просто скроллить — поэтому и предложил на картинку преревести

    Reply
  11. venger

    (6) > Но вот если в профиле Душелова взять компоненту для генерации изображений и генерить лабиринт не ТЗ, а изображением — то получится гораздо красившее…

    — Че т не нашел, о какой речь? Еще б на печать стенки потоньше, краски поменьше чтоб уходило при печати.

    Reply
  12. venger

    (6),(11) Еще б выводить на экран в трехмерном виде (вид изнутри при прохождении лабиринта), если уже рисование будет доступно:-)

    Reply
  13. CheBurator

    (11) сори, это не Душелова, а Маляева: http://www.infostart.ru/profile/1782/projects/1747/

    (12) и прохождение было бы гораздо интереснее, если перед глазами не иметь плана лабиринта!

    Reply
  14. venger

    (13) Для начала добавил и обновил вот что:

    В версии 1.1 при игре игрок не видит весь лабиринт целиком, а только соседние стены и при прохождении «открывает» новые видимые области. Гораздо интересней проходить лабиринт и играть.

    Теперь бум думать над трехмерным вариантом глазами игрока «изнутри» лабиринта:-)

    Reply
  15. CheBurator

    (14) эээ это хорошо новый вариант прохождения.. но ты добавь один такой вариант — что видны только текущие стены — спереди сбоку сзади.. то есть типа идешь — оп поворот направо — повернул — соответсвенно уже что сзади прошел — невидно будет!

    мы по таким лабиринатм еще где-то в 86-87 годах ходили на ЕС1970

    Reply
  16. venger

    (15) Ок, после обеда.

    Reply
  17. venger

    (15) Выложил обновление: В версии 1.2 введены три режима игры (игрок может играть в любом из них): полная видимость (все стены лабиринта видны); частичная видимость (с запоминанием пути) — видны стены только возле игрока и те, где он уже был; частичная видимость (без запоминания пути) — видны только стены вокруг текущей позиции игрока.

    Reply
  18. Ёпрст

    ТЗ на форме — не комильфо..

    Лучше б ПустуюТаблицу снизу прикрутил бы — всё красившее…

    Reply
  19. venger

    (0) Выложил обновление: в версии 1.3 для режимов с ограниченной видимостью добавлена возможность настройки дальности видимости вокруг игрока, а также поправлены баги перерисовки в режиме с ограниченной видимостью, плюс мелкие доработки.

    Reply
  20. venger

    (18) Да, отрисовку думаю со временем перевести на что-то другое, эт точно:-)

    Reply
  21. venger

    (0) Еще отрисовку в режимах с ограниченной видимостью оптимизирую, чтоб без лишних действий при передвижении курсора и будет шуршать, при небольшом значении дальности видимости (1 или 2).

    Reply
  22. venger

    (0),(21) Выложил обновление: в версии 1.4 оптимизирована отрисовка видимых стен при перемещении в режиме ограниченной видимости без запоминания пройденного пути.

    Reply
  23. venger

    (22) Правда в этом режиме (3-й, без запоминания пути), если решение отражено на экране, то при перемещении его, решения стены, не затираются курсором, а остаются на экране. Но это требует доп. вычислений, что из стен относящихся к решению нужно перерисовать. А при большой дальности видимости — это будет заметно на глаз притормаживать на больших лабиринтах, так что, в режиме ограниченной видимости без запоминания пути лучше играть без отрисованного и показанного на экране решения.

    Reply
  24. venger

    (23) Можно, конечно, хранить стены, что отрисованы на экране и те, что нужно перерисовать, совсем без лишних стен и таким образом оптимизировать и это. Но мне критичней, чтобы стены были тоньше, линиями отрисовывались, что будет брать меньше краски при печати и быстрее будет печататься. Основная цель была — генерить лабиринты, печатать их и давать детям играться (2-6 лет). Так что бум смотреть в сторону ActiveX GflAx или чего в этом роде, где можно рисовать линии и точки хотя бы.

    Reply
  25. venger

    (0) Мама с работы никак до брата младшего не может донести распечатнанные лабиринты, знакомые, как видят, забирают для своих детей, уже неделю кряду :-)))

    Reply
  26. Душелов

    (24) Если что — свисти, помогу с компонентой 😉

    Reply
  27. venger

    (0) Пока мысля не убегла быстро обновил:-) Выложил обновление: в версии 1.5 немного оптимизирована отрисовка видимых стен при отображенном на экране решении при перемещении в режиме ограниченной видимости без запоминания пройденного пути (3-й режим, решение на экране).

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

    Все, главное вовремя остановиться … и переходить на более качественный уровень;-)

    Reply
  28. venger

    (26) > помогу с компонентой

    Это в смысле, можно заказывать?;-) Ща я губу то раскачу;-)

    Reply
  29. venger

    (26) > помогу с компонентой

    Я скромненький, мне бы линии рисовать, точки, можно фигуры двух-трехмерные, с поворотами там и движением, растянуть/сжать, можно тени чтоб отбрасывали с перспективой:-)

    Reply
  30. Душелов

    (29) Попиксельно? Набросай, какие методы нужны.

    Reply
  31. venger

    (30) Вообще, если вспомнить, например, вот это:

    http://infostart.ru/projects/2907/

    То можно смело просить компоненту, которая получает лабиринт, видимость, позиции игрока и имеет методы поворт влево 90 град, вправо 90 град, шаг вперед, шаг назад и отрисовывает это уже сразу в трехмерном виде изнутри прохождение лабиринта взглядом игрока и возвращает новую позицию игрока и т.п. (детали можно обсудить). Ибо здается мне 1С-ка не потянет обсчет трехмерной отрисовки изображения, хотя матрицами, мож и шустро будет.

    Reply
  32. venger

    (30) +(31) Просто для двухмерной отрисовки достаточно точек (вместо ячеек ТЗ на форме) разной формы и скроллинг картинки, масштабирование…

    Reply
  33. venger

    (30) +(32) Сорри, точек не разной формы, а разного цвета.

    Reply
  34. venger

    (30) +(33) И сохранения в файл jpg, например.

    Reply
  35. CheBurator

    Когда идем по лабиринту (в режиме близком к реальному) типа так как шутер от первого лица: сам стоишь нга месте а ктебе приближаются или плывут мимо тебя стены, поворот — аналогично, повернул и опять все время идешь вперед…

    Reply
  36. CheBurator

    (29) тут не увлекайся… имхо как только ИГРА перескакивает некий порог по приближению к реальности — она становится не такой интересной…

    Reply
  37. PeRom

    Саш, а сейчас какие ВК используются в игре? или без ВК? Хочу малышу кинуть, самому пока некогда посмотреть.

    Reply
  38. venger

    (37) Счас никаких ВК, все средствами 1С, ничего не надо, просто запустить.

    Reply
  39. venger

    Кстати, ТЗ на форме — это «дизайнерское» решение, чтоб было похоже на листик из тетрадок в клеточку, когда мы на них играли в школе:-) Вот:-)

    Reply
  40. Ёпрст

    (39) а почему не Пустую Таблицу снизу ?

    там хоть обрисуйся …

    Reply
  41. venger

    (40) 39-й коммент — это просто отмазка, просто пришло в голову:-)

    А, вообще, надо попробовать. Это в режиме ввода данных Таблица или просто в Таблице, вместо ТЗ на форме? Что значит пустую, я че т недопонял, по-моему?

    Reply
  42. Ёпрст

    (41) ё…

    есть 3 вида Таблиц в 1с:

    1. «Обычная», через СоздатьОбъект(«Таблица»)

    2. «Пустая», обращение через зарезервированное слово Таблица + все методы 1.

    3. «РВД», обращение через зарезервированное слово Таблица + некоторые свои методы.

    У 2,3 всегда есть форма, точнее, это Таблица на форме 🙂

    Тип Таблицы задается в Свойствах формы в меню Действия.

    Reply
  43. venger

    (42) Ок, спасибо. На днях попробую, мож красивше будет…

    Reply
  44. venger

    (0),(42) Выложил обновление: в версии 1.6 вывод на экран игры перенаправлен с ТЗ на форме в пустую Таблицу. И красивше стало и побыстрей рисует. Плюс мелкие доработки.

    Переделывал на скорую руку, особо не тестировал, но должно быть нормуль:-)

    Говорите, если что не так…

    Reply
  45. CheBurator

    во.. уже гламурнее…

    Reply
  46. venger

    (45) Ну так, под руководством старших товарищей, как говориться:-)

    Кста, всем спасибо за советы (и Че, и Епрст и все-все-все):-)

    Reply
  47. CheBurator

    но того, чего хотелось — все равно не увидел… 😉

    Reply
  48. venger

    (47) А чего хотелось? $-)))

    Reply
  49. venger

    (47) > но того, чего хотелось — все равно не увидел… 😉

    > предложил на картинку преревести

    Изображение, скроллинг там есть вроде ж тоже, собираюсь, в принципе.

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

    Хм, лишние пути упрощают, с одной стороны, с другой надо возиться с алгоритмом генерации, еще один придумывать, стоит ли?

    Reply
  50. CheBurator

    хочется вид от первого лица..

    Reply
  51. motogon

    Хотю версию 1.6, раз

    Reply
  52. motogon

    Хотю версию 1.6, два

    Reply
  53. motogon

    Хотю версию 1.6, три

    Reply
  54. motogon

    (53) Кому не трудно, подсобите, а:)

    Reply
  55. Ёпрст

    (54) качай…

    Reply
  56. motogon

    55, уже, спасибо всем

    Reply
  57. venger

    (54) Держи еще два за сообразительность;-) Пяти тебе уже хватит, чтобы и карать;-)

    Reply
  58. motogon

    57, пока некого, да и не нашинское это дело, спасибо

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *