function_update() if game_state=='running'then--如果当前状态为running,那么执行游戏运行的逻辑 game_running() elseif game_state=='init'then--如果当前状态为init,那么按下x开始游戏 if btnp(❎) then game_state='running' end else if btnp(❎) then--如果为over的话,按下x重置游戏,并将状态变为running _init() game_state='running' end end end
function_draw() cls() --清空屏幕 map() --绘制地图
if game_state == 'running'then--如果状态为running,那么绘制游戏执行的图像 game_draw() elseif game_state == 'init'then--如果状态为init,那么在屏幕中间打印提示 print("press ❎ to start", 33, 63) else print("score: "..score,48,53) --如果状态为over那么在屏幕中间打印分数和提示 print("press ❎ to restart", 30, 63) end end
--游戏运行中的绘制非常简单,只要遍历snake,并将蛇身的每一块都绘制在屏幕上,然后在对应的食物位置绘制食物即可 --绘制的时候对区块和像素做一下转换 pixel = block * 8 functiongame_draw() for i=1, #snake do spr(2,snake[i].x*8,snake[i].y*8) end spr(3,food_pos.x*8,food_pos.y*8) end
functiongame_running() frame+=1--每一帧都将帧数累计1 control_dir() --这个函数用于控制方向 --控制帧数 local speed = max(6,15 - flr(score/2)) if frame % speed == 0then --实际修改位移方向 限制掉头 if (dir_flag<=2) ~= (temp_dir_flag<=2) then dir_flag=temp_dir_flag end
--获取下一个位置的节点坐标,进行碰撞检测 local check_node = { x=snake[1].x+dir_offset[dir_flag].dx, y=snake[1].y+dir_offset[dir_flag].dy } check_collision(check_node.x,check_node.y) --移动snake move_snake() end end
functioncontrol_dir()--遍历方向数组,将每次按下对应的按钮就将方向赋值给temp_dir_flag for i=1,#dir_btn do if btnp(dir_btn[i]) then temp_dir_flag=i end end end
local col = mget(x,y) if fget(col) == 1then--如果对应区块上的0号灯是亮着的,那么表示碰撞到了墙壁 game_state='over'-- 游戏结束 end for i=2,#snake do--遍历蛇身 if x==snake[i].x and y==snake[i].y then--如果对应区块是蛇身的话,那么碰撞到了蛇身,游戏结束 game_state='over' end end end
functionmove_snake() local head = snake[1] --获取蛇头 local dir_use=dir_offset[dir_flag] --获取对应方向需要执行的坐标操作 local new_node = { --位移的目标位置 x=head.x+dir_use.dx, y=head.y+dir_use.dy }
add(snake,new_node,1) --将这个位置添加到蛇头
ifnot food_collsion() then--如果没有吃到食物,那么将snake数组最后一个位置删除 del(snake,snake[#snake]) else--如果吃到了食物,那么分数加1,并重新生成一个食物 score+=1 generate_food() end end
functionfood_collision()--食物碰撞检测,蛇头和食物点重合即可 return snake[1].x == food_pos.x and snake[1].y == food_pos.y end
functiongenerate_food() local node_list = generate_node_list() --获取可用节点的列表 food_pos = rnd(node_list) --从节点中随机获取一项,作为新食物产生的位置 end
functiongenerate_node_list() local node_list={} for i=1,14do--遍历长宽,最左边和最右边,最上边,最下边都是墙壁,排除 for j=1,14do local access = true--判断是否是蛇身 for x=1,#snake do if i==snake[x].x and j==snake[x].y then access = false end end if access then--如果不是蛇身,那么添加到可用节点列表中 add(node_list,{x=i,y=j}) end end end return node_list end