使用Love2D引擎开发贪吃蛇游戏

今天来介绍博主最近捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧。今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章当中我们将会涉及到贪吃蛇的基本算法、Lua语言编程等基本的内容,希望能够对大家开发类似的游戏提供借鉴和思考,文章中如有不足之处,还希望大家能够谅解,因为博主的游戏开发基本就是这样慢慢摸索着学习,所以难免会有不足的地方。

游戏算法

我们首先来看看贪吃蛇是怎么移动的?

通过这四张图的演示,我们可以发现这样一个规律:

蛇的移动其实是将蛇身体的最后一个元素移动到第一个元素的位置

那么完成这样一个工作需要两个步骤:

1、将在蛇头位置插入一个新的元素

2、移除蛇尾位置的最后一个元素

好了,了解了蛇的移动后我们再来考虑一个问题,怎样判断蛇吃到了食物?思路和蛇的移动类似,主要考虑在蛇头插入的这个元素和食物的关系,如果这个元素的坐标和食物的坐标是相同的,那么就可以认为蛇吃到了食物,此时蛇的身体应该是变长的,所以只要在蛇头位置插入一个元素就可以了。反之,如果蛇没有吃到食物,那么蛇应该是移动的,所以就可以按照移动的方法来处理了。那么在蛇头位置插入的这个元素该如何确定呢?我们来看下面这段程序:

--计算下一个目标点
function getNextPoint()
  --计算下一个目标点
  snake={}
  if(dir==0) then
    snake.x=snakes[1].x
    snake.y=snakes[1].y-20
  end
  if(dir==1) then
    snake.x=snakes[1].x
    snake.y=snakes[1].y+20
  end
  if(dir==2) then
    snake.x=snakes[1].x-20
    snake.y=snakes[1].y
  end
  if(dir==3) then
    snake.x=snakes[1].x+20
    snake.y=snakes[1].y
  end

  return snake
end

这里定义了getNextPoint()的方法,目的是计算在蛇头位置添加的下一个元素,这里我们注意到根据蛇的移动方向(dir)的不同,其中0表示上、1表示下、2表示左、3表示右,计算出下一个元素的位置,因为在这个游戏中网格大小是20,所以这里可以直接根据坐标来计算一个元素的位置。snakes是一个table,保存的是当前的蛇的全部元素的坐标。通过维护这个table,我们就可以利用绘图的函数绘制出蛇的身体,这样蛇就可以移动起来了。我们来看看蛇是怎样移动的:

--核心算法——蛇的移动
function SnakeUpdate()
  --获取元素个数
  local n=table.maxn(snakes)
  if(table.maxn(snakes)>0) then
    if(getNextPoint().x==foodX and getNextPoint().y==foodY) then
      --将下一个目标点的位置插入表中
      table.insert(snakes, 1, getNextPoint())
      --将食物状态设置为BeEated
      foodState="BeEated"
    else
      --将下一个目标点的位置插入表中
      table.insert(snakes, 1, getNextPoint())
      --移除最后一个元素
      table.remove(snakes,n+1)
    end
  end
end

在这里我们定义了一个foodState变量以保存食物的状态,当食物的状态为BeEated的时候表示食物被蛇吃掉了,此时应该重新生成一个食物的坐标,此时事物的状态将变成WaitToEat。食物的坐标保存在foodX和foodY这两个变量中,大家可以到完整的代码中去查看。

我们知道蛇碰到四周墙壁的时候就会死亡,此时游戏结束。这个比较简单,只要判断蛇头的坐标和屏幕的关系就可以了。因为在这个游戏中屏幕的尺寸为640X640,所以判断游戏是否结束的代码可以这样写:

--判断游戏状态
  if(snakes[1].x<=0 or snakes[1].x>=640 or snakes[1].y<=0 or snakes[1].y>=640) then
    gameState=0
  else
    gameState=1
  end

这里gameState为0表示游戏结束,gameState为1表示游戏正常进行。

在完成了这些核心的算法以后,剩下的事情就交给Love2D引擎来绘制吧,最后给出完整的程序代码:

--定义窗口宽度和高度
local w=640
local h=640
--定义网格单元大小
local unitSize=20;

--方块的初始位置
local initX=320
local initY=320

--移动方向
local dir=1

--贪吃蛇集合
local snakes={}

