Здравствуйте, гость ( Вход | Регистрация )

Свернуть

Новости

Форум Лучшее из галереи Уроки и статьи
07.12.2015 Выставочный зал: кошарик - персональная выставка
31.08.2015 Интересные ссылки для рисовальщиков
21.01.2015 Выставочный зал 2: Игрушки Олеси Гавриленко

27.12.2014 Выставочный зал: кошарик - персональная выставка
17.11.2014 Дуэль "Рыбки" - победитель Лисичка
05.11.2014 Конкурс иллюстраций "Снежная королева", до 31 января
30.10.2014 Дуэль "Рыбки" до 16 ноября
14.07.2014 Мастер-класс Мини-мишка в технике фелтинга
26.05.2013 Ау! Мы ищем таланты! – приглашаем модераторов!
Колоски
tn_gallery_5018_735_143383.jpg

Golubeva N
06.01.2016 Виртуальный Музей: Русский живописец Василий Дмитриевич Поленов
28.12.2015 Виртуальный Музей: Нидерландский живописец Квентин Массейс
16.12.2015 Виртуальный Музей: Итальянский живописец Франче́ско Айец
17.11.2015 Виртуальный Музей: Луи Анкетен (Louis Anquetin)
11.11.2015 Виртуальный Музей: Русский живописец Алексей Иванович Корзухин
Файловый архив
06.09.2013 Прочее: Файлы к уроку "Чайная церемония"
05.09.2013 Журнал Art Tower: ArtTower Magazine #8
16.05.2013 Adobe Photoshop: Кисти: Reid Southen brush
16.05.2013 Adobe Photoshop: Кисти: Goro Fujita brush
16.05.2013 Adobe Photoshop: Кисти: Кисти для рисования в Photoshop
Блоги Новости в цифровом мире и мире дизайна
02.12.2014 Дама с каменьями: Вести с крыши 2
08.11.2014 Timenews: Вассерман: прежняя модель мировой экономики исчерпала себя
06.11.2014 Дама с каменьями: Приятные вести с крыши))) от Гаргула)
02.11.2014 Spell: Книги Дж. Кэмерон
22.10.2014 Vjaz: от ФУ до МА
25.11.2015 Комментарий от Foxx в Costa Rica Adventure Divers, Логотип для компании и рисунок на майку (maria_mer)
18.11.2015 Комментарий от maria_mer в Spellforce - майка, для фанов игры (maria_mer)
18.11.2015 Комментарий от maria_mer в Белая книга. Целитель - любительский прект (maria_mer)
09.04.2015 Комментарий от Romana в Книги Дж. Кэмерон (Spell)
08.04.2015 Комментарий от Romana в Я решил вернуться... (Элбирет)
16.03.2015 ФОТОФОРУМ-2015
01.01.2015 ARQUTE.com и ArtTalk.ru закрываются
19.01.2017 Конкурс дизайна логотипов
26.12.2016 ру/Ководство: О творческом развитии
14.10.2016 ру/Ководство: Разнообразие

 
Добавить ответ в эту темуОткрыть тему
> Создание игр во Flash, на примере игр Пятнашки и Морской Бой
V
T-Rex
сообщение 9.01.2013 - 02:40
Сообщение #1


Зажиточный Горожанин
*****

За вклад в развитие ArtTower.ru1 местоЗвезда писателя II степени
Группа: Почетные граждане
Сообщений: 1533
Регистрация: 14.12.2009
Пользователь №: 14921
Галерея Блог


Симпатии:  65  


Здравствуйте, уважаемые читатели. В этой статье я хочу поделиться с вами опытом, который приобрел при создании игр на базе платформы Adobe Flash CS3. Я постараюсь описать все особенности этого процесса так, как это представляется мне. Поскольку я являюсь новичком на этом поприще – не судите строго, если какое-то из описаний вам покажется слишком простым. Но ведь и в этом есть свои плюсы: любой простой проект всегда можно дополнить и обогатить. Также я не стану утверждать, что именно такие алгоритмы, такую графику и т.д. (все, что приводится в описа­нии ниже) нужно обязательно использовать и никакие иные. Вовсе нет. Каждый проект – это своя неповторимая, маленькая или большая история со своими особенностями: будь то алгоритм или внешний вид, эффекты или звуковое оформление и т.д.

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

Играя в разнообразные игры, у меня часто по­являлось желание сделать что-то свое. Но как, какими инструментами пользоваться для созда­ния? В этом смысле Adobe Flash CS3 меня очень заинтересовал. При этом для создания графи­ческого оформления выбор падает на Adobe Photoshop CS3.

Итак, с чего начать – начинать нужно с идеи, с того, что вы хотите сделать. Идею нужно четко сформулировать. Иногда для этого нужно неко­торое время. Затем описать ее на бумаге настоль­ко подробно, насколько это изначально пред­ставляется возможным. Выбрать жанр, который наиболее подойдет для воплощения вашей идеи в жизнь: аркада, экшн, стратегия, рпг, приклю­чения, поиск предметов, симулятор и т.д. Будет ли это 2D, 2'5D (изометрическая проекция), 3D, текстовый режим или смешанный вариант. На­пример, одни элементы игры могут быть реали­зованы спрайтами, другие – 3D моделями. Будет ли присутствовать звуковое оформление, ка­кие звуки будут сопровождать отдельные сцены. Также нужно сделать наброски внешнего вида игры, элементов интерфейса, игровых объектов, персонажей, событий в игре, механизма управ­ления игрой и т.д. В дальнейшем уже можно определить, что следует дополнить, что убрать или изменить. Не стоит забывать о том, что на данный момент существует огромное множество игр, и в вашей игре должны быть свои особенно­сти, что-то неповторимое, чем Ваш проект будет отличаться от множества других из выбранного Вами жанра.


