Arkanoid на 39 строк
Всем привет. Данная статья (или даже заметка, обзор кода), будет интересна как опытному, так и начинающему программисту.
Ещё хотелось бы отметить, что я не знаю основную аудиторию и не могу изложить материал так, чтобы было интересно всем. Иными словами это мой первый пост в этом блоге на сайте gamin.me.
Арканоид на 39 строк - согласитесь, звучит многообещающе; некоторым, наверное, даже не верится. Но такое возможно.
Ну, все по порядку: как-то давно я просматривал работы с конкурса «игр из 50 строк» и увидел этот арканоид; тогда я на него не обратил никакого внимания, наверное, просто не заметил, но сейчас, не занимаясь панорамированием уже продолжительное время, увидел его вновь, и, скажем так, он меня действительно удивил. Нет, не бойтесь, в нем нету команд, перечисленных через запятую. Вполне такой адекватный арканоид. В общем, смотрим:
OpenScreen 800,600,16,2
ScreenVsync On
Dim bl(200)
r=255
a#=400
b#=550
c#=0.02
d#=0.02
Do
Cls rgb(0,0,0)
If n=200 Then n=0
m=MouseX()
LockBuffer
For y=100 To 280 Step 20
For x=0 To 760 Step 40
If bl(n)=0
Col1=RGB(r,12*y-r,0)
If PointInBox(a#,b#,x,y,x+38,y+18)And bl(n)=0
bl(n)=1
d#=-d#
Col1=rgb(100,250,50)
Score=Score+5
EndIf
Col2=rgbfade(Col1,75)
ShadeBox x,y,x+38,y+18,col1,col2,col1,col2
endif
Inc n
a#=a#-c#
b#=b#-d#
Next
Next
UnLockBuffer
If a#<0 Or a#>800 Then c#=-c#
If b#<0 Or (PointInBox(a#, b#,m,556,m+80,560)And d#<0)Or b#>600 Then d#=-d#
BoxC m,560,m+80,570,1,RGB(0,0,r)
CircleC a#,b#,8,1,RGB(r,r,r)
Print "Score: "+Str$(Score)
Sync
Loop
Написан он на PlayBasic, для запуска кода можно скачать бесплатную версию по этой ссылке и самим убедиться, что он работает:
http://www.playbasic.com/files/Demos/PlayBasicLearningEdition.exe
Ну и главное, что хотелось бы сказать, а точнее, пояснить, чем же он так мне понравился. Вот этим блоком, точнее, тем как он работает.
For y=100 To 280 Step 20
For x=0 To 760 Step 40
If bl(n)=0
Col1=RGB(r,12*y-r,0)
If PointInBox(a#,b#,x,y,x+38,y+18)And bl(n)=0
bl(n)=1
d#=-d#
Col1=rgb(100,250,50)
Score=Score+5
EndIf
Col2=rgbfade(Col1,75)
ShadeBox x,y,x+38,y+18,col1,col2,col1,col2
endif
Inc n
a#=a#-c#
b#=b#-d#
Next
Next
Пару слов наперед, основной цикл программы содержится между do и Loop, то есть построение карты происходит постоянно, когда цикл заканчивается, массив bl() содержит информацию о блоке т. е. он по сути говорит стоит ли сейчас рисовать блок или нет, и если блок активный, то проверяем столкновения. Стоит заметить одну особенность: столкновения просчитываются не сразу, то есть если наш мяч только задел блок, но в цикле For до него не дошли, то ничего не произойдет. Из этого следует, что наш мяч в худшем случае может уйти в блок на 2 пикселя. Вот эта маленькая ошибка и дала сделать арканоид на 39 строк.
Ой, забыл упомянуть ещё о самом важном: LockBuffer/UnLockBuffer - это говорит о том, что карта выводится на экран сразу же, иными словами, одним объектом. В принципе, этого можно было избежать, но для того, чтобы программа выводила изображение быстрее, нужно закрывать буфер.
И ещё пару слов напоследок, физика мяча достаточно примитивная, но тут она особой роли не играет, т. к. целью было сделать меньше код.
Для лентяев прикрепил ещё исходник с игрой:
http://technos-world.ucoz.ru/blog_temp/BreakOut.rar
Если есть какие то вопросы - пишите.
P.S. Код можно было сделать ещё меньше, если бы убрать ненужные операторы, ну а если быть ёще честнее, то можно было бы не использовать стандартные функции столкновений, а прописать самому - на это бы ушло 2-4 строки, которые как раз бы бы окупили те, что убрали.
- 29 марта 2012, 21:21
- 01
Забыл самое главное - условие поражения. Мячик считает, что пол - та же стенка. А вообще зачёт.
Почему я до самой окончательной загрузки страницы думал, что это что-то про органоиды и биологию?
А мне что-то про Андроид подумалось
Азат, принесите, пожалуйста, для мсье немного запятых.
Я знаю, что у вас оставалось немного. :)
в посте я насчитал 25 запятых(не считая тех что в коде), так что у него вроде есть немного)
Хмм... Автор намеренно писал "арганоид" вместо "арканоид" или по причине благого неведения?
Арахноид
Всем спасибо, что поправили. Название сейчас поменяю. У меня игра подобного типа была в детстве на картридже, она мне почему то запомнилась как арганоид =]
Ещё смешнее получается интерпретация от слова агроном, агроноид хД
while(GameStillRun()) {};
PlayFunMelody();
Это какой-то меметичный фрагмент кода? Иначе не понял комментария.
Jazz пояснил. ;)
А. Но я бы сказал скорее:
while(GameStillRun()) {PlayFunMelody();};
Так все зависнет
Проверять в PlayFunMelody(), не играет ли мелодия уже, и нормально будет.
Уши отвянут от получившегося
Basic? Нет уж, извольте.
Извольте что? о_О
Дело тут скорее не в том на чем написан код, а в том как он написан. Такой алгоритм претерпит не много изменений если его переписать например на С++, другими словами ты будешь использовать почти те же операторы. Оговорюсь что только без учета опп.
У этого кода есть большой минус он не слишком универсальный в плане добавления уровней, видов блоков, видов раскладок блоков на уровне.
На базике много не напишешь...
А тут, наоборот, нужно не много, а мало, это конкурс такой. :)
Как бы интерпретатор использовать в подобных конкурсах это не совсем труъ. Тогда можно вообще накатать собственный интерпретатор, для которого исходники подобной игры будут содержать 10-12 операторов.
В основном в коде используются операторы общего назначения, исключения лишь составляют операторы вывода геометрических фигур и один оператор показывающий столкновение.
В большинстве движков, конструкторов и т.д. и т.п. присутствуют назовем их чтобы было всем понятно "команды общего назначения", которые и делают из движков движки, из конструкторов конструкторы. Ну так вот операторы вывода геометрических фигур и один оператор показывающий столкновение и есть такие операторы.
#include "arkanoid.h"
int main()
{
arkanoid::play();
return 0;
}
И тогда, если жюри конкурса адекватное, оно засчитает в проект все строки этого самого собственного интерпретатора (который же не из воздуха возьмётся, а сам будет откомпилирован, нет?). В правилах это должно как-то быть оговорено. Впрочем, подобных прецедентов я не видел. Было бы неплохо посмотреть на примеры, если кто из читающих этот комментарий видел, чтобы в конкурсах такого характера автор писал собственный интерпретатор, или пусть даже модифицировал существующий таким читерским образом.
Смотря как писать. Небольшую аркаду или игру на уровне 8-16 бит вполне.
Вот к примеру, небольшая демка
http://www.youtube.com/watch?v=R6jSaP_fGNY&list=UUbCbBpKSMayjzDHmtSNWv6A&feature=plcp