"Змейка" - Часть 2
В прошлом уроке по змейке вы научились делать основу змейки- её тело и перемещать это тело по экрану с помощью кнопок. Теперь же я вам расскажу, как осуществить систему генерации пищи на экран, поедания этой пищи змейкой, и увеличения её длины.
1)Генерация пищи
Есть несколько способов сгенерировать пищу, ну в нашем случае это будет квадратик 8*8. Его можно поместить в любую точку экрана, но тут появляется нюанс, ведь змейка у нас ходит ровно по клеточкам и не пикселем ниже, соответственно и пища должна быть ровно на пути у змейки… Как же это сделать? =)
Код генерации:
function gen()--генерация пищи осуществляется в этой функции
ex=1
ey=1
xx=math.random(0,40)--учитывая, что игровое поле в ширину 480 пикселей
yy=math.random(0,25)--учитывая, что игровое поле в высоту 272 пикселя
for j=1,xx do
ex=ex+10--смещение каждый раз по оси Х вправо
end
for j=1,yy do
ey=ey+10--смещение каждый раз по оси Y вниз
end
end
gen()--вызов функции генерации пищи
2)А теперь мы заставим змейку собирать пищу этим условием, а пища наша будет мерцать, как в тетрисе:
if telo[table.getn(telo)].x*10>=ex-1 and telo[table.getn(telo)].x*10<=ex+1 and telo[table.getn(telo)].y*10>=ey-1 and telo[table.getn(telo)].y*10<=ey+1 then--условие собирания пищи, на всякий случай я взял зазор в 1 pixel в каждую сторону, поэтому и пишу "-1” или "+1”
r=1--отключение убирания хвоста
gen()--генерирование новой пищи
end
3)И самая важная часть-увеличение змейки
if r==0 then--условие убирания хвоста
table.remove(telo,1)--удаление последнего звена - т.е. хвоста
end
4)Не маловажная и эта часть-часть проверки врезания в свой хвост
if i<=table.getn(telo)-1 then
if telo[table.getn(telo)].x*10==telo[i].x*10 and telo[table.getn(telo)].y*10==telo[i].y*10 then--условие врезания в тело змеи
break--выход из цикла
end
end
А теперь весь код целиком включая эти доработки:
Нам понадобиться ещё подгрузить картинку квадратика пищи =)
kub=Image.load("kub.png")
eda=Image.load("kub2.png")
timer=0--изначально таймер на нуле
game=true
n=1
m=0
r=0--не забудьте про него
function gen()--генерация пищи
ex=1
ey=1
xx=math.random(0,40)
yy=math.random(0,25)
for j=1,xx do
ex=ex+10
end
for j=1,yy do
ey=ey+10
end
end
gen()--вызов функции, генерирующей пищу
local telo={{x=1,y=1},{x=2,y=1},{x=3,y=1},{x=4,y=1}}--создание первых 4-х звеньев змейки
while game==true do--игровой цикл
screen:clear()--очистка экрана
pad = Controls.read()--подгрузка кнопок
if timer>=0 then--таймер
timer=timer+1
end
if timer>10 then
if r==0 then--условие убирания хвоста
table.remove(telo,1)--удаление последнего звена - т.е. хвоста
end
table.insert(telo,{x=telo[table.getn(telo)].x+n,y=telo[table.getn(telo)].y+m})--постановка нового звена
r=0--включение убирания хвоста
timer=0--обнуление таймера
end
if timer<6 then--мерцание пищи из-за того, что таймер не всегда меньше 6-ти
screen:blit(ex,ey,eda)
end
if telo[table.getn(telo)].x*10>=ex-1 and telo[table.getn(telo)].x*10<=ex+1 and telo[table.getn(telo)].y*10>=ey-1 and telo[table.getn(telo)].y*10<=ey+1 then--условие собирания пищи
r=1--отключение убирания хвоста
gen()--вызов функции, генерирующей пищу
end
for i=1, table.getn(telo) do
screen:blit(telo[i].x*10,telo[i].y*10, kub)--распечатка тела змеи из кубиков
if i<=table.getn(telo)-1 then--нам необходима только часть цикла, вплоть до i==table.getn(telo)-1
if telo[table.getn(telo)].x*10==telo[i].x*10 and telo[table.getn(telo)].y*10==telo[i].y*10 then--условие врезания в тело змеи
game=false
break
end
end
end
--система управления движением
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
screen:flip()
end--конец игрового цикла