Все это нам понадобится для следующего шага – создания алгоритма игры. Каков он будет – за­висит от конкретного проекта. Например, общую структуру игры можно представить так:

Прикрепленное изображение

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

Каждый из блоков схемы – это отдельный фрагмент программы, который включает в себя набор функций, необходимых для его реализа­ции.

Например, для блока «меню» – это вывод фо­новой картинки, создание кнопок меню и пере­ход управления к определенному месту програм­мы по нажатию каждой из них. Кроме того, блок меню может содержать дополнительные блоки, как, например, заставка, активизирующаяся, если долгое время не происходило никаких со­бытий; предпросмотр игры и пр.

Когда управление переходит в блок «игра», на экран выводится игровая область, игровые объ­екты, выполняется сценарий игры. В процессе его выполнения осуществляется проверка мно­жества условий: вычисление траектории, поло­жение игровых объектов и назначение им опре­деленных параметров, обработка событий мыши, клавиатуры, воспроизведение звуков в зависи­мости от событий в игре, проигрывание фоновой музыки и т.д. По окончании игрового процесса по сценарию игры (будь то проигрыш, выигрыш, или ничья) – или принудительно – управление передается обратно в блок «меню». Также блок «игра» может включать в себя дополнительные блоки, вывод статистики, проигрывание видео­ролика перед началом и в конце игры.

Блок «установка» может содержать в себе экра­ны с настройками различных устройств, опций игрового процесса, качества гра­фики и т.п. Все элементы настроек хранятся в соответствующих переменных, это могут быть: размеры игрового поля, сложность игры, время года местности (лето или зима, например), качество звука, графики, коды клавиш и связан­ные с ними игровые действия и т.д. Блок «выход» может содержать проигрывание видеоролика, во­прос о подтверждении выхода, вы­вод разной информации непосред­ственно перед выходом. Конечно, в процессе создания алгоритма могут быть любые изменения, но его намного удобнее составлять по уже имеющимся предваритель­ным наброскам и эскизам. Далее идет создание игры по выше пред­ставленному алгоритму. Иногда в процессе работы по каким-либо причинам может оказаться, что решение задачи невозможно, и тог­да требуется изменение алгорит­ма. Поэтому, на мой взгляд, очень важно на стадиях эскиза и состав­ления алгоритма предусмотреть практически все, что должно быть в игре – от самых простых вещей до сложных. Я решил начать с про­стой игры, и первый проект «Пят­нашки» был начат.

Игра «Пятнашки»

Я попытался представить устрой­ство игры и пришел к выводу, что она будет состоять из фоновой кар­тинки, кнопки для перемешивания фишек и 15 кнопок – самих фи­шек. Для кнопки перемешивания фишек и кнопок фишек мне пона­добилось по две картинки. Первое изображение «не активна», когда указатель мыши не находится над фишкой или кнопкой перемешива­ния фишек; и изображение «активна», когда указатель мыши на­ходится над фишкой или кнопкой перемешивания фишек.

Прикрепленное изображение

Общую структуру игры можно представить в следующем виде:

Прикрепленное изображение

После того, как были подго­товлены все изображения, нужно создать во флеш новый документ, задать ему размеры 320x240 и выбрать темно-серый фон, как это показано на рисунке.
Прикрепленное изображение

Следующий шаг – это добавление ранее заго­товленных изображений в созданный документ флеш. Для удобства использования картинки с изображением фишек по состояниям я разме­стил их в соответствующие папки.

Прикрепленное изображение

Далее я перетащил в рабочую область картинку с изображени­ем фона и все картинки с состоя­нием «не активна».

Прикрепленное изображение

Над фоновой картинкой боль­ше не будет предприниматься ни­каких действий. А вот картинки с изображением кнопки перемеши­вания фишек и изображениями фишек я преобразовал в объект «Button». Так можно бу­дет назначить для собы­тия нажатия левой кла­вишей мыши на фишках и кнопке перемешива­ния фишек определен­ные функции. Также мне необходимо было, чтобы при наведении мышки на кнопку перемеши­вания фишек или саму фишку, она подсвечи­валась. Для этого двой­ным нажатием левой клавишей мыши нужно зайти во вновь создан­ный объект «Button», добавить ключевой кадр и перетащить туда соответствующее изображе­ние кнопки с состоянием «активна». После этого нужно вернуться опять в основную рабочую об­ласть. Проделать то же самое со всеми фишками и кнопкой перемешивания фишек.

Прикрепленное изображение

Теперь, когда есть фон, поверх которого раз­мещаются объекты «Button» (т.е. кнопка пере­мешивания фишек и фишки), нужно назначить каждому объекту «Button» имя. Выделяя по оче­реди каждую фишку, я в Свойствах присвоил им имена «b1»–«b15» соответственно, а кнопке перемешивания фишек я присвоил имя «_upd»

Прикрепленное изображение

Для чего это нужно? Игра предполагает пере­мещение фишек на экране и также, при необхо­димости, их перемешивание. Чтобы сделать это при помощи Action Script, каждая фишка и кноп­ка перемешивания фишек должна иметь свое уникальное и удобное для понимания имя. А в случае с фишками – и порядковый номер.

Когда все объекты созданы и названы, нужно написать программу, которая бы могла управлять ими особым образом, соответствующим правилам игры «Пятнашки». А именно: при на­жатии на кнопку перемешивания фишки на поле перемешивались в произвольном порядке, и, при нажатии на фишку, рядом с которой есть свободное место, она туда перемещалась. Для удобства пользования программой создаем но­вый слой и называем его «as». Далее нажимаем F9 и приступаем к написанию программы.

