Simply game/2: различия между версиями
Tora-bora (обсуждение | вклад) (initial page) |
Tora-bora (обсуждение | вклад) м (правки пунктуации) |
||
Строка 11: | Строка 11: | ||
}} | }} | ||
=== Как написать простейшую стрелялку используя двумерные массивы === | === Как написать простейшую стрелялку используя двумерные массивы === | ||
В этой статейке мы попробуем сляпать алгоритм для простейшей стрелялки. Понятно, что никакой ценности эта игрулька представлять не будет, но моя | В этой статейке мы попробуем сляпать алгоритм для простейшей стрелялки. Понятно, что никакой ценности эта игрулька представлять не будет, но моя цель показать как программировать такие задачи, без привязки к какому-либо конкретному языку. | ||
'''Логический уровень''': | '''Логический уровень''': | ||
Игровое поле вписывается в один экран и соответствует двумерному массиву (допустим 50*50) по нему при помощи стрелок курсора двигается герой по пути собирая чего-нибудь (алмазики , монетки | Игровое поле вписывается в один экран и соответствует двумерному массиву (допустим 50*50), по нему при помощи стрелок курсора двигается герой по пути собирая чего-нибудь (алмазики , монетки – что угодно). Периодически в разных точках игрового поля возникают враги, которые через определенный промежуток времени производят в вас выстрел если герой находится на одной горизонтали или вертикали с ними. Соответственно врага надо уничтожить до того как он пальнет в вас, иначе GameOver. | ||
Пуляем естественно тоже по горизонтали/вертикали при помощи клавиши Space. Когда все алмазы собраны происходит переход на следующий уровень, где врагов становится больше или они быстрее стреляют. В общем смысл нашей учебной игрульки примерно понятен :-) | Пуляем естественно тоже по горизонтали/вертикали при помощи клавиши Space. Когда все алмазы собраны происходит переход на следующий уровень, где врагов становится больше или они быстрее стреляют. В общем смысл нашей учебной игрульки примерно понятен :-) | ||
Строка 24: | Строка 24: | ||
Соответственно в пустых клеточках массива записаны 0, в клетке где стоит наш герой - 1, в клетках с алмазиками - 2, в клетках с врагами - 3 (как видим остается еще довольно много значений для врагов разного уровня, препятствий, аптечек и т.п.). | Соответственно в пустых клеточках массива записаны 0, в клетке где стоит наш герой - 1, в клетках с алмазиками - 2, в клетках с врагами - 3 (как видим остается еще довольно много значений для врагов разного уровня, препятствий, аптечек и т.п.). | ||
''На будущее:'' По поводу аптечек - герой может быть убит не с первого попадания, а, например, с третьего (вводим в прогу переменную живучести героя, которая при каждом попадании уменьшается на единицу и при достижении 0 происходит Game Over ) Тот же способ действует в отношении врагов только там проще при попадании во врага будем уменьшать значение в ячейке массива допустим с 5 до 3, при попадании во врага 3 в ячейку вписывается 0, соответственно вместо него возникает пустая клетка. Но эти украшательства я описывать не буду, поняв общие принципы вы легко сможете на базе этого скелета сделать довольно играбельную поделку ( кстати можно еще и препятствия добавить тогда игрушка начнет очень отдаленно напоминать спектрумовскую How to be a Hero с замороженными неподвижными монстрами и одним игровым экраном http://zx-games.ru/how-to-be-a-hero/) | ''На будущее:'' По поводу аптечек - герой может быть убит не с первого попадания, а, например, с третьего (вводим в прогу переменную живучести героя, которая при каждом попадании уменьшается на единицу и при достижении 0 происходит Game Over). Тот же способ действует в отношении врагов, только там проще – при попадании во врага будем уменьшать значение в ячейке массива допустим с 5 до 3, при попадании во врага 3 в ячейку вписывается 0, соответственно вместо него возникает пустая клетка. Но эти украшательства я описывать не буду, поняв общие принципы вы легко сможете на базе этого скелета сделать довольно играбельную поделку (кстати можно еще и препятствия добавить, тогда игрушка начнет очень отдаленно напоминать спектрумовскую How to be a Hero с замороженными неподвижными монстрами и одним игровым экраном http://zx-games.ru/how-to-be-a-hero/). | ||
# Для начала нам нужна подпрограмма обнуляющая массив и по случайному принципу заполняющая его клетки несколькими алмазиками. Она же выставляет начальные координаты нашего героя и записывает в соответствующую ячейку 1. Далее надо написать основное тело программы и прибить его гвоздями к таймеру. | # Для начала нам нужна подпрограмма обнуляющая массив и по случайному принципу заполняющая его клетки несколькими алмазиками. Она же выставляет начальные координаты нашего героя и записывает в соответствующую ячейку 1. Далее надо написать основное тело программы и прибить его гвоздями к таймеру. | ||
# После того как первая подпрограмма произвела инициализацию массива включается таймер который генерирует раз в несколько секунд ( допустим в 10 ) нового врага в свободную ячейку массива выбираемую по случайному закону ( понятно что эта ячейка должна быть пустой т.е. в ней записан 0 ) . Раз в 5 секунд тот же таймер запрашивает координаты героя допустим они будут X,Y и проверяет горизонталь ( все ячейки массива от [0,Y] до [49,Y] ) и вертикаль ( ячейки от [X,0] до[X,49 ]) если на них обнаруживается хоть один враг он производит выстрел ( надо написать красивую подпрограммку которая при помощи спрайтов и звуков все это достойно оформит, но это уже привязанно к конкретному языку - например Python+PyGame отлично подходят для подобных задач ) . На самом деле это очень упрощенный алгоритм выстрела , пока я писал всю эту теорию придумал более правильный но для учебной стрелялки он подходит плохо ввиду своей сложности. | # После того как первая подпрограмма произвела инициализацию массива, включается таймер, который генерирует раз в несколько секунд (допустим в 10) нового врага в свободную ячейку массива выбираемую по случайному закону (понятно, что эта ячейка должна быть пустой, т.е. в ней записан 0). Раз в 5 секунд тот же таймер запрашивает координаты героя (допустим они будут X,Y) и проверяет горизонталь (все ячейки массива от [0,Y] до [49,Y]) и вертикаль (ячейки от [X,0] до[X,49]) если на них обнаруживается хоть один враг, он производит выстрел (надо написать красивую подпрограммку, которая при помощи спрайтов и звуков все это достойно оформит, но это уже привязанно к конкретному языку - например Python+PyGame отлично подходят для подобных задач). На самом деле это очень упрощенный алгоритм выстрела, пока я писал всю эту теорию придумал более правильный, но для учебной стрелялки он подходит плохо ввиду своей сложности. | ||
'''Взаимодействия с пользователем''' | '''Взаимодействия с пользователем''' | ||
Все что касается нашего главного героя , его перемещений, стрельбы я вынес в этот уровень. На самом деле сюда цепляется изрядный кусок математического уровня, что вполне естественно ведь любые деления условны и эта структура сделана для упрощения труда кодера [ для представителей младшего поколения объясню что кодер это человек который пишет код :-) ] | Все что касается нашего главного героя, его перемещений, стрельбы я вынес в этот уровень. На самом деле сюда цепляется изрядный кусок математического уровня, что вполне естественно, ведь любые деления условны и эта структура сделана для упрощения труда кодера [для представителей младшего поколения объясню, что кодер – это человек, который пишет код :-)] | ||
Итак при нажатии стрелочек наш герой поворачивается и идет в соответствующую сторону при нажатии на пробел он в эту же сторону стреляет (спецэффекты на вашей совести, мое дело скелет программы). | Итак, при нажатии стрелочек наш герой поворачивается и идет в соответствующую сторону, при нажатии на пробел он в эту же сторону стреляет (спецэффекты на вашей совести, мое дело скелет программы). | ||
Нам нужны следующие подпрограммы: | Нам нужны следующие подпрограммы: | ||
# Программа рисующая игровое поле на экране, отрисовывающая алмазики и текущее положение героя (при его изменении) , эта же программа отрисовывает новых врагов при их генерации таймером математического уровня (то есть она приводит в соответствие изображение на экране к содержанию вашего массива ). | # Программа рисующая игровое поле на экране, отрисовывающая алмазики и текущее положение героя (при его изменении), эта же программа отрисовывает новых врагов при их генерации таймером математического уровня (то есть она приводит в соответствие изображение на экране к содержанию вашего массива). | ||
# Обработчик событий отслеживающий ваши манипуляции с клавиатурой и после проверки граничных условий (а то ваш герой убежит за границы массива, лови его потом по монитору :-) ) и свободного поля в направлении движения (в ячейке массива должен быть 0 или алмазик 2 за который увеличивается переменная «богатства» героя). При соблюдении этих условий герой перемещается на следующее поле (записывая по старым координатам 0 а в ячейку соответствующую новому положению 1). При нажатии пробела происходит выстрел в направлении движения заключающийся в проверке содержания соответствующих клеток массива в этом направлении на наличие в них врага , идею можно подглядеть в пункте 2.2 | # Обработчик событий отслеживающий ваши манипуляции с клавиатурой и после проверки граничных условий (а то ваш герой убежит за границы массива, лови его потом по монитору :-)) и свободного поля в направлении движения (в ячейке массива должен быть 0 или алмазик 2 за который увеличивается переменная «богатства» героя). При соблюдении этих условий герой перемещается на следующее поле (записывая по старым координатам 0, а в ячейку соответствующую новому положению 1). При нажатии пробела происходит выстрел в направлении движения, заключающийся в проверке содержания соответствующих клеток массива в этом направлении на наличие в них врага, идею можно подглядеть в пункте 2.2. Только проверка (выстрел) делается не по 4-ем направлениям как для врага, а только в направлении движения. Как только переменная «богатства» героя достигнет некоторой критической величины, происходит переход на следующий уровень, сопровождаемый разными звуковыми и цветовыми эффектами на ваше усмотрение. Ура, наши победили!<br> | ||
''На будущее:'' Конечно в идеале обработчик на первое нажатие стрелки должен по идее поворачивать героя в соответствующем направлении и только на следующее нажатие делать шаг в эту сторону. Ведь это поле может быть занято что не даст нашему герою развернуться на месте и пальнуть во врага, получается довольно паршивая коллизия, проблема в общем не большая думаю вы ее решите если будете писать подобную программу. | ''На будущее:'' Конечно в идеале обработчик на первое нажатие стрелки должен по идее поворачивать героя в соответствующем направлении и только на следующее нажатие делать шаг в эту сторону. Ведь это поле может быть занято, что не даст нашему герою развернуться на месте и пальнуть во врага, получается довольно паршивая коллизия, проблема в общем не большая, думаю вы ее решите если будете писать подобную программу. | ||
Что бы у вас не возникало мыслей, что я чистый теоретик вот вам простая пулялочка на очень хорошей связке Python+PyGame (рекомендую всем игрo-писателям) http://kostyalamer.narod.ru/pygame03/pygame03.html | Что бы у вас не возникало мыслей, что я чистый теоретик вот вам простая пулялочка на очень хорошей связке Python+PyGame (рекомендую всем игрo-писателям) http://kostyalamer.narod.ru/pygame03/pygame03.html | ||
Понятно, что на учебную прогу, алгоритм которой я сочинил для этой статьи она не похожа, но кое-какие общие элементы есть ( например процедура bah хорошо вписывается в контекст этой статьи), к тому же в листинге я оставил немножко комментариев - в общем если уж дочитали до этого места, то наверное разберетесь при желании.<br> | Понятно, что на учебную прогу, алгоритм которой я сочинил для этой статьи она не похожа, но кое-какие общие элементы есть (например процедура bah хорошо вписывается в контекст этой статьи), к тому же в листинге я оставил немножко комментариев - в общем если уж дочитали до этого места, то наверное разберетесь при желании.<br> | ||
Будем считать тему написания простейших игрушек при помощи массивов законченной, остальное уже додумаете сами | Будем считать тему написания простейших игрушек при помощи массивов законченной, остальное уже додумаете сами. Я же довольно давно закончил с игрушками (эти статьи дань Спектрумовской молодости) и занялся совершено другими аспектами программирования (программирование апплетов для WindowMaker на python-е, но это уже совсем другая история, вряд ли интересная нашим читателям). | ||
Главное помните что написание таких игрушек лучшее средство (на мой взгляд) обучения программированию для начинающих. Особенно это актуально для школьников - скорее всего программистами (хотя кто знает) они не станут но удовольствие от того что сами создали игрушку получат огромное. Да и привычку думать подобные упражнения развивают сильно, в общем, счастливого хака. | Главное помните, что написание таких игрушек лучшее средство (на мой взгляд) обучения программированию для начинающих. Особенно это актуально для школьников - скорее всего программистами (хотя кто знает) они не станут, но удовольствие от того, что сами создали игрушку получат огромное. Да и привычку думать подобные упражнения развивают сильно, в общем, счастливого хака. | ||
<code>''С уважением, Константин Коган (kostyalamer)'' </code> | <code>''С уважением, Константин Коган (kostyalamer)'' </code> | ||
__SHOWFACTBOX__ | __SHOWFACTBOX__ | ||
[[Категория:ALT-review-edit]] | [[Категория:ALT-review-edit]] |
Версия от 15:07, 24 февраля 2013
Журнал ALT-review
Title::Как написать простейшую стрелялку используя двумерные массивы- Автор: Author::Kostyalamer Раздел: Section::игры Тег: Tag::программирование
|
Как написать простейшую стрелялку используя двумерные массивы
В этой статейке мы попробуем сляпать алгоритм для простейшей стрелялки. Понятно, что никакой ценности эта игрулька представлять не будет, но моя цель показать как программировать такие задачи, без привязки к какому-либо конкретному языку.
Логический уровень:
Игровое поле вписывается в один экран и соответствует двумерному массиву (допустим 50*50), по нему при помощи стрелок курсора двигается герой по пути собирая чего-нибудь (алмазики , монетки – что угодно). Периодически в разных точках игрового поля возникают враги, которые через определенный промежуток времени производят в вас выстрел если герой находится на одной горизонтали или вертикали с ними. Соответственно врага надо уничтожить до того как он пальнет в вас, иначе GameOver.
Пуляем естественно тоже по горизонтали/вертикали при помощи клавиши Space. Когда все алмазы собраны происходит переход на следующий уровень, где врагов становится больше или они быстрее стреляют. В общем смысл нашей учебной игрульки примерно понятен :-)
Математический уровень:
Все действие этой игры происходит в двумерном массиве байтов (50*50). Соответственно в пустых клеточках массива записаны 0, в клетке где стоит наш герой - 1, в клетках с алмазиками - 2, в клетках с врагами - 3 (как видим остается еще довольно много значений для врагов разного уровня, препятствий, аптечек и т.п.).
На будущее: По поводу аптечек - герой может быть убит не с первого попадания, а, например, с третьего (вводим в прогу переменную живучести героя, которая при каждом попадании уменьшается на единицу и при достижении 0 происходит Game Over). Тот же способ действует в отношении врагов, только там проще – при попадании во врага будем уменьшать значение в ячейке массива допустим с 5 до 3, при попадании во врага 3 в ячейку вписывается 0, соответственно вместо него возникает пустая клетка. Но эти украшательства я описывать не буду, поняв общие принципы вы легко сможете на базе этого скелета сделать довольно играбельную поделку (кстати можно еще и препятствия добавить, тогда игрушка начнет очень отдаленно напоминать спектрумовскую How to be a Hero с замороженными неподвижными монстрами и одним игровым экраном http://zx-games.ru/how-to-be-a-hero/).
- Для начала нам нужна подпрограмма обнуляющая массив и по случайному принципу заполняющая его клетки несколькими алмазиками. Она же выставляет начальные координаты нашего героя и записывает в соответствующую ячейку 1. Далее надо написать основное тело программы и прибить его гвоздями к таймеру.
- После того как первая подпрограмма произвела инициализацию массива, включается таймер, который генерирует раз в несколько секунд (допустим в 10) нового врага в свободную ячейку массива выбираемую по случайному закону (понятно, что эта ячейка должна быть пустой, т.е. в ней записан 0). Раз в 5 секунд тот же таймер запрашивает координаты героя (допустим они будут X,Y) и проверяет горизонталь (все ячейки массива от [0,Y] до [49,Y]) и вертикаль (ячейки от [X,0] до[X,49]) если на них обнаруживается хоть один враг, он производит выстрел (надо написать красивую подпрограммку, которая при помощи спрайтов и звуков все это достойно оформит, но это уже привязанно к конкретному языку - например Python+PyGame отлично подходят для подобных задач). На самом деле это очень упрощенный алгоритм выстрела, пока я писал всю эту теорию придумал более правильный, но для учебной стрелялки он подходит плохо ввиду своей сложности.
Взаимодействия с пользователем
Все что касается нашего главного героя, его перемещений, стрельбы я вынес в этот уровень. На самом деле сюда цепляется изрядный кусок математического уровня, что вполне естественно, ведь любые деления условны и эта структура сделана для упрощения труда кодера [для представителей младшего поколения объясню, что кодер – это человек, который пишет код :-)]
Итак, при нажатии стрелочек наш герой поворачивается и идет в соответствующую сторону, при нажатии на пробел он в эту же сторону стреляет (спецэффекты на вашей совести, мое дело скелет программы).
Нам нужны следующие подпрограммы:
- Программа рисующая игровое поле на экране, отрисовывающая алмазики и текущее положение героя (при его изменении), эта же программа отрисовывает новых врагов при их генерации таймером математического уровня (то есть она приводит в соответствие изображение на экране к содержанию вашего массива).
- Обработчик событий отслеживающий ваши манипуляции с клавиатурой и после проверки граничных условий (а то ваш герой убежит за границы массива, лови его потом по монитору :-)) и свободного поля в направлении движения (в ячейке массива должен быть 0 или алмазик 2 за который увеличивается переменная «богатства» героя). При соблюдении этих условий герой перемещается на следующее поле (записывая по старым координатам 0, а в ячейку соответствующую новому положению 1). При нажатии пробела происходит выстрел в направлении движения, заключающийся в проверке содержания соответствующих клеток массива в этом направлении на наличие в них врага, идею можно подглядеть в пункте 2.2. Только проверка (выстрел) делается не по 4-ем направлениям как для врага, а только в направлении движения. Как только переменная «богатства» героя достигнет некоторой критической величины, происходит переход на следующий уровень, сопровождаемый разными звуковыми и цветовыми эффектами на ваше усмотрение. Ура, наши победили!
На будущее: Конечно в идеале обработчик на первое нажатие стрелки должен по идее поворачивать героя в соответствующем направлении и только на следующее нажатие делать шаг в эту сторону. Ведь это поле может быть занято, что не даст нашему герою развернуться на месте и пальнуть во врага, получается довольно паршивая коллизия, проблема в общем не большая, думаю вы ее решите если будете писать подобную программу. Что бы у вас не возникало мыслей, что я чистый теоретик вот вам простая пулялочка на очень хорошей связке Python+PyGame (рекомендую всем игрo-писателям) http://kostyalamer.narod.ru/pygame03/pygame03.html
Понятно, что на учебную прогу, алгоритм которой я сочинил для этой статьи она не похожа, но кое-какие общие элементы есть (например процедура bah хорошо вписывается в контекст этой статьи), к тому же в листинге я оставил немножко комментариев - в общем если уж дочитали до этого места, то наверное разберетесь при желании.
Будем считать тему написания простейших игрушек при помощи массивов законченной, остальное уже додумаете сами. Я же довольно давно закончил с игрушками (эти статьи дань Спектрумовской молодости) и занялся совершено другими аспектами программирования (программирование апплетов для WindowMaker на python-е, но это уже совсем другая история, вряд ли интересная нашим читателям).
Главное помните, что написание таких игрушек лучшее средство (на мой взгляд) обучения программированию для начинающих. Особенно это актуально для школьников - скорее всего программистами (хотя кто знает) они не станут, но удовольствие от того, что сами создали игрушку получат огромное. Да и привычку думать подобные упражнения развивают сильно, в общем, счастливого хака.
С уважением, Константин Коган (kostyalamer)
__SHOWFACTBOX__