Суббота, 19.09.2020, 12:30 | Приветствую Вас Гость

"Змейка" - Часть 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
--конец игрового цикла

Навигация
Форма входа

Календарь
«  Сентябрь 2020  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
282930