Подключим необходимые библиотеки.

Код
import flash.utils.*;
import flash.events.*;


Создадим глобальные переменные, которые мы будем использовать по ходу программы.

Двумерный массив «field» – это игровое поле: в нем будут храниться номера фишек, по умолча­нию он создается заполненным последовательно от 1 до 0, где 0 будет означать, что там пустое место, и соответственно позволит определять направление перемещения фишки.

Код
var i,j:int;
var field:Array=[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,0]];


Далее идет функция перемешивания фишек. Эта функция будет присвоена событию нажатия левой клавишей мыши на кнопке перемешивания фишек.

Код
function rnd()
{
//создадим локальные переменные
var px,py,px1,py1,n:int;

//в цикле, выполняющемся 32 раза (значение может быть любым), получаем произвольные координаты для двух фишек от 0 до 3
for (i = 0; i < 32; i++)
{
px=Math.round(Math.random() * 3);
py=Math.round(Math.random() * 3);
px1=Math.round(Math.random() * 3);
py1=Math.round(Math.random() * 3);

//меняем значения двух элементов в массиве
n=field[py][px];
field[py][px]=field[py1][px1];
field[py1][px1]=n;
}


Далее, когда мы перемешали значения элементов массива, нам нужно разместить
фишки на поле в соответствии со значениями элементов массива «field». Здесь нам и пригодятся номера фишек в их именах, благодаря которым мы мо­жет ассоциировать нужную фишку со значением массива.

Код
for (i = 0; i < 4; i++)
{
     for (j = 0; j < 4; j++)
         {
//Получим значение каждого элемента массива нашего игрового поля
        n=field[i][j];


В следующей строке осуществяется проверка условия, и если значение элемента не равно 0, то выполняется следующее действие, – про­грамма формирует имя объекта из символа «b» и значения элемента массива игрового поля (т.е. в пределах от 1 до 15); в результате можно будет обратиться к объекту, имя которого будет одним из «b1»–«b15», т.е. нашими фишками, и задать их свойствам x и y соответствующие координаты – с учетом размеров фишки и смещения ее отно­сительно начала координат, т.е. расположив ее в пределах игрового поля.

Код
        if (n!=0) {this["b"+n].x=j*40+146; this["b"+n].y=i*40+66;}
    }
}
}


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

Код
function step(s:int) //функция перемещения фишки на экране
{
var px,py,tx,ty:int; //переменные – в них будут записываться координаты фишки, по которой было произведено нажатие, и координаты пустой ячейки (равной 0)
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++)
{
if (field[i][j] == s){px=j;py=i;}; //поиск координат фишки, по которой был клик мышкой
        if (field[i][j] == 0){tx=j;ty=i;}; //поиск пустой области
}
}

//выполняется проверка условий, если соседняя фишка пустая, то значения элементов массива меняются местами, и в соответствующем направлении перемещается фишка на экране
if ((px+1)==tx && py==ty) {field[py][px]=0; field[ty][tx]=s; this["b"+s].x+=40;}else //перемещение вправо
if ((px-1)==tx && py==ty) {field[py][px]=0; field[ty][tx]=s; this["b"+s].x-=40;}else //перемещение влево
if ((py+1)==ty && px==tx) {field[py][px]=0; field[ty][tx]=s; this["b"+s].y+=40;}else //перемещение вниз
if ((py-1)==ty && px==tx) {field[py][px]=0; field[ty][tx]=s; this["b"+s].y-=40;} //перемещение вверх
}


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

Код
//назначение события Click (т.е. нажатия и отпускания левой клавишей мыши на фишке)
//параметром функции «Step» будет номер фишки
b1.addEventListener(MouseEvent.CLICK, function() {step(1);});
b2.addEventListener(MouseEvent.CLICK, function() {step(2);});
b3.addEventListener(MouseEvent.CLICK, function() {step(3);});
b4.addEventListener(MouseEvent.CLICK, function() {step(4);});
b5.addEventListener(MouseEvent.CLICK, function() {step(5);});
b6.addEventListener(MouseEvent.CLICK, function() {step(6);});
b7.addEventListener(MouseEvent.CLICK, function() {step(7);});
b8.addEventListener(MouseEvent.CLICK, function() {step(8);});
b9.addEventListener(MouseEvent.CLICK, function() {step(9);});
b10.addEventListener(MouseEvent.CLICK, function() {step(10);});
b11.addEventListener(MouseEvent.CLICK, function() {step(11);});
b12.addEventListener(MouseEvent.CLICK, function() {step(12);});
b13.addEventListener(MouseEvent.CLICK, function() {step(13);});
b14.addEventListener(MouseEvent.CLICK, function() {step(14);});
b15.addEventListener(MouseEvent.CLICK, function() {step(15);});

//назначение события по нажатию кнопки перемешивания фишек
_upd.addEventListener(MouseEvent.CLICK, function() {rnd();});

//останавливаем воспроизведение ролика
stop();


Вот и все, игра «Пятнашки».

Прикрепленное изображение

Приложение: игра и исходные материалы: Прикрепленный файл  15_r2.zip ( 218.1 килобайт ) Кол-во скачиваний: 369


Следующий проект, который я хотел бы пред­ставить Вам, был сделан вскоре после «Пятна­шек». Проект получился довольно объемный, но тоже не сложный. В отличие от предыдуще­го проекта, где не было ни начала, ни конца, и игра начиналась, можно сказать, сходу, в этом проекте уже присутствует и старт, и финиш, и режимы игры. Но то, что предшествовало его появлению – это огромное желание воплотить давнюю мечту в жизнь. Так появилась на свет игра «Морской бой».

