Вообще я очень давно мечтал написать самостоятельно игрушку. Но, как это часто бывает, у меня не хватало знаний и идей для реализации задуманного. Долго я пытался найти хоть аккие-нибудь уроки по данной теме в сети, но попадались либо статьи на общие темы, не представляющие для меня интереса, либо очень сложные в понимании статьи по программированию какого-нибудь ИИ и т.п. В общем никакого сочувствия к нубам среди маститых девелоперов игр я не встретил, не говоря уже о том, что в рунете ситуация с написанием уроков вообще и уроков по нужной мне теме в частности удручающая (все либо тырят статьи друг у друга, либо переводят забугорные).
Ну да ладно, оставим лирику. Одно время я любил играть в Сапера (Mine Sweeper), я думаю все, кто хоть немного знаком с компьютерами, знают эту логическую игру. Вот я и подумал, а не написать ли мне своего сапера! Эта игра показалась мне достаточно простой для реализации, ведь там нет никакой супер физики, нет искуственного интеллекта и прочих сложных для новичка вещей. Сказано - сделано! Итак, я представляю вашему вниманию урок по написанию вашей первой игры, встречайте - Сапёр! (бурные овации, крики "браво!")
Хватит слов, приступаем...
Базовая верстка
Собственно базовой верстки как таковой у нас не будет, так как весь HTML мы будем генерить яваскриптом. Но нам потребуется базовый макет страницы и стили для генерируемого контента.
Вот так будет выглядеть наша страничка:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
<script type="text/javascript"> // тут будем писать скрипт </script> </head>
<body>
</body> </html>
Плюс для работы нашего сапера нам потребуется навешивать события. Для этого можно использовать связку element.addEventListener() и element.attachEvent(), но у них есть свои проблемы. По этому я погуглил и нашел неплохой урок по созданию библиотеки для работы с добавлением и удалением обработчиков событий. Почитать этот, несомненно, полезный и нужный урок вы можете тут. Настоятельно рекомендую всем ознакомиться. Так же там в конце статьи есть ссылка на скачивание библиотеки event.js. В данной библиотеке решено большинство проблем, связанных с кроссбраузерной обработкой событий, поэтому в нашем проекте мы будем использовать ее.
Подключаем библиотеку в наш проект:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="ru">
<!-- А тут уже будет наш код --> <script type="text/javascript"> // тут будем писать скрипт </script> </head>
<body>
</body> </html>
Использовать эту библиотеку очень просто, чтобы добавить обработчик для какого либо события нужно вызвать метод add(), а чтобы удалить событие - remove():
// к примеру добавим алерт на клик var clickHandler = function() { alert('ok!'); }
// вызываем метод add() объекта Event // первый параметр - елемент к которому цепляем обработчик // второй параметр - событие на которое будет срабатывать функция (без префикса "on"! не забывайте) // третий параметр - функция-обработчик события Event.add(element, 'click', clickHandler);
// то же самое для remove() Event.remove(element, 'click', clickHandler);
Просто правда?
Ну все, вроде с приготовлениями закончили, теперь можно приступать к написанию нашего сапёра. Поехали!
Проектирование
А не было у меня никакого проектирования. Я просто тупо сел однажды и написал, все придумывая на ходу... Но многие умные дяди поголовно рекомендуют начинать с проектирования и называют такие умные слова и аббревиатуры как UML и блок-схемы. Наверное эти умные дяди не зря все это делать рекомендуют, так что и вы начните лучше с проектирования...
Ну-с продолжим...
Создаем объект
Для тех кто не знаком с ООП в яваскрипте рекомендую заглянуть в эту тему, там я описывал основные принципы объектно-ориентированного программирования в JavaScript и приводил ссылки на ресурсы где можно почитать об этом более подробно. Для тех кто уже дружит с объектами в JavaScript приступим к созданию нашего объекта (HTML-код я опускаю, больше он меняться не будет, далее будет идти только яваскрипт):
var MyMineSweeper = { // наш главный метод, он будет инициализировать нашего сапёра init: function(o) { this.W = o ? o.W : 7; this.H = o ? o.H : 7; this.bombs = o ? o.bombs : Math.floor(this.W * this.H / 4); this.placedBombs = this.bombs;
this.generateGUI(); } }
Итак, что тут происходит:
Мы создаем главный метод - init(), который будет запускать нашего сапера в первый раз, а так же когда юзер захочет переиграть заново. В качестве параметра этот метод будет принимать объектный литерал (или объект в формате JSON - JavaScript Object Notation), в котором будут задаваться необходимые параметры для построения игрового поля (далее я буду назвать игровое поле просто доской, для краткости).
Вот какие данные мы описываем в методе init():
1) this.W - ширина доски (от слова width), по умолчанию будет равна 7 (формат ширины у нас будет задаваться не в каких-либо единицах измерения, а в клетках - 7 означает, что ширина доски будет 7 клеток)
2) this.H - высота доски (от слова height), по умолчанию тоже 7 клеток
3) this.bombs - количество бомб на доске, если не задано иное будет заполнена 1/4 доски (я не знаю сколько бомб на доске в настоящем сапёре, поэтому поставил так чтобы черверть доски была заполнена бомбами)
4) this.placedBombs - сколько бомб уже установлено (это число будет уменьшаться по мере того как программа будет расставлять мины на карте)
5) this.generateGUI() - этот метод будет генерить GUI (Graphical User Interface - по русски все что юзер будет видеть на экране, т.е. наш HTML)
Я не хочу создавать клон виндового сапёра, поэтому я решил, что не стоит ограничивать пользователя всего тремя досками (маленькая, большая и средняя), в нашем мега-сапёре юзер сам решит сколько на сколько будет у него доска и сколько на ней будет бомб, для сего мы предусмотрим три поля ввода. Метод init() будет устанавливать все данные по умолчанию, но если мы передадим ему как параметр объектный литерал (я его обозвал o - коротко и ясно, но вообще такие короткие названия переменным давать не стоит ибо потом запутаться где что можно), то наш сапёр примет те параметры которые пользователь ввел в поля ввода.
Сам GUI мы будем строить на таблицах. "Почему не на дивах?", - спросят некоторые сильно продвинутые верстальщики. А все потому, что нам пофиг на семантику и т.п., а таблицы гибче, требуют меньше усилий на верстку и не развалятся в нашем обожаемом ИЕ. Но если вы хотите, то стройте на дивах, может оно и красивше выйдет.
Итак наш GUI будет содержать:
1) поле ввода для задания ширины доски (в клетках)
2) поле ввода для задания высоты доски (в клетках)
3) поле ввода для задания количества бомб на доске
4) кнопку с надписью "Старт!", по нажатию на которую будет перезапускаться игра
5) область статистики (туда мы будем писать Game Over уже или еще нет)
6) собственно саму доску, на которой юзер будет искать мины
На этом пока позвольте откланяться, строить наш GUI будем в следующий раз. И так уже многа букав написал. Продолжение будет.
Критику, советы, предложения, вопросы, хвальбы, лесть и т.п. прошу писать в личку.
Здравствуйте, подскажите какой тег использовать для увеличения значения, пример на картинке.
Вроде, про такой тег я слышала. Если есть тег прогресс бар, значит и такое должно быть.
Question
Great Rash
Вообще я очень давно мечтал написать самостоятельно игрушку. Но, как это часто бывает, у меня не хватало знаний и идей для реализации задуманного. Долго я пытался найти хоть аккие-нибудь уроки по данной теме в сети, но попадались либо статьи на общие темы, не представляющие для меня интереса, либо очень сложные в понимании статьи по программированию какого-нибудь ИИ и т.п. В общем никакого сочувствия к нубам среди маститых девелоперов игр я не встретил, не говоря уже о том, что в рунете ситуация с написанием уроков вообще и уроков по нужной мне теме в частности удручающая (все либо тырят статьи друг у друга, либо переводят забугорные).
Ну да ладно, оставим лирику. Одно время я любил играть в Сапера (Mine Sweeper), я думаю все, кто хоть немного знаком с компьютерами, знают эту логическую игру. Вот я и подумал, а не написать ли мне своего сапера! Эта игра показалась мне достаточно простой для реализации, ведь там нет никакой супер физики, нет искуственного интеллекта и прочих сложных для новичка вещей. Сказано - сделано! Итак, я представляю вашему вниманию урок по написанию вашей первой игры, встречайте - Сапёр! (бурные овации, крики "браво!")
Хватит слов, приступаем...
Базовая верстка
Собственно базовой верстки как таковой у нас не будет, так как весь HTML мы будем генерить яваскриптом. Но нам потребуется базовый макет страницы и стили для генерируемого контента.
Вот так будет выглядеть наша страничка:
Плюс для работы нашего сапера нам потребуется навешивать события. Для этого можно использовать связку element.addEventListener() и element.attachEvent(), но у них есть свои проблемы. По этому я погуглил и нашел неплохой урок по созданию библиотеки для работы с добавлением и удалением обработчиков событий. Почитать этот, несомненно, полезный и нужный урок вы можете тут. Настоятельно рекомендую всем ознакомиться. Так же там в конце статьи есть ссылка на скачивание библиотеки event.js. В данной библиотеке решено большинство проблем, связанных с кроссбраузерной обработкой событий, поэтому в нашем проекте мы будем использовать ее.
Подключаем библиотеку в наш проект:
Использовать эту библиотеку очень просто, чтобы добавить обработчик для какого либо события нужно вызвать метод add(), а чтобы удалить событие - remove():
Просто правда?
Ну все, вроде с приготовлениями закончили, теперь можно приступать к написанию нашего сапёра. Поехали!
Проектирование
А не было у меня никакого проектирования. Я просто тупо сел однажды и написал, все придумывая на ходу... Но многие умные дяди поголовно рекомендуют начинать с проектирования и называют такие умные слова и аббревиатуры как UML и блок-схемы. Наверное эти умные дяди не зря все это делать рекомендуют, так что и вы начните лучше с проектирования...
Ну-с продолжим...
Создаем объект
Для тех кто не знаком с ООП в яваскрипте рекомендую заглянуть в эту тему, там я описывал основные принципы объектно-ориентированного программирования в JavaScript и приводил ссылки на ресурсы где можно почитать об этом более подробно. Для тех кто уже дружит с объектами в JavaScript приступим к созданию нашего объекта (HTML-код я опускаю, больше он меняться не будет, далее будет идти только яваскрипт):
Итак, что тут происходит:
Мы создаем главный метод - init(), который будет запускать нашего сапера в первый раз, а так же когда юзер захочет переиграть заново. В качестве параметра этот метод будет принимать объектный литерал (или объект в формате JSON - JavaScript Object Notation), в котором будут задаваться необходимые параметры для построения игрового поля (далее я буду назвать игровое поле просто доской, для краткости).
Вот какие данные мы описываем в методе init():
1) this.W - ширина доски (от слова width), по умолчанию будет равна 7 (формат ширины у нас будет задаваться не в каких-либо единицах измерения, а в клетках - 7 означает, что ширина доски будет 7 клеток)
2) this.H - высота доски (от слова height), по умолчанию тоже 7 клеток
3) this.bombs - количество бомб на доске, если не задано иное будет заполнена 1/4 доски (я не знаю сколько бомб на доске в настоящем сапёре, поэтому поставил так чтобы черверть доски была заполнена бомбами)
4) this.placedBombs - сколько бомб уже установлено (это число будет уменьшаться по мере того как программа будет расставлять мины на карте)
5) this.generateGUI() - этот метод будет генерить GUI (Graphical User Interface - по русски все что юзер будет видеть на экране, т.е. наш HTML)
Я не хочу создавать клон виндового сапёра, поэтому я решил, что не стоит ограничивать пользователя всего тремя досками (маленькая, большая и средняя), в нашем мега-сапёре юзер сам решит сколько на сколько будет у него доска и сколько на ней будет бомб, для сего мы предусмотрим три поля ввода. Метод init() будет устанавливать все данные по умолчанию, но если мы передадим ему как параметр объектный литерал (я его обозвал o - коротко и ясно, но вообще такие короткие названия переменным давать не стоит ибо потом запутаться где что можно), то наш сапёр примет те параметры которые пользователь ввел в поля ввода.
Сам GUI мы будем строить на таблицах. "Почему не на дивах?", - спросят некоторые сильно продвинутые верстальщики. А все потому, что нам пофиг на семантику и т.п., а таблицы гибче, требуют меньше усилий на верстку и не развалятся в нашем обожаемом ИЕ. Но если вы хотите, то стройте на дивах, может оно и красивше выйдет.
Итак наш GUI будет содержать:
1) поле ввода для задания ширины доски (в клетках)
2) поле ввода для задания высоты доски (в клетках)
3) поле ввода для задания количества бомб на доске
4) кнопку с надписью "Старт!", по нажатию на которую будет перезапускаться игра
5) область статистики (туда мы будем писать Game Over уже или еще нет)
6) собственно саму доску, на которой юзер будет искать мины
На этом пока позвольте откланяться, строить наш GUI будем в следующий раз. И так уже многа букав написал. Продолжение будет.
Критику, советы, предложения, вопросы, хвальбы, лесть и т.п. прошу писать в личку.
P.S. Вот что у нас получится в итоге: http://mine-sweeper.narod.ru/
Link to comment
Share on other sites
3 answers to this question
Recommended Posts