Arkanoid на 39 строк

screenshot

Всем привет. Данная статья (или даже заметка, обзор кода), будет интересна как опытному, так и начинающему программисту.

Ещё хотелось бы отметить, что я не знаю основную аудиторию и не могу изложить материал так, чтобы было интересно всем. Иными словами это мой первый пост в этом блоге на сайте 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 строки, которые как раз бы бы окупили те, что убрали. 

  • ATLUS
  • 29 марта 2012, 21:21
  • 0