Игра «Морской бой»

Идея простая, а правила понятны всем. Кто не играл в морской бой с друзьями, расчерчи­вая в тетрадке поля, присваивая обозначения строкам и столбцам, расставляя корабли на поле из расчета, что сопернику не удалось бы легко определить их расположение? И с каким ажиотажем потом проводилась игра! Радость победы, горечь поражения и как следствие – матч-реванш. Но на бумаге это одно дело, а как его представить в программном виде, каков должен быть механизм игры? Начнем с перечня – что нам нужно:

  1. декоративная рамка,
  2. поле боя на фоне моря с двумя сетками 10x10,
  3. изображения кнопок,
  4. изображения окон,
  5. изображения кораблей,
  6. эффект выстрела,
  7. эффект попадания,
  8. эффект повреждения,
  9. эффект промаха,
  10. изображение ядра и его полета,
  11. эффект затенения клетки на поле, с плав­ным ее открытием,
  12. должно быть начало игры, где можно было бы указать имя игрока,
  13. должна быть возможность расставить ко­рабли на поле и перейти к игре.
  14. звуковое оформление по нажатию кнопок и событий в игре.


В игре необходимо, чтобы:
  1. игроки стреляли по очереди, до первого промаха;
  2. ход игрока – в момент выстрела долж­на воспроизводиться анимация выстрела, проигрывание звука выстрела и полет ядра из целой палубы стреляющего корабля в указанную клетку поля компьютера по не­кой траектории;
  3. ход компьютера – в момент выстрела долж­на воспроизводится анимация выстрела, проигрывание звука выстрела и полет ядра из любой закрытой клетки своего поля в любую клетку поля игрока, за исключени­ем тех случаев, когда не было попадания по кораблю, тогда компьютер должен об­стрелять корабль игрока.


По окончании игры:
  1. отображение имени победителя,
  2. начало новой игры


Представим игру в виде схемы:

Прикрепленное изображение

Далее следует процесс создания графической части, рисование интерфейса, кнопок, кораблей, покадровой анимации взрывов и т.д.

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

  1. Общая фоновая картинка, поверх которой я разместил кнопку новой игры и окно для ввода имени игрока.

    Прикрепленное изображение
  2. Объект «игровое поле», содержащий всебе фоновую картинку непосредственно игрового поля, окно отображения имени победителя, поля для счета попаданий, поля с именами игроков, набор кораблей, используемых в процессе игры.

    Прикрепленное изображение
  3. Объект «режим конструктора», содержа­щий в себе фоновую картинку непосред­ственно игрового поля, область конвейе­ра, на которой размещается кнопка старта игры, выделены места для кораблей с определенным количеством палуб, тексто­вые области для отображения количества имеющихся всего и доступных для рас­становки на поле пользователя кораблей и набор кораблей для расстановки их на поле игрока.

    Прикрепленное изображение


Также в документе присутствуют анимации выстрела (кольца дыма от ядра), взрыва при по­падании по кораблю, взрыва при попадании в воду, анимация поврежденной палубы.

Игра представляет собой два двумерных стро­ковых массива 10x10, в ячейки которых зано­сятся определенные значения. В зависимости от них проводятся определенные действия над определенными объектами MovieClip, которым (в зависимости от режима игры или конструктора, или значения ячеек полей компьютера или игро­ка) задаются соответствующие значения про­зрачности, положения на экране, отображения на экране в целом. Где расположить на экране корабль, какую анимацию проигрывать в момент попадания, где будут начало и конец пути поле­та ядра, и т.д., – все это определяется в зависи­мости от значений в ячейках массивов f1 и f2.

Поле игры

  1. f1 – двумерный массив размерностью 10x10, поле компьютера,
  2. f2 – двумерный массив размерностью 10x10, поле игрока.

    <id>+<поле>+<направление><количество палуб><порядковый номер> – имя корабля, формируемое по определенному условию, где:
    1. id = ʺsʺ корабль в области конструктора, или ʺpʺ – корабль в области игры;
    2. поле = ʺlʺ или ʺrʺ, соответственно левое – поле компьютера, правое – поле игрока;
    3. количество палуб = сколько палуб у корабля;
    4. порядковый номер = т.е. у горизонтальных однопалубников на правом поле в области конструктора, будет 4 имени ʺsrh11ʺ, ʺsrh12ʺ, ʺsrh13ʺ, ʺsrh14ʺ. Также называются и MovieClip с изобра­жениями соответствующих кораблей.


  1. cell_free = ”free” – константа, определя­ющая значение ячейки на поле как сво­бодной. Функция очистки поля заполняет все ячейки указанного массива значением cell_free.

  2. cell_damage = ”damage” – константа, опре­деляющая, что в этой ячейке произошло прямое попадание. Это значение в ячейку будет записано только в том случае, если в ней до этого было значение с именем ко­рабля, т.е. если f2[0][0]= ”srv23”, то при попадании компьютеров эту ячейку ее зна­чение изменится на f2[0][0] = ”damage”.
  3. cell_ignored = ”ignored” – константа, опре­деляющая что эта ячейка граничит с ячейкой, в которой было прямое попа­дание по палубе ко­рабля.


Режим конструктора

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

Инициализация об­ласти конструктора

  1. очищаем поля, при­сваивая всем ячей­кам значение cell_free,
  2. скрываем с экрана все корабли,
  3. в области конвейе­• ра (массив bconv[4] хранит названия текущих кораблей в конвейере, либо cell_free, если больше нет кораблей с соот­ветствующим количеством палуб, массив bpos[4] хранит координаты кораблей в об­ласти конструктора) размещаем по одному кораблю каждого вида.


