love 2d Lua 俄罗斯方块超详细教程
源码已经更新在CSDN的码库里:
git clone https://gitcode.com/funsion/love2d-game.git
一直在找Lua 能快速便捷实现图形界面的软件,找了一堆,终于发现love2d是小而美的原生lua图形界面实现的方式。
并参考相关教程做了一个更详细的,以便入门。
功能如上图,
开发过程用了love2d, 不大哦,直接Win下解压可以用的。这是跑程序用的。需要改一下Win的环境变量。
另外用了一个Love2D Editor,写代码用的,也很小,直接Win下解压可以用的。自己发个快捷方式到桌面即可。
已更新安装教程。请关注,love 2d win 下超简单安装方式,学习Lua 中文编程 刚需!!
再结合我们之前的Lua 中文入门教程,我相信,写起来,用起来。真的其实代码就像注释一样明了。
七个方块集合
-- 定义一个块的集合,每个块由多个二维数组表示
方块组={{{0,1,1},{1,1,0}},{{1,1,0},{0,1,1}},{{1,1,1},{0,0,1}},{{1,1,1},{1,0,0}},{{1,1,1},{0,1,0}},{{1,1},{1,1}},{{1,1,1,1}}}
{{0,1,1},{1,1,0}} | {{1,1,0},{0,1,1}} | {{1,1,1},{0,0,1}} |
{{1,1,1},{1,0,0}} | {{1,1,1},{0,1,0} | {{1,1},{1,1}} |
{{1,1,1,1}} | ||
10列22行的游戏地图
初始化一个空的字段数组,用于游戏地图。
像一个10列(10个格子),22行(22个格子)的空格子。如左下图。
主体格子={}
主体格子={}
for i=1,22 do主体格子[i]={0,0,0,0,0,0,0,0,0,0}
end
初始化当前方块
随机选择一个块,初始化块的位置,坐标系在左下角,4,19,分别为第4列,第19行。
math.random()是随机数,取值范围1到7。即对应上方介绍过的7种方块组的图案。为什么是19行,如右上图中所示。刚好是4个竖向方格出现时能全显。
同样的4列也是这个原因,并且显示居中。
当前方块,方块X坐标,方块Y坐标 = 方块组[math.random(7)],4,19
检测方块是否与现有的游戏地图重叠
先检查是否超边界
@当前方块: 要检测的块,
@方块x坐标: 方块的起始x坐标,
@方块y坐标: 方块的起始y坐标
返回值: 如果有重叠返回true(真),否则返回false(假)。
如下图,我们用一个田字方块做检查,红色空框代表当前位置,黄色实心框代表返回的位置。
左边红色空框位置如果超界,就会横坐标+1格变成黄色实心框,如箭头方向回到游戏地图内。
右边红色空框位置如果超界,就会横坐标-1格变成黄色实心框,如箭头方向回到游戏地图内。
下边红色空框位置如果超界,就会纵坐标+1格变成黄色实心框,如箭头方向回到游戏地图内。
检查块是否放置在边界之外
“当前方块[1]” 是方块的宽度
如果 “方块x坐标” 超出边界(横向小于1个格或者大于11格),
或者 “方块y坐标” 超出边界,
则 返回 “true”(真)
下面是检查的代码:
if 方块x坐标 < 1 or 方块x坐标+#当前方块[1] > 11 or 方块y坐标 < 1 then --当前方块[1]是方块的宽度return truereturn trueend
检查是否与游戏地图 “主体格子” 现存的方块重叠。
假如你的游戏地图如左下图,蓝色的是 “主体格子” 现存的方块。
遍历 “当前方块” 的每个元素,检查是否与 “主体格子” 现存的方块重叠
主体格子[方块y坐标+i-1] 即在游戏地图上 “主体格子”与对应“当前方块”y坐标的位置,是否现存的方块格子。
当前方块[i][j]即 “当前方块” 的二唯表格位置里的数据,
如果大于0,则表示是“主体格子”在当前位置不是空位,即现存的方块与 “当前方块” 相交。
如右下图红框与蓝色的 “主体格子” 相交,“当前方块”就会按箭头位置复位成黄色块相应的位置。
代码如下:
for i=1,#当前方块 do -- 遍历块的每一行,即高度for j=1,#当前方块[1] do -- 遍历块的每一列,即宽度if 主体格子[方块y坐标+i-1] and 当前方块[i][j] > 0 and 主体格子[方块y坐标+i-1][方块x坐标+j-1] > 0 thenreturn trueendendend
下落过程函数
此函数用于处理方块的下落过程,包括方块位置的更新、方块与底部或其它方块的碰撞检测、以及消除满行等逻辑。
1、尝试将当前方块下落一行
2、检测当前方块是否与底部或其它方块发生重叠
2.1 如果发生重叠,则将 “当前方块” 位置回退到重叠之前
2.2 如果没有重叠,将 “当前方块” 的形状数据复制到游戏场地即“主体格子”内
2.2.1 遍历“当前方块”的每一行
2.2.2 遍历“当前方块”的每一列
2.2.3 如果“当前方块”的形状数据在这个位置不为空,则将其复制到游戏场地即“主体格子”内
3、检查并消除满行
4、生成新的随机方块,设置其初始位置
代码如下:
function drop()方块Y坐标 = 方块Y坐标 - 1 -- 尝试将当前方块下落一行-- 检测当前方块是否与底部或其它方块发生重叠if 检查重叠(当前方块, 方块X坐标, 方块Y坐标) then方块Y坐标 = 方块Y坐标 + 1 -- 如果发生重叠,则将方块位置回退到重叠之前-- 将当前方块的形状数据复制到游戏场地上for i = 1, #当前方块 do -- 遍历方块的每一行for j = 1, #当前方块[1] do -- 遍历方块的每一列if 当前方块[i][j] ~= 0 then -- 如果方块元素不为空,则将其复制到游戏场地上主体格子[方块Y坐标 + i - 1][方块X坐标 + j - 1] = 1endendend-- 检查并消除满行for i = 方块Y坐标 + #当前方块 - 1, 方块Y坐标, -1 dolocal ct = 0 -- 用于统计当前行是否全满的计数器for j = 1, 10 doct = ct + 主体格子[i][j]endif ct == 10 thentable.remove(主体格子, i) -- 移除满行table.insert(主体格子, {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}) -- 在场地上方补充一行空行endend-- 生成新的随机方块,设置其初始位置当前方块, 方块X坐标, 方块Y坐标 = 方块组[math.random(7)], 4, 19end
end
按键事件处理函数
参数: i: 用户按下的键名(例如"left", "right", "up", "down"等)
处理左键按下事件:方块向左移动一格,并检查重叠,如果不重叠,即会更新“当前方块”的位置。
处理右键按下事件:方块向右移动一格,并检查重叠,如果不重叠,即会更新“当前方块”的位置
处理上键按下事件:方块旋转,构建旋转矩阵,若无重叠,则使用旋转后的方块数组为 “当前方块”。
处理下键按下事件:方块加速下落,不断执行下落操作,直到 “当前方块” Y坐标 = 19。
-- 按键事件处理函数
-- 参数:
-- i: 用户按下的键名(例如"left", "right", "up", "down"等)
function love.keypressed(i)-- 处理左键按下事件:方块向左移动,并检查重叠,如果不重叠,即会更新“当前方块”的位置if i=="left" then if not 检查重叠(当前方块,方块X坐标-1,方块Y坐标) then方块X坐标=方块X坐标-1end-- 处理右键按下事件:方块向右移动,并检查重叠,如果不重叠,即会更新“当前方块”的位置elseif i=="right" then if not 检查重叠(当前方块,方块X坐标+1,方块Y坐标) then方块X坐标=方块X坐标+1end-- 处理上键按下事件:方块旋转,elseif i== "up" then local m={} -- 创建用于存储旋转后方块的新数组for i=1,#当前方块[1] do -- 构建旋转矩阵m[i]={}for j=1,#当前方块 dom[i][j] = 当前方块[j][#当前方块[1]+1-i]endendif not 检查重叠(m,方块X坐标,方块Y坐标) then当前方块=m -- 若无重叠,则使用旋转后的方块数组end-- 处理下键按下事件:方块加速下落elseif i=="down" thenrepeat drop() -- 不断执行下落操作until 方块Y坐标==19 --这里执行效果不高,没做判断,应该有多余的循环次数。但结果是符合的。end
end
引擎主循环函数
在Love引擎启动的时候就会调用love.run,这里程序里需要一个非默认的,所以要自己写一个functionlove.run()-引擎工作函数,
love的run函数重写可以重用。重点哦。
1、初始化计时器
2、设置颜色为红色
3、返回一个游戏循环函数
3.1、处理事件队列
3.2、遍历并处理所有事件,name,a,b,c,d,e,f 是什么呢,要去查一下love.event.poll()的定义去。
3.3、检查是否需要进行下落操作,.6是什么呢,要去查一下love.timer.getTime()的定义去。
3.4、清空画布
3.5、绘制场地
3.6、绘制下落的方块
3.7、更新屏幕显示
然后会再次循环3的步骤。
代码如下:
-- 引擎主循环函数
-- 在Love引擎启动的时候就会调用love.run,这里程序里需要一个非默认的,所以要自己写一个functionlove.run()-引擎工作函数,
-- 重写可以重用。重点哦。
function love.run() -- 初始化计时器flag = love.timer.getTime() -- 设置画笔颜色为红色love.graphics.setColor(255,0,0) -- 返回一个游戏循环函数return function() -- 处理事件队列love.event.pump() -- 遍历并处理所有事件,name,a,b,c,d,e,f 是什么呢,要去查一下love.event.poll()的定义去。for name,a,b,c,d,e,f in love.event.poll() do-- 如果事件为退出,则终止游戏循环if name=="quit" then return 0 end-- 调用相应的事件处理函数love.handlers[name](a,b,c,d,e,f)end-- 检查是否需要进行下落操作,.6是什么呢,要去查一下love.timer.getTime()的定义去。if love.timer.getTime()-flag >.6 then -- 执行下落逻辑 drop()-- 重置计时器flag=love.timer.getTime()end-- 清空画布love.graphics.clear(255,255,255) -- 绘制场地for j=1,20 dofor i=1,10 doif 主体格子[j][i]==1 then--这里的40是相素值,-39是偏移量,因为坐标原点在左上角,而方块的左上角在左下角,所以要偏移。--这是一个方块的左上角坐标love.graphics.rectangle("fill",40*i-39,801-40*j,38,38)endendend -- 绘制下落的方块for j=1,#当前方块 dofor i=1,#当前方块[1]doif 当前方块[j][i]==1 thenlove.graphics.rectangle("fill",40*(i+方块X坐标-1)-39,801-40*(j+方块Y坐标-1),38,38)endendend -- 更新屏幕显示love.graphics.present() end
end
引用了这位大玩家MrZ_26的bili教程。
59行代码实现俄罗斯方块(lua&love2d)
<iframe src="//player.bilibili.com/player.html?aid=59385769&bvid=BV14t411G7uS&cid=103480280&p=1" scrolling="no" border="0" frameborder="no" framespacing="0" allowfullscreen="true"> </iframe>
相关文章:
love 2d Lua 俄罗斯方块超详细教程
源码已经更新在CSDN的码库里: git clone https://gitcode.com/funsion/love2d-game.git 一直在找Lua 能快速便捷实现图形界面的软件,找了一堆,终于发现love2d是小而美的原生lua图形界面实现的方式。 并参考相关教程做了一个更详细的&#x…...
SpringBoot+ElasticSearch实现文档内容抽取、高亮分词、全文检索
需求 产品希望我们这边能够实现用户上传PDF、WORD、TXT之内得文本内容,然后用户可以根据附件名称或文件内容模糊查询文件信息,并可以在线查看文件内容。 一、环境 项目开发环境: 后台管理系统springbootmybatis_plusmysqles 搜索引擎&#…...
利用Redis实现简单的短信登录
在现代应用中,短信登录是一种常见的用户认证方式。它提供了一种便捷的登录方式,同时也增加了账户的安全性。在本文中,我们将介绍如何使用 Redis 实现短信登录的功能,并提供相应的 Java 实现层代码。 1、短信验证码的生成与存储当用…...
在 Linux 中通过 SSH 执行远程命令时,无法自动加载环境变量(已解决)
问题场景 目前我的环境变量都存储在 /etc/profile 文件中,当我通过远程 SSH 执行一些命令时,提示命令找不到,如下所示: 问题出现原因 这里找到了一张出自尚硅谷的图片,很好的解释了该问题: 这是由于 Linu…...
c++使用类的一些注意事项
前言: 本篇内容为前面的补充,介绍了我们使用类时需要注意些什么以及一些编译器的优化,可能有些理解不到位或者错误,请斧正。 目录 前言: 1.再谈构造函数 2.(c98)隐式类型转换中的编译器的优…...
C++蓝桥考级一级到十八级的考点内容整理
以下是C蓝桥考级一级到十八级的考点内容整理: C一级考点内容 C程序基本结构 初步了解C编程了解C程序基本结构:头文件、命名空间、主函数、基本输入输出 cin、cout C二级考点内容 数据类型与变量 掌握编程中数学表达式的计算方式基础数据类型、变量的…...
C++智能指针简单剖析
导读 最近在补看《C Primer Plus》第六版,这的确是本好书,其中关于智能指针的章节解析的非常清晰,一解我以前的多处困惑。C面试过程中,很多面试官都喜欢问智能指针相关的问题,比如你知道哪些智能指针?shar…...
mysql笔记:25. docker环境中mysql主从复制、主主复制实操
文章目录 一、准备工作1. 安装配置Docker2. 准备MySQL相关的配置和数据目录 二、基于日志点的主从复制1. 配置Master服务器1.1 修改配置文件1.2. 在docker中启动Master节点1.3. 创建用户并授权 2. 配置Slave1服务器2.1. 修改配置2.2. 启动服务2.3. 指定Master2.4. 开始复制 3. …...
大数据面试专题 -- kafka
1、什么是消息队列? 是一个用于存放数据的组件,用于系统之间或者是模块之间的消息传递。 2、消息队列的应用场景? 主要是用于模块之间的解耦合、异步处理、日志处理、流量削峰 3、什么是kafka? kafka是一种基于订阅发布模式的…...
深度学习入门简单实现一个神经网络
实现一个三层神经网络 引言测试数据 代码 引言 今天我们实现一个简单的神经网络 俩个输入神经元 隐藏层两个神经元 一个输出神经元 激活函数我们使用sigmoid 优化方法使用梯度下降 我们前期准备是需要把这些神经元的关系理清楚 x1:第一个输入 x2:第二个…...
win11 环境配置 之 Jmeter(JDK17版本)
一、安装 JDK 1. 安装 jdk 截至当前最新时间: 2024.3.27 jdk最新的版本 是 官网下载地址: https://www.oracle.com/java/technologies/downloads/ 建议下载 jdk17 另存为到该电脑的 D 盘下,新建jdk文件夹 开始安装到 jdk 文件夹下 2. 配…...
Windows下载使用nc(netcat)命令
‘nc’ 不是内部或外部命令,也不是可运行的程序? 点击链接地址,下载压缩包。 完成后解压 使用方式(三种): 1、直接双击exe使用 2、把这个exe放到cmd启动的默认路径下 放到默认路径下,使用nc&a…...
istio 设置 istio-proxy sidecar 的 resource 的 limit 和 request
方式一 修改 configmap 查看当前 sidecar 的 cpu 和 memory 的配额 在 istio-sidecar-injector 中查找,修改后重启 pod 可以生效(下面那个 proxy_init 配置不管,不知道是干嘛的) 方式二 如果是通过 iop 安装的 istio…...
flutter弹框
alertDialog:弹框 simpleDialog:选择弹框 showModalBottomSheet:底部弹出弹框 showtoast:三方插件弹框 Navigator.of(context).pop(点击取消) 关闭弹框,传递参数 import package:flutter/material.dart; // import package:flutter/cupertino.dart; import package:flut…...
2013年认证杯SPSSPRO杯数学建模B题(第一阶段)流行音乐发展简史全过程文档及程序
2013年认证杯SPSSPRO杯数学建模 B题 流行音乐发展简史 原题再现: 随着互联网的发展,流行音乐的主要传播媒介从传统的电台和唱片逐渐过渡到网络下载和网络电台等。网络电台需要根据收听者的已知喜好,自动推荐并播放其它音乐。由于每个人喜好…...
代码随想录算法训练营第39天 | 62.不同路径, 63不同路径II
Leetcode - 62:不同路径 题目: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” &#…...
Redis 的慢日志
Redis 的慢日志 Redis 的慢日志(Slow Log)是用于记录执行时间超过预设阈值的命令请求的系统。慢日志可以帮助运维人员和开发人员识别潜在的性能瓶颈,定位那些可能导致 Redis 性能下降或响应延迟的慢查询。以下是 Redis 慢日志的相关细节&…...
第十四届蓝桥杯第十题:蜗牛分享
问题描述 输入格式 输出格式 输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。 样例输入 3 1 10 11 1 1 2 1样例输出 4.20样例说明 蜗牛路线:(0,0)→(1,0)→(1,1)→(10,1)→(10,0)→(11,0)(0,0)→(1,0)→(1,1)→(10,1…...
不懂技术的老板,如何避免过度依赖核心技术人员
在这个日新月异、技术驱动的时代,即使作为非技术背景的老板,也深知核心技术人员的价值。然而,过度依赖某几位核心技术人员,不仅可能带来经营风险,还可能限制企业的创新与发展。那么,不懂技术的老板…...
Vue系列-el挂载
<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>el:挂载点</title> </head> <body&g…...
python--os和os.path模块
>>> import os >>> #curdir #获取当前脚本的绝对路径 >>> os.curdir . >>> import os.path >>> #获取绝对路径 >>> os.path.abspath(os.curdir) C:\\Users\\GUOGUO>>> #chdir #修改当前目录 >&g…...
前端通用命名规范和Vue项目命名规范
通用命名规范 变量和常量命名:变量和常量的命名应具有描述性,清晰明了,使用驼峰命名法或下划线命名法,例如:firstName、MAX_VALUE。 函数和方法命名:函数和方法的命名应该能够准确描述其功能&…...
NTP服务搭建
一、ntpd和ntpdate区别 1.ntpd是自动执行的远程更新本地系统时钟的服务,是平滑同步; 2.ntpdate是手工执行的服务,也就是一般用它执行一次本地时间更新,如果做成半自动,可以写入到crontab自动任务,从而变成…...
Linux离线安装mysql,node,forever
PS:本文是基于centos7实现的,要求系统能够查看ifconfig和unzip解压命令, 实现无网络可安装运行 首先现在百度网盘的离线文件包****安装Xftp 和 Xshell 把机房压缩包传到 home目录下****解压unzip 包名.zip 获取IP先获取到 linux 主机的ip ifconfig Xftp 连接输入IP,然后按照…...
WPF中获取TreeView以及ListView获取其本身滚动条进行滚动
实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) TreeView:TreeViewAutomationPeer lvap new TreeViewAutomationPeer(treeView); var svap lvap.GetPattern(PatternInterface.Scroll) as ScrollViewerAutomationPeer; var scroll svap.Owner as ScrollVie…...
C语言: 指针讲解
为什么需要指针? (1)指针的使用使得不同区域的代码可以轻易的共享内存数据。当然你也可以通过数据的复制达到相同的效果,但是这样往往效率不太好,因为诸如结构体等大型数据,占用的字节数多,复制很消耗性能…...
C#使用Stopwatch类来实现计时功能
前言 在 C# 中,Stopwatch 类是用于测量经过的时间的工具类,提供了高精度的计时功能。Stopwatch 类位于 System.Diagnostics 命名空间中。通常情况下,使用 Stopwatch 的流程是创建一个 Stopwatch 对象,然后调用 Start 方法开始计时…...
ubuntu18.04安装qt
ubuntu18.04安装qt 1、下载文件 比如我下载的是5.13.0版本 下载链接 2、安装 wget https://download.qt.io/archive/qt/5.13/5.13.0/qt-opensource-linux-x64-5.13.0.runsudo chmod x qt-opensource-linux-x64-5.13.0.runsudo ./qt-opensource-linux-x64-5.13.0.run参考文…...
ElasticSearch、java的四大内置函数式接口、Stream流、parallelStream背后的技术、Optional类
第四周笔记 一、ElasticSearch 1.安装 apt-get install lrzsz adduser -m es 创建用户组: useradd *-m* xiaoming(用户名) *PS:追加参数-m* passwd xiaoming(用户名) passwd xiaoming 输入新的 UNIX 密码: 重新输入新的 UNIX 密码&…...
深入MNN:开源深度学习框架的介绍、安装与编译指南
引言 在人工智能的世界里,深度学习框架的选择对于研究和应用的进展至关重要。MNN,作为一个轻量级、高效率的深度学习框架,近年来受到了众多开发者和研究人员的青睐。它由阿里巴巴集团开源,专为移动端设备设计,支持跨平…...
app开发方式/宁波seo网络推广推荐
希望自己能够通过对本课程的学习,对C语言能有进一步的了解,能够学会自主运用,学习到经验技术和知识,也希望老师能够在学习新知识时多讲解多运用,反复练习,以增加学生对新知识的熟练度和理解度。转载于:http…...
wordpress图片上传失败/网址推广
目录传送门:《Flutter快速上手指南》先导篇在 Dart 中,仅使用 int 和 double 两种数据类型来表示整数和浮点数。int不同于 Java 等语言,在 Dart 中,int 的取值范围是 -2^63 ~ 2^63 - 1 。var x 1; var hex 0xDEADBEE…...
如何设定旅游网站seo核心关键词/谷歌建站
Visual Studio 2015 Pre的到来,揭开了C#第6个版本的面纱,带来了更好的特性和更人性化的功能。 1、集合初始化 记得刚开始时,集合这样初始化的: 后来,还可以这样: 新的C#以后,就可以这样…...
口碑营销的策略技巧/seo是搜索引擎营销吗
yum -y install screen screen -S lnmp 记录session会话 ssh客户端中断再连接后 screen -r lnmp 恢复会话转载于:https://blog.51cto.com/kongdq/967746...
网站后台运营怎么做/今天的头条新闻
3月25日 周日去练了半天滑翔机,四块电池,慢速飞,重点是做动作和通场。一切顺利。3月26日,单位有事,暂停一天。3月27日,练习一天。上午去了看了看口试题目,回忆了下,想不起来的翻了翻…...
直销网站建设公司/seo流量是什么
基于随机的共识共识是一种强大的方法,可以产生强有力的支持和决策的共享所有权。 但是应用可能会很困难,如果使用不当,则会产生中等的结果。 这篇文章可帮助您利用共识来做出成功的产品决策。 它说明了何时以及如何使用它,并讨论了…...