--食物状态
--WaitToEat:绘制食物
--BeEated:随机生成食物
local foodState="WaitToEat"

--游戏状态
--0:游戏结束
--1:游戏正常
local gameState=1

--食物的位置
local foodX=0
local foodY=0

--Love2D加载事件
function love.load()
  --设置窗口标题
  love.window.setTitle("Love2D-贪吃蛇游戏")
  --设置窗口大小
  love.window.setMode(w,h)
  --定义字体
  myFont=love.graphics.newFont(30)
  --设置字体
  love.graphics.setFont(myFont)
  --设置背景色
  love.graphics.setBackgroundColor(255,255,255,255)
  --设置线条类型为平滑
  love.graphics.setLineStyle("smooth")
  --设置线宽
  love.graphics.setLineWidth(0.1)

  --蛇的初始化(蛇的长度为5)
  for i=1,5 do
    snake={}
    snake.x=initX +(i-1) * 20
    snake.y=initY
    snakes[i]=snake
  end

  --食物初始化
  foodX=love.math.random(32-1)*20
  foodY=love.math.random(32-1)*20
end

--Love2D绘制事件
function love.draw()
  --绘制竖线
  love.graphics.setColor(0,0,0,255)
  for i=0,w,unitSize do
    love.graphics.line(0,i,h,i)
  end
  --绘制横线
  for j=0,h,unitSize do
    love.graphics.line(j,0,j,w)
  end

  --绘制蛇
  for i=1,table.maxn(snakes) do
    love.graphics.setColor(0,0,255,255)
    love.graphics.rectangle("fill",snakes[i].x,snakes[i].y,20,20)
  end

  --绘制食物
  if(foodState=="WaitToEat") then
    love.graphics.setColor(255,0,0,255)
    love.graphics.rectangle("fill",foodX,foodY,20,20)
  end

  --如果游戏结束则显示GameOver
  if(gameState==0) then
    love.graphics.setColor(255,0,0,255)
    love.graphics.print("Game Over",250,300)
  end
end 

--
function love.update(dt)
  --判断游戏状态
  if(snakes[1].x<=0 or snakes[1].x>=640 or snakes[1].y<=0 or snakes[1].y>=640) then
    gameState=0
  else
    gameState=1
  end

  --如果游戏状态为正常
  if(gameState==1) then
    SnakeUpdate()
    FoodUpdate()
  end
end

--核心算法——蛇的移动
function SnakeUpdate()
  --获取元素个数
  local n=table.maxn(snakes)
  if(table.maxn(snakes)>0) then
    if(getNextPoint().x==foodX and getNextPoint().y==foodY) then
      --将下一个目标点的位置插入表中
      table.insert(snakes, 1, getNextPoint())
      --将食物状态设置为BeEated
      foodState="BeEated"
    else
      --将下一个目标点的位置插入表中
      table.insert(snakes, 1, getNextPoint())
      --移除最后一个元素
      table.remove(snakes,n+1)
    end
  end
end

--随机生成食物
function FoodUpdate()
  --如果食物被蛇吃掉则重新生成食物
  if(foodState=="BeEated") then
    foodX=love.math.random(32-1)*20
    foodY=love.math.random(32-1)*20
    foodState="WaitToEat"
   end
end

--根据玩家按下的键位定义不同的方向
function love.keypressed(key)
  if(key=="a" and dir~=3) then
    dir=2
  end
  if(key=="d" and dir~=2) then
    dir=3
  end
  if(key=="w" and dir~=1) then
    dir=0
  end
  if(key=="s" and dir~=0) then
    dir=1
  end
end

function getNextPoint()
  --计算下一个目标点
  snake={}
  if(dir==0) then
    snake.x=snakes[1].x
    snake.y=snakes[1].y-20
  end
  if(dir==1) then
    snake.x=snakes[1].x
    snake.y=snakes[1].y+20
  end
  if(dir==2) then
    snake.x=snakes[1].x-20
    snake.y=snakes[1].y
  end
  if(dir==3) then
    snake.x=snakes[1].x+20
    snake.y=snakes[1].y
  end

  return snake
end

将代码压缩成.love文件后就可以运行了,我们来看看最终的效果:

Github

时间: 2024-10-12 23:09:52

使用Love2D引擎开发贪吃蛇游戏的相关文章

Love2D游戏引擎制作贪吃蛇游戏