После нажатия левой клавишей мыши на ко­рабле (переменной ship_name присваивается имя корабля, по которому было осуществлено нажатие) он может перетаскиваться на экране, колесом мыши можно менять направление кора­бля. Если указатель мыши с кораблем навести на правое поле, то при правильном условии раз­мещения и повторном нажатии левой клавиши мыши:

  1. корабль остается на поле;
  2. в ячейки массива f2 с координатами кора­бля (cell_x, cell_y) и его длиной заносится имя корабля (ship_name);
  3. выполняется поиск, есть ли еще неустанов­ленные корабли с таким же количеством палуб, и если есть, то следующий горизон­тальный корабль выставляется на экране в конвейер, и ему присваивается значение визуального отображения на экране;
  4. при повороте корабля (осуществляется ко­лесиком мыши) запоминаем его текущее имя, скрываем его с экрана, в имени ме­няем ”h” на ”v” или наоборот, и получаем имя корабля с другим направлением, но с таким же количеством палуб.


Размещение корабля вне поля или на поле, но не по правилам – корабль возвращается в исходную позицию.

  1. При установке корабля на поле, в ячейки, над которыми он на­ходился, записывается имя это­го корабля.
  2. При взятии с поля, установлен­ный на нем корабль, в ячейки, над которыми он находился, за­писывается значение cell_free.


Остальные корабли визуально скрыты до того момента, пока пользо­ватель не установит соответствующий корабль на поле.

При нажатии на кнопку «ОК» начи­нается игра, и если пользователь не установил все корабли на поле, тогда корабли пользователя расставляются в произвольном порядке автоматиче­ски.


На рисунке 2 показан механизм работы конвейера и возможные ситу­ации при установке корабля.

Прикрепленное изображение

На рисунке 3 показано, как в мас­сиве хранится информация о кора­бле.

Прикрепленное изображение

Расстановка кораблей Компьютера

Происходит автоматически. Начи­ная с 4-хпалубника и по убывающей.
Принцип действия такой:

  1. определяется количество палуб корабля и количество кораблей, это две обратно пропорциональ­ные величины;
  2. в произвольном порядке выби­рается положение корабля (вер­тикально или горизонтально);
  3. выполняется поиск и подсчет количества возможных мест установки корабля,
  4. если поиск не дал положительного резуль­тата – выполняется поиск в другом поло­жении;
  5. если поиск не дал результатов – дальней­шее выполнение цикла отменяется, и цикл повторяется с самого начала;
  6. если количество возможных мест уста­новки корабля больше нуля, то в произ­вольном порядке выбирается любое, и в определенные ячейки массива поля за­писываются данные о корабле, например, установка первого на поле трехпалубника в горизонтальном положении. Тогда за­пись в массив будет выглядеть так:


Код
f1[y][x] = ʺslh31ʺ; f1[y][x+1] = ʺslh31ʺ; f1[y][x+2] = ʺslh31ʺ.


Тень

Для того чтобы видеть, в какие клетки были произведены выстрелы, и по каким клеткам нет смысла вести огонь, поле компьютера покрывает­ся тенью. Тень – это массив из роликов MovieClip с именем shadow, содержащих в себе анимацию плавного исчезновения черного квадратика с экрана. В последнем кадре этого ролика стоят две команды stop(); и visible=false;. Таким образом, после проигрывания ролик останавливается и ви­зуально скрывается с экрана. В программе созда­ется контейнер для тени – это MovieClip с именем shadow_fld, который назначается потомком в игро­вую область MovieClip с именем win_play. Создается массив с именем shadow_field из ролика тени с име­нем shadow, размерностью 10х10. Каждому ролику задаются соответствующие координаты и назна­чение родителем контейнера shadow_fld. Изменяя прозрачность MovieClip shadow_fld, в программе можно выставить нужную прозрачность для общей тени поля. На рисунке 13 показано: А – структура тени, B – установка для всей тени уровня про­зрачности.

Прикрепленное изображение


Игра

Полет ядра

Расчет траектории по­лета ядра осуществляет­ся по принципу кривой Безье:

задаются коорди­наты начальной и конечной точек пути (px1, py1) и (px2, py2),
  1. задается высо­та, которая зави­сит от расстояния (чем длиннее рас­стояние, тем больше будет высота),
  2. определяется ко­личество шагов (чем больше рас­стояние, тем боль­ше шагов, чтобы полет на разное расстояние отли­чался по време­ни),
  3. имея три коорди­наты, рассчитаем кривую Безье,
  4. занесем координа­ты каждой точки в массив.


Код
point=new Point(0,0);
point.x=dmx;
point.y=dmy;
path.push(point);


На рисунке 4 показан расчет кривой Безье.
Прикрепленное изображение

Инициализация игровой области:
  1. скроем все объекты области игры с экра­на;
  2. переименуем ячейки с названиями кора­блей, заменим ”s” на ”p”, так как имена ко­раблей в области конструктора начинают­ся с ”s”, а в игровой области – с ”p”;
  3. расставим корабли для левого и правого полей в зависимости от названий, которые расположены в ячейках соответствующих массивов f1 и f2;
  4. расположим корабли друг над другом на­чиная с левой верхней и заканчивая пра­вой нижней координатами поля – для поля компьютера – и с правой верхней к левой нижней – для поля пользователя;
  5. покажем на экране корабли игрока;
  6. скроем с экрана все MovieClip с картинкой повреждения корабля и расположим их над кораблями;
  7. над всем и предыдущими объектами рас­положим окно конца игры;
  8. обнулим результаты и отобразим их в об­ласти игры.


