Вниз  Простые пазлы или "Пятнашки" с картинками
- 5.10.2013 / 14:50
Microwap
  Пользователь

Microwap 
Сейчас: Offline
Пример написания игры на ПХП. Алгоритм и исходники.

Хотелось бы услышать мнения или критику по коду.

Изменено web_demon (5.10 / 18:11) (всего 2 раза)
- 5.10.2013 / 18:08
Microwap
  Пользователь

Microwap 
Сейчас: Offline
Давно уже задумывал такую игру, но как часто бывает начал и забыл. Но вот на одном форуме кто то написал, что кроме «пятнашек» не делал игр. Вот тут я и вспомнил про свой забытый проект. К сожалению завершенного образца на данный момент у меня нет, поэтому хочу представить вам «мастер - копию». Ведь по сути главное идея.

В самом начале я собирался оригинальную картинку разбивать на фрагменты таким вот кодом
  1. $file='img.jpeg';
  2. $tipe = GetImageSize ($file);
  3. $line=1;
  4. $part=10;
  5. $x=$y=$xx=$yy=(int)$tipe[0]/$part;
  6. $w=$tipe[0]+$part*$line;
  7. $h=$tipe[1]+$part*$line;
  8. $img_fone=imagecreatetruecolor($x,$y); //fone
  9. $col=imagecolorallocate($img_fone, 0, 255, 0);
  10. imagefill ($img_fone, 0, 0, $col);
  11. $img_work = ImageCreateFromJPEG($file);
  12. for ($a=0;$a<($tipe[1]/$x);$a++)
  13.  for ($i=0;$i<$tipe[0]/$x;$i++)
  14.   {
  15.   imagecopyresampled($img_fone,$img_work,0,0,$xx*$i,$yy*$a,  $xx,$yy,$x,$y);
  16.   imagejpeg($img_fone,'data/'.$a.'_'.$i.'.jpg',75);
  17.   }
  18. imagedestroy($img_fone);
  19. imagedestroy($img_work);

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

В конечном итоге было принято решение хранить кусочки головоломки (картинки) в одном файле. Для этого нужно преобразовать их в массив строк и сохранить например так

  1. file_put_contents('file_name',serialize('массив_картинок'));

После этого их очень просто будет вывести следующим кодом

  1. $fr=1; // выведет вторую катринку (первая $fr=0; =))
  2. $frames=unserialize(file_get_contents('file_name'));
  3. header('Content-Type: image/jpg');
  4. echo  $frames[$fr];

Но вот тут я и наступил на грабли. Нет (или я не нашел) в ПХП функции для сохранения картинки в строку. Поэтому пришлось пользовать следующую конструкцию.
  1. ob_start();
  2. imagejpeg($img, NULL ,75);  
  3. $frames[]=ob_get_contents();
  4. ob_clean();

Что в итоге и сохраняет в массив наши кусочки картинки.

И еще один подводный камень, уже в логике самой игры. Нельзя перемешивать пазлы стандартной функцией shuffle(), потому что не факт что они после этого соберутся.

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


Прикрепленные файлы:
pazzl.zip (291.09 кб.) Скачано 119 раз
- 5.10.2013 / 18:42
dimon_net
  Пользователь

dimon_net 
Сейчас: Offline
Класс.
- 6.10.2013 / 00:06
JSBmanD
  Пользователь

JSBmanD 
Сейчас: Offline
Microwap, Во поперло игры делать! :)
__________________
 No thing is perfecT
- 7.10.2013 / 09:26
Koenig
  Модератор форума

Koenig 
Сейчас: Offline
смотрел что я давал?
__________________
 Магистр Мёда
- 8.10.2013 / 17:08
Microwap
  Пользователь

Microwap 
Сейчас: Offline
Koenig (07.10.2013/09:26)смотрел что я давал?Я сначала тоже по такому пути пошел =)
Но это такой код создает кучу файлов. Мой же вариант создает только один файл, в котором и хранятся фрагменты. Суть не том чей код круче, а в самом алгоритме хранения фрагментов. Ну и маленький бонус – сама игра ;-)
- 9.10.2013 / 07:18
Koenig
  Модератор форума

Koenig 
Сейчас: Offline
Microwap, ну у меня смысл такой, один раз разбить картинку и создать файловый кэш, более гд уже не тревожить, нагрузка меньше, плюс я как бы сложность сделал, можно разбить хоть 100х100 фрагментов
__________________
 Магистр Мёда
Наверх  Всего сообщений: 7
Фильтровать сообщения
Поиск по теме
Файлы топика (1)