Создание игры “Змейка” на псп[PSP]Эту тему я хотел бы посвятить мануалу по созданию одной очень популярной в своё время игры с тетриса - змейка.
Облазив интернет по гуглу, я так и не нашёл приличного манула по коддингу этой игры, и поэтому решил написать свой собственный, дабы юзеры, ищущие по гуглу, натыкались на этот сайт, среди прочих, и получали достойную помощь =)
Я не пишу мануал для совсем ничего не знающих людей в области программирования, ибо это слишком хлопотно и долго, однако я постараюсь, как можно подробнее прокомментировать весь код…
С чего начнём, наверное с понимания принципа работы игры.
А их - этих принципов может быть много, лично мною были испробованы 3.
Но без сомнений ТРЕТИЙ- самый экономный, безбаговый и понятный, его основной принцип действия, то есть идея удаления массива хвоста и расширения массива по средствам постановки головы, был предложен vladgalay-ем, и превосходил, по вышеизложенным параметрам 2 моих собственных принципа =)
О нём я и буду писать.
И так, как же работает змейка, ну по сути её голова всегда движется вперёд, а хвост волочится за нею, но причём ровно в той последовательности, как мы ходили головой.
То есть нам надо прорисовывать постоянно новую голову вперёд а хвост затирать(удалять), а когда змейка будет кушать, то и хвост затирать не надо.
Мы поняли задачу, а теперь приступим к реализации.
Что нужно для счастья ? - представить змейку в качестве массива, но не просто массива а массива в массиве, если так можно выразиться, то есть у каждого квадратика, из которых состоит змея, будет свой массив, хранящий координаты этого квадратика по х и по у.
Код я писал на LUA под PSP и проверял на плеере LUA PLAYER HM, и вам его советую.
kub=Image.load("kub.png")
timer=0--iznachalno taimer na nule
n=1
m=0
local telo={{x=1,y=1},{x=2,y=1},{x=3,y=1},{x=4,y=1}}--sozdanie pervih 4-x zveniev zmeiki
while true do--igrovoi cikl
screen:clear()--ochistka ekrana
pad = Controls.read()--podgruzka knopok
if timer>=0 then--taimer
timer=timer+1
end
if timer>10 then
table.remove(telo,1)--udalenie poslednego zvena,toest hvosta
table.insert(telo,{x=telo[table.getn(telo)].x+n,y=telo[table.getn(telo)].y+m})--postanovka novogo zvena
timer=0--obnulenie taimera
end
for i=1, table.getn(telo) do
screen:blit(telo[i].x*10,telo[i].y*10, kub)--raspechatka tela zmei iz kubikov
end
--sistema upravlenia dvizeniem
if pad:right() then
if n~=-1 and m~=0 then
n=1
m=0
end
elseif pad:left() then
if n~=1 and m~=0 then
n=-1
m=0
end
elseif pad:up() then
if m~=1 and n~=0 then
m=-1
n=0
end
elseif pad:down() then
if m~=-1 and n~=0 then
m=1
n=0
end
end
end--konec igrovogo cikla
И так, мы получили бегающую по экрану змейку, изгибающуюся на поворотах и при этом затрачиваемую минимум ресурсов, как раз под силы тетриса.А теперь поподробнее для тех, кто по той или иной причине не знает некоторых функций кода. =)
1) kub=Image.load("kubik.png")—загрузка картинки в переменную kub
2) local telo={{x=1,y=1},{x=2,y=1},{x=3,y=1},{x=4,y=1}}—local это объявление масс ива который написан далее, то есть массива telo, далее идёт присваивание этому массиву данных, по средствам вложенных массивов. То есть первый кубик,а это у нас-хвост будет иметь координаты по х-1, по у-1, второй по х-2, по у-1 и т.д.
3) table.remove(telo,1)—функция для удаления первого э-та массива telo, то есть нашего хвоста, цифра 1 указывает, как раз на номер э-та массива
4) table.insert(telo,{x=telo[table.getn(telo)].x+n,y=telo[table.getn(telo)].y+m})—функция для постановки нового кубика змеи, то есть расширения нашего массива tela.
5) screen:blit(telo[i].x*10,telo[i].y*10, kub)—цифры 10 указывают на ширину/высоту нашего изображения kub-эти цифры можно менять по своему усмотрению.
Вот и всё, что я хотел вам сказать по поводу коддинга змейки на ПСП.
А как домашнее задание даю вам сделать систему генерации пищи и поедания этой пищи змейкой.Ответ на это задание будет выложен мною в следующей теме =)