Первым ходит пользователь:

  1. доступно отслеживание координат указате­ля мыши в момент нажатия левой клавишей мыши над полем компьютера;
  2. произвольно выбирается ячейка, где есть целая палуба корабля на поле пользовате­ля, рассчитываются ее координаты, – это будут координаты начала пути;
  3. определяются координаты, в которых было нажатие, определяются координаты ячейки на поле компьютера – это будут координаты конца пути;
  4. проверяется значение в ячейке, если значе­ние ее = cell_free = ”free”, – запоминаем что будет взрыв воды, если cell_damage, – запо­минаем, что будет взрыв + проверка, что это первый раз попадание + проверка по всем палубам корабля, и если это первое попада­ние – очки пользователя увеличиваются на 1; если корабль открыли полностью – вы­полняется анимация плавного появления корабля на поле компьютера + воспроизведение звука по­явления; если же пользователь уже попадал по этой ячейке, то будет воспроизведен только ро­лик взрыва + воспроизведение звука без начисления очков и проверки плавного появления корабля;
  5. воспроизводится ролик выстре­ла из пушки;
  6. воспроизводится ролик кольца дыма от ядра;
  7. проверяется количество точек пути, и если их достаточно мно­го, то произвольно с шансом 1 из 10 воспроизводится или нет звук старта полета ядра;
  8. рассчитывается траектория по­лета ядра вышеуказанным спо­собом по начальным и конечным координатам;
  9. включается таймер анимации полета ядра;
  10. в процессе выполнения тайме­ра ядру задаются последующие координаты;
  11. В момент полета ядра на экране так же отображаются и прои­грываются ролики кольца дыма. Проверяется текущий кадр роли­ка кольца дыма, и если текущий кадр=2 – в координатах ядра устанавливается новый ролик кольца дыма и проигрывается. Таким образом, с определенным интервалом будут показываться ролики дыма от ядра вдоль все­го пути, создавая эффект следа от полета ядра;
  12. во время полета ядра проверя­ется количество точек пути, и если их доста­точно много, то на соответствующей точке произвольно с шансом 1 из 10 воспроизво­дится или нет звук приземления ядра;
  13. по завершении полета ядра, в зависимости от определенной выше точки приземле­ния, воспроизводится ролик либо взрыва на воде, либо на корабле и воспроизводится соответствующий звук.


Ход переходит к компьютеру:

Выбирается любая ячейка на поле компьюте­ра, отличная от той, где было прямое попадание или промах, рассчитываются ее координаты.

Если логика компьютера logic_ship:
  1. на поле пользователя выбирается произволь­но ячейка с значением ”free” или с значением с первым символом ”p”;
  2. при попадании запоминаются координаты ячейки в fire_x, fire_y, в ячейку заносится значение ”fire”, присваиваем fire_count=1;
  3. при следующем выстреле проверяется fire_count и если = 1 значит нужно выбрать одно из четырех направлений. В случае промаха в ячейку заносится значение ”ignored”, и это направление больше не будет выбираться. В случае попадания fire_count увеличивается на единицу, ячейке присваивается значение ”fire”;
  4. компьютер двигается в этом направлении до тех пор, пока не достигнет границы поля или ячейка не окажется ”free”, или не потопит ко­рабль;
  5. если же компьютер попал по кораблю не с края, тогда пройдя в одном направлении и, достигнув края поля или ячейки со значением ”free”, изменит направление, вернется назад и выберет соседнюю ячейку с начальной;
  6. после того как все палубы будут ”fire”, им присвоится значение ”damage”, в соседние ячейки проставится значение ”ignored”.

На рисунке 5(a) показан механизм обработки по­падания по палубе корабля в режим logic_ship.

Прикрепленное изображение

Если логика компьютера logic_random – в этом случае ячейки после каждого выстрела выби­раются произвольно, вне зависимости от того, было ли попадание или нет, будет выбираться произвольно ячейка со значением ”free” или на­чинающаяся с ”p”. При точном попадании вокруг ячейки, в которой была палуба корабля, ячей­кам присваивается статус ”ignored”, так в сле­дующий раз компьютер уже не будет стрелять в ячейки, в которых по правилам заведомо не расположено кораблей.


На рисунке 5(b) показан механизм обработки попадания по палубе корабля в режиме logic_random.
Прикрепленное изображение


  1. рассчитываются координаты конечной точ­ки пути,
  2. далее - выстрел, полет ядра, приземление, увеличение счета компьютера при точном попадании.


Конец игры
  1. Когда счет компьютера или пользователя становится = 20, игра останавливается, на экране появляется окно конца игры в ко­тором указывается имя победителя;
  2. после нажатия кнопки «Ок» или «Новая игра» откроется область конструктора игры, и цикл повторяется сначала.


Звуковые файлы были созданы при помощи звукового редактора Fruity Loops.

Кадры из игры:

Прикрепленное изображение

Прикрепленное изображение

Прикрепленное изображение

Прикрепленное изображение

Приложение: игра и исходные материалы: Прикрепленный файл  Morskoy_Boy_r2.zip ( 1.95 мегабайт ) Кол-во скачиваний: 274


--------------------
Мимо мчатся стальные поезда, а я еду в своем игрушечном локомотиве Чух Чух...Чух Чух
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
flashcinema
сообщение 12.02.2013 - 12:38
Сообщение #2


Постоялец
**


Группа: Жители
Сообщений: 78
Регистрация: 15.01.2012
Из: Россия, Москва
Пользователь №: 19009



Симпатии:  9  