代码地址如下:http://www.demodashi.com/demo/15051.html Love2D游戏引擎制作贪吃蛇游戏 内附有linux下的makefile,windows下的生成方法请查看: for windows 预览游戏 love2d游戏引擎重要函数 详情: love2d wiki love.load:当游戏开始时被调用且仅调用一次 love.draw:回调函数,每帧更新一次游戏画面 love.update:回调函数,每帧更新一次游戏状态 love.keypressed:回调函

结对-开发贪吃蛇游戏-开发环境搭建过程

项目:贪吃蛇游戏开发 环境搭建: Mac下: 1)官网下载jkd1.8版本. 2)下载IDE--eclipse或Myeclipse win下: 1)官网下载JDK,找到符合自己电脑的版本,下载的本地 2)下载IDE--eclipse或Myeclipse 3)配置环境变量: i.计算机->属性->高级系统设置 ii.单击高级系统设置->环境变量在系统变量里面分别设置JAVA_HOME.CLASSPATH和Path iii.在系统变量里找变量名JAVA_HOME,如果没有就点击新建.输入变量

用Java开发贪吃蛇游戏

贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始提示:按空格键开始游戏 让蛇动起来:监听Timer事件,平移数据 实现游戏暂停 实现转向功能 Part 3: 添加食物 吃掉食物 添加死亡条件 实现“重新开始”功能 添加分数和长度 游戏图纸如下: 蛇及游戏框的素材如下:                              Snake主类: 1

Android快乐贪吃蛇游戏实战项目开发教程-01项目概述

一.项目简介贪吃蛇是一个很经典的游戏,也很适合用来学习.本教程将和大家一起做一个Android版的贪吃蛇游戏.我已经将做好的案例上传到了应用宝,大家可以下载下来把玩一下.为了和其它的贪吃蛇区别开来,我取名叫“快乐贪吃蛇”.应用宝链接:http://sj.qq.com/myapp/detail.htm?apkName=net.chengyujia.happysnake这里上两张截图先睹为快,哈哈.怎么玩大家应该都知道,不过我还是要多提一下.通过屏幕上的方向键控制蛇的前进方向.蛇每吃到一个食物身体会

WebGL实现HTML5的3D贪吃蛇游戏

js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围. 自己写不出来,站在巨人肩膀总是有机会吧,想起<基于HTML5的电信网管3D机房监控应用>这篇提到的threejs,babylonjs和Hightopo的几种基于WebGL的3D引擎,突然想挑战下自己实现个100行JS的3D小

贪吃蛇 游戏

结队作业  结队人 郑丁鹏(负责 (二)流程图和(四)游戏测试 ) 我负责 (二)游戏需求分析 与(三)游戏代码 贪吃蛇游戏程序设计 一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游

基于控制台实现贪吃蛇游戏

1).引言 学习编程,我个人觉得最好的办法就是根据自己的水平不断的给自己设定一个小目标.而这个小目标就是一个有意思的项目,通过完成这个项目,对自己的成果(也包括失败的)进行分析总结,从中提炼出对应的技术并分享出来,不断的往复,如此,为的就是让我们永远保持编写程序的兴趣和热情,完了,还提高我们的技术.而本文就是总结自己的一个小目标(基于控制台实现的贪吃蛇游戏而写的总结) 2).技术实现 大家小时候一定玩过贪吃蛇的游戏.贪吃蛇游戏的控制过程其实也不复杂.简单的可以概括为以下4个部分. 1.1  .组

贪吃蛇游戏程序设计

一.基本内容描述 运用java技术开发出贪吃蛇游戏,这个程序是用一个小矩形表示蛇的一节身体,身体每长一节,增加一个矩形块.移动时必须从蛇头开始,也就是蛇尾不能改作蛇头.当游戏者按了方向键后,蛇头朝着指定的方向移动,一步移动一节身体.图形的实现是从蛇头的新位置开始画出蛇.用户可以用上下左右键控制蛇头的方向,用空格键暂停或继续,非常简单! 可以实现如下功能: 贪吃蛇游戏是大家很常见的小游戏,在生活工作之余大家可以玩它,已达到放松各种压力的目的. 游戏可以进行升级,也就是增加吃食物的难度,以便使大家更

JS贪吃蛇游戏

<!DOCTYPE html><html> <head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <title>JS贪吃蛇游戏</title>    <style>    * {        margin: 0;