Спасибо, за прекрасные уроки!
Как и обещал, сделал свои пятнашки, но в процессе обнаружил ошибку в опубликованных здесь кодах.
А именно в шестом блоке кодов для пятнашек вкралась лишняя единица в четвертой строке:

for (i = 0; i < 4; i++) 1{

В скачиваемом архиве, в коде ошибок нет.

Еще, наверное, стоило в самом начале упомянуть, что данные игры создаются на основе файлов с ActionScript 3.

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


--------------------
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
T-Rex
сообщение 13.02.2013 - 00:29
Сообщение #3


Зажиточный Горожанин
*****

За вклад в развитие ArtTower.ru1 местоЗвезда писателя II степени
Группа: Почетные граждане
Сообщений: 1533
Регистрация: 14.12.2009
Пользователь №: 14921
Галерея Блог


Симпатии:  65  


flashcinema, спасибо большое за замечания, учту. По поводу патовых ситуаций не совсем понял, что имеется в виду? Полностью проходил несколько раз, не полностью (когда оставался не сложен нижний ряд) больше. Не замечалось сбоев, если можно - скрин, или более детальное описание ошибки?


--------------------
Мимо мчатся стальные поезда, а я еду в своем игрушечном локомотиве Чух Чух...Чух Чух
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
flashcinema
сообщение 13.02.2013 - 00:38
Сообщение #4


Постоялец
**


Группа: Жители
Сообщений: 78
Регистрация: 15.01.2012
Из: Россия, Москва
Пользователь №: 19009



Симпатии:  9  


Скрин предоставлю позже. А ситуация заключается в том, что в нижнем ряду невозможно выставить фишки по порядку.
Либо для этого приходится нарушать порядок в любом другом ряду.

Прикрепленное изображение

Сообщение отредактировал flashcinema - 13.02.2013 - 00:49


--------------------
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Foxx
сообщение 13.02.2013 - 00:40
Сообщение #5


Благородный Дон
*******

2 место3 место3 местоМеткий стрелокПобедитель турнираЗа вклад в развитие ArtTower.ru2 местоПобедитель турнираМеткий стрелок
Группа: Стражи
Сообщений: 5568
Регистрация: 8.05.2006
Из: Киев
Пользователь №: 10
ФотоГраф
Галерея Блог


Симпатии:  320  


T-Rex, имеются ввиду ситуации вроде такой:
Прикрепленное изображение
Если поменять в пятнашках местами две соседние фишки (выделено жирным), то сложить оригинальную картину просто невозможно.


--------------------
Dixi
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
flashcinema
сообщение 13.02.2013 - 00:53
Сообщение #6


Постоялец
**


Группа: Жители
Сообщений: 78
Регистрация: 15.01.2012
Из: Россия, Москва
Пользователь №: 19009



Симпатии:  9  


Foxx, ты тоже с этим столкнулся?
Сколько раз играл в настоящие пятнашки, ни разу с такой ситуацией не сталкивался (((


--------------------
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Foxx
сообщение 13.02.2013 - 00:57
Сообщение #7


Благородный Дон
*******

2 место3 место3 местоМеткий стрелокПобедитель турнираЗа вклад в развитие ArtTower.ru2 местоПобедитель турнираМеткий стрелок
Группа: Стражи
Сообщений: 5568
Регистрация: 8.05.2006
Из: Киев
Пользователь №: 10
ФотоГраф
Галерея Блог


Симпатии:  320  


Цитата(flashcinema @ 12.02.2013 - 23:53) *
Foxx, ты тоже с этим столкнулся?
Нет, в приведенной здесь реализации игры не сталкивался. Т.к. не пробовал ее у себя запускать)). Теорию игр в свое время изучал.
Вот, нагуглил по быстрому:
Прикрепленное изображение

Цитата
Сколько раз играл в настоящие пятнашки, ни разу с такой ситуацией не сталкивался (((
Потому что в реальных пятнашках всегда сначала берется правильная (сложенная) позиция фишек, и потом последователно "запутывается". А при случайной генерации исходного поля можно запросто попасть и на нерешаемую комбинацию)



--------------------
Dixi
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
flashcinema
сообщение 13.02.2013 - 01:13
Сообщение #8


Постоялец
**


Группа: Жители
Сообщений: 78
Регистрация: 15.01.2012
Из: Россия, Москва
Пользователь №: 19009



Симпатии:  9  


Цитата
Потому что в реальных пятнашках всегда сначала берется правильная (сложенная) позиция фишек, и потом последователно "запутывается". А при случайной генерации исходного поля можно запросто попасть и на нерешаемую комбинацию)

Возможно именно так, сейчас уже не помню - вываливал ли я фишки из игровой коробочки, и потом вкладывал в произвольном порядке, но выстроить весь порядок получалось всегда.
Сегодня даже специально зашел в магазин "Умных игрушек", но пятнашек у них не оказалось...


--------------------
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
T-Rex
сообщение 29.04.2013 - 20:39
Сообщение #9


Зажиточный Горожанин
*****

За вклад в развитие ArtTower.ru1 местоЗвезда писателя II степени
Группа: Почетные граждане
Сообщений: 1533
Регистрация: 14.12.2009
Пользователь №: 14921
Галерея Блог


Симпатии:  65  


Foxx, flashcinema, понял. Если изменить алгоритм перемешивая так, что бы произвольно граничащая с пустой клеткой фишка становилась туда, то можно сохранить логику того что когда-то все фишки были попорядку но перемешались большим количеством произвольных ходов.

Условие такое:

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

Чуть позже выложу измененный вариант в actionscript.

Изменен способ перемешивания вышеуказанным способом. Переменная rnd_count означает количество шагов перемешивания, если поставить значение 1 то перемешиваться будет по подному ходу. Есть одна особенность. Выбирая произвольно ход - компьютер может ходить туда-сюда несколько раз подряд, по этому или учитывать эту особенность, или увеличивать количество произвольных шагов, или сделать так что бы компьютер вообще не мог двигаться обратно, соответсвенно будет влиять на рузльтат, ну при rnd_count=1000 перемешивается хорошо.
Прикрепленный файл  15_r3.zip ( 276.23 килобайт ) Кол-во скачиваний: 52

прошу прощение за столь долгое отсутствие комментария

Сообщение отредактировал T-Rex - 29.04.2013 - 22:54


--------------------
Мимо мчатся стальные поезда, а я еду в своем игрушечном локомотиве Чух Чух...Чух Чух
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
Foxx
сообщение 29.04.2013 - 23:44
Сообщение #10


Благородный Дон
*******

2 место3 место3 местоМеткий стрелокПобедитель турнираЗа вклад в развитие ArtTower.ru2 местоПобедитель турнираМеткий стрелок
Группа: Стражи
Сообщений: 5568
Регистрация: 8.05.2006
Из: Киев
Пользователь №: 10
ФотоГраф
Галерея Блог


Симпатии:  320  


Цитата(T-Rex @ 29.04.2013 - 20:39) *
- определяются координаты пустой ячейки
- определяется количество фишек вокруг нее, которые могут стать на ее место, это верх, низ, право, лево, или же если пустая клета у края или угла, 4, 3 или 2 возможных фишки, координаты фишек, которые могут переместиться заоминаются в массиве
- произвольно выбирается значение в пределах этих вариантов
- выбранная фишка по координатам элемента массива допустимых фишек для перемещения с произвольным индексом меняется местами с пустой ячейкой
- определяются координаты пустой ячейки и цикл перемешивая повторяется вновь. Количество перемешиваний задается отдельной переменной.
Такой алгоритм тоже подойдет. Он, конечно, более медленный, чем просто подсчет по формуле, что я привел в предыдущем сообщении. Но есть неоспоримый плюс - его можно анимировать! - показать игроку процесс перемешивания фишек. Должно получиться интересно (что-то вроде, как смотреть на то, как горит огонь smile.gif).


--------------------
Dixi
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
T-Rex
сообщение 5.05.2013 - 01:47
Сообщение #11


Зажиточный Горожанин
*****

За вклад в развитие ArtTower.ru1 местоЗвезда писателя II степени
Группа: Почетные граждане
Сообщений: 1533
Регистрация: 14.12.2009
Пользователь №: 14921
Галерея Блог


Симпатии:  65  


Foxx, ну да можно и анимировать процесс, тогда процедура перемешивания будет состоять из текущей процедуры перемешивания по 1 шагу и процесса плавного перемещения фишки с одной ячейки в другую, по окончанию передвижения - цикл повторяется вновь.

Познакомился с алгоритмом определения нерешаемой комбинации. Надо будет попробовать реализовать этот алгоритм. Заодно почитал про NP-полную задачу, искал наглядный пример, жаль не нашлось, материал сложный но очень интересный, так же и про Класс P немного прочел. На первый взгляд сложно, примеров мало, вот в случае с Алгоритмом поиска A* - там хороший пример, сразу все понятно.

Я вот сейчас точно не помню но подобную комбинацию я расставлял, хотя это возможно была и 15, 14, 13 но я точно помню что что-то похожее расставлял. Точного алгоритма не подскажу так как расставлялось наугад и все сходилось. Правда это были такие не систематические ходы как в случае с выстраиванием фишек в первых трех рядах, но похоже. Когда остается последний неслженный ряд - в выстраивании участвуют 3 и 4 ряды, условно производтся работа над произвольными цепочками фишек, возможно задействуется и 2 ряд, в который временно заносится какая-то фишка из 4-го ряда, происходит смешивание 3-4 рядов и возврат фишки из 2-ряда вниз, для того что бы нарушить 13,15,14. Цепочки фишек перестраиваются и сдвигаются по часовой и против часовой стрелок. У меня большие сомнения что эта комбинация 13,15,14 нерешаема, но это еще требует подтверждения.

Сообщение отредактировал T-Rex - 5.05.2013 - 01:48


--------------------
Мимо мчатся стальные поезда, а я еду в своем игрушечном локомотиве Чух Чух...Чух Чух
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения
it43rt
сообщение 11.06.2014 - 16:36
Сообщение #12






Группа: Туристы
Сообщений: 1
Регистрация: 11.06.2014
Пользователь №: 20897



Симпатии:  0  


Познакомился с алгоритмом определения нерешаемой комбинации. Надо будет попробовать реализовать этот алгоритм. Заодно почитал про NP-полную задачу, искал наглядный пример, жаль не нашлось, материал сложный но очень интересный, так же и про Класс P немного прочел. На первый взгляд сложно, примеров мало, вот в случае с Алгоритмом поиска A* - там хороший пример, сразу все понятно.

Я вот сейчас точно не помню но подобную комбинацию я расставлял, хотя это возможно была и 15, 14, 13 но я точно помню что что-то похожее расставлял. Точного алгоритма не подскажу так как расставлялось наугад и все сходилось. Правда это были такие не систематические ходы как в случае с выстраиванием фишек в первых трех рядах, но похоже.


Сообщение отредактировал Foxx - 11.06.2014 - 21:57
Причина редактирования: Удалена рекламная ссылка
Вернуться в начало страницы
 
+Ответить с цитированием данного сообщения

Быстрый ответДобавить ответ в эту темуОткрыть тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия форума Сейчас: 18.12.2017 - 06:27