本帖最后由 00ll00 于 2019-8-4 21:44 编辑
复制代码
点击[Start]就能愉快地玩俄罗斯方块了
送给俄罗斯方块爱好者以及穷举爱好者

■■■■
简介:
tellraw俄罗斯方块就是tellraw俄罗斯方块啊,没啥好介的...先上视频吧
https://www.bilibili.com/video/av48896911/
总之是仿照着比较经典的俄罗斯方块来做的。
旋转规则是参照TGM(俄罗斯方块大师)做的。
实现了踢墙旋转。
一次性消掉多行的话会有额外的分数奖励。
同时游戏难度会随着分数的增加而增大。
难度主要体现在方块的下落速度上。次要是体现在燃烧的CPU上
若方块堆到了天上,不能放置出新的方块,则游戏结束。
■■■■
玩法:
正确安装好数据包并reload好你的地图后,输入
就能加载并显示界面

点击[Start]就能愉快地玩俄罗斯方块了
三列操作按钮对应[左移][旋转][右移](每个按钮有三行是为了在电脑卡顿,聊天栏刷新发生抖动时也能点到)

知道了这些,你就可以打开MC放好数据包开始玩了
如果你的电脑完全带不动这个配置的俄罗斯方块的话,见第二页
[后排度盘链接]密码为ul44
附件py脚本:
你会发现链接里还有一个py脚本
这个脚本就是万恶之源,所有的function文件都是这个脚本生成的你可以在py脚本的前几行修改一些基本的游戏参数

如果电脑带不动经典配置的话可以把w值改小,然后运行脚本并reload
(卡顿的主要原因是使用了巨量的穷举,穷举的量与w呈指数关系,所以一般来说将w改小一丢丢就能正常运行了)
部分原理:
0.开始前的说明
由于function文件中充满了穷举的气息,直接查看不方便
建议打开链接中附赠的py脚本对照着理解
下文中蓝色粗体代表的是函数名称,后面方括号中的为py脚本对应行号
1.方块移动、旋转
下落中的方块由如下计分项控制:
x:下落方块的中心横坐标
y:下落方块的中心纵坐标
t:下落方块的类型
r:下落方块的旋转
注意到每种形状的方块都是由4个小块(以下称为点)构成,于是对每个点有:
pnx:点的横坐标
pny:点的纵坐标
其中n为点编号,1~4
在方块运动的操作过程中,直接改变的变量为x、y、r,在每次刷新显示之前通过函数draw[299]计算出每个点的坐标
计算流程为先将pnx,pny赋值为x,y,然后通过穷举t,r对每个点进行偏移
以画T型块未旋转的样子(r=1)为例,function为
p2的位置正好在中心点上,所以没有进行偏移,此时p1~4均在中心点上:






p1向左偏移一格:






p3向下偏移一格:






p4向右偏移一格:






于是一个T型块就画出来了






2.碰撞判定、方块落地、满行消行
在上述操作后,我们已经得到了每个点的位置,但是这仅仅是下落中的方块的位置,进行碰撞判定我们还需要知道已落地的方块和边界墙的位置
引入新的变量:
ln1~20:行储存变量
行储存变量储存着每一行的落地方块数据。
由于在碰撞判定上墙与落地方块的表现是一样的,所以储存方式相同。
(区别在于墙是固定存在的,不在穷举范围内,墙的样式不同是在之后的print函数内单独处理)
储存变量数据的含义:
举个例子,如果ln1的值为1025,则代表第一行为
■□□□□□□□□□■就是两个边界墙
不难理解,1025(10)=100 0000 0001?(2),将每一行有方块的地方视为1,反之则反之,就得到了相应的ln的值
再次强调下落中的方块并不在这里储存
现在可以进行碰撞判断了
如图,现在有一个T型块正准备下落

在下移函数moved[614]进行y--操作之前会调用函数testd[543],即测试下方的函数进行阻力的计算
这个函数会对每个点所在行的下一行的对应位置进行取位运算getbit[268],然后把所有的取位结果相加
就上图中的T块,他最下方的点的下一行数据为4095(10)=11111 1111111(2),取出第5位为"1";其余的三个点均进行这番操作,不过他们下面并没有阻碍,所以阻力为"0";于是整个方块向下的阻力为"1" 这里的二进制高低位好像是反过来的,不过有什么关系呢
阻力不为0,所以不允许下移,并且放置当前方块setb[627],即把当前的下落中的方块的数据算出2次幂后加和到相应的ln中,成为落地方块此时调用clr[660]消行函数对每一行进行检测,若有某一行已堆满,则消除该行(依次将上面行的值赋与本行,首行置为空)
然后再调用newb[643]生成一个新的下落方块
左右移动、旋转的原理类似左移movl[594],右移movr[603],旋转rot[559]
注:旋转中为了实现踢墙旋转稍微做了些手脚
3.tellraw显示
tellraw显示的核心原理为穷举 不穷举你会变得更强吗
对每一行(底部的墙除外)的所有可能全部列出,什么分值就输出什么图像
为了使下落中的方块与已落地的方块同时显示,引入变量:
dln1~20:行显示变量,数据含义与ln相同
在显示函数print[148]执行中会先计算出每一行的dln,然后再穷举
为了实现下一块的预告,同时不增加穷举的负担,预告的信息使用了指向一个实体名字的nbt组件,这样在tellraw的JSON文本中他就固定了,只需要在tellraw的前一刻summon出相应的实体,tellraw出的文本就是那个实体的名字。举个例子:
先召唤一个测试用的盔甲架
然后用以下命令tellraw盔甲架的名字 注:此处一定要有"interpret":"true",不然tellraw不会解析JSON的内容而视为文本进行输出

然后修改一下盔甲架的名字
用第二个命令再次进行tellraw

理论上是可以用这个方法来实现彩色俄罗斯方块的,但是本人没有想出处理速度较快的方法。
(测试时几乎以肉眼可辨的速度输出的每一行,完全不能接受)
调试时的一些实用命令:
几个月前做的东西,发论坛试试水
送给俄罗斯方块爱好者
以及穷举爱好者
■■■■
简介:
tellraw俄罗斯方块就是tellraw俄罗斯方块啊,没啥好介的...先上视频吧
总之是仿照着比较经典的俄罗斯方块来做的。
旋转规则是参照TGM(俄罗斯方块大师)做的。
实现了踢墙旋转。
一次性消掉多行的话会有额外的分数奖励。
同时游戏难度会随着分数的增加而增大。
难度主要体现在方块的下落速度上。次要是体现在燃烧的CPU上
若方块堆到了天上,不能放置出新的方块,则游戏结束。
■■■■
玩法:
正确安装好数据包并reload好你的地图后,输入
- /function tetris:load
就能加载并显示界面
点击[Start]就能愉快地玩俄罗斯方块了
三列操作按钮对应[左移][旋转][右移](每个按钮有三行是为了在电脑卡顿,聊天栏刷新发生抖动时也能点到)
知道了这些,你就可以打开MC放好数据包开始玩了
如果你的电脑完全带不动这个配置的俄罗斯方块的话,见第二页
- 第二页 附件py脚本的说明
- 第三页 部分原理的详解
- 第四页 调试时的实用命令
2021.12 数据,可能有更多内容
几个月前做的东西,发论坛试试水送给俄罗斯方块爱好者以及穷举爱好者

■■■■
简介:
tellraw俄罗斯方块就是tellraw俄罗斯方块啊,没啥好介的...先上视频吧
https://www.bilibili.com/video/av48896911/
总之是仿照着比较经典的俄罗斯方块来做的。
旋转规则是参照TGM(俄罗斯方块大师)做的。
实现了踢墙旋转。
一次性消掉多行的话会有额外的分数奖励。
同时游戏难度会随着分数的增加而增大。
难度主要体现在方块的下落速度上。次要是体现在燃烧的CPU上
若方块堆到了天上,不能放置出新的方块,则游戏结束。
■■■■
玩法:
正确安装好数据包并reload好你的地图后,输入
代码:
- /function tetris:load
就能加载并显示界面

点击[Start]就能愉快地玩俄罗斯方块了
三列操作按钮对应[左移][旋转][右移](每个按钮有三行是为了在电脑卡顿,聊天栏刷新发生抖动时也能点到)

知道了这些,你就可以打开MC放好数据包开始玩了
如果你的电脑完全带不动这个配置的俄罗斯方块的话,见第二页
[后排度盘链接]密码为ul44
- 第二页附件py脚本的说明
- 第三页部分原理的详解
- 第四页调试时的实用命令
附件py脚本:
你会发现链接里还有一个py脚本
这个脚本就是万恶之源,所有的function文件都是这个脚本生成的你可以在py脚本的前几行修改一些基本的游戏参数

如果电脑带不动经典配置的话可以把w值改小,然后运行脚本并reload
(卡顿的主要原因是使用了巨量的穷举,穷举的量与w呈指数关系,所以一般来说将w改小一丢丢就能正常运行了)
部分原理:
0.开始前的说明
由于function文件中充满了穷举的气息,直接查看不方便
建议打开链接中附赠的py脚本对照着理解
下文中蓝色粗体代表的是函数名称,后面方括号中的为py脚本对应行号
1.方块移动、旋转
下落中的方块由如下计分项控制:
x:下落方块的中心横坐标
y:下落方块的中心纵坐标
t:下落方块的类型
r:下落方块的旋转
注意到每种形状的方块都是由4个小块(以下称为点)构成,于是对每个点有:
pnx:点的横坐标
pny:点的纵坐标
其中n为点编号,1~4
在方块运动的操作过程中,直接改变的变量为x、y、r,在每次刷新显示之前通过函数draw[299]计算出每个点的坐标
计算流程为先将pnx,pny赋值为x,y,然后通过穷举t,r对每个点进行偏移
以画T型块未旋转的样子(r=1)为例,function为
代码:
- execute if score @p r matches 1 run scoreboard players remove @p p1x 1
- execute if score @p r matches 1 run scoreboard players add @p p3y 1
- execute if score @p r matches 1 run scoreboard players add @p p4x 1






p1向左偏移一格:






p3向下偏移一格:






p4向右偏移一格:






于是一个T型块就画出来了






2.碰撞判定、方块落地、满行消行
在上述操作后,我们已经得到了每个点的位置,但是这仅仅是下落中的方块的位置,进行碰撞判定我们还需要知道已落地的方块和边界墙的位置
引入新的变量:
ln1~20:行储存变量
行储存变量储存着每一行的落地方块数据。
由于在碰撞判定上墙与落地方块的表现是一样的,所以储存方式相同。
(区别在于墙是固定存在的,不在穷举范围内,墙的样式不同是在之后的print函数内单独处理)
储存变量数据的含义:
举个例子,如果ln1的值为1025,则代表第一行为
■□□□□□□□□□■就是两个边界墙
不难理解,1025(10)=100 0000 0001?(2),将每一行有方块的地方视为1,反之则反之,就得到了相应的ln的值
再次强调下落中的方块并不在这里储存
现在可以进行碰撞判断了
如图,现在有一个T型块正准备下落

在下移函数moved[614]进行y--操作之前会调用函数testd[543],即测试下方的函数进行阻力的计算
这个函数会对每个点所在行的下一行的对应位置进行取位运算getbit[268],然后把所有的取位结果相加
就上图中的T块,他最下方的点的下一行数据为4095(10)=1111
阻力不为0,所以不允许下移,并且放置当前方块setb[627],即把当前的下落中的方块的数据算出2次幂后加和到相应的ln中,成为落地方块此时调用clr[660]消行函数对每一行进行检测,若有某一行已堆满,则消除该行(依次将上面行的值赋与本行,首行置为空)
然后再调用newb[643]生成一个新的下落方块
左右移动、旋转的原理类似左移movl[594],右移movr[603],旋转rot[559]
注:旋转中为了实现踢墙旋转稍微做了些手脚
3.tellraw显示
tellraw显示的核心原理为穷举 不穷举你会变得更强吗
对每一行(底部的墙除外)的所有可能全部列出,什么分值就输出什么图像
为了使下落中的方块与已落地的方块同时显示,引入变量:
dln1~20:行显示变量,数据含义与ln相同
在显示函数print[148]执行中会先计算出每一行的dln,然后再穷举
为了实现下一块的预告,同时不增加穷举的负担,预告的信息使用了指向一个实体名字的nbt组件,这样在tellraw的JSON文本中他就固定了,只需要在tellraw的前一刻summon出相应的实体,tellraw出的文本就是那个实体的名字。举个例子:
先召唤一个测试用的盔甲架
代码:
- /summon minecraft:armor_stand ~ ~ ~ {CustomName:'{"text":"123","color":"red"}',CustomNameVisible:1,Tags:["nbttest"]}
代码:
- /tellraw @p {"nbt": "CustomName", "entity":"@e[tag=nbttest,limit=1]","interpret":"true"}

然后修改一下盔甲架的名字
代码:
- /data merge entity @e[tag=nbttest,limit=1] {CustomName:'{"text":"456","color":"green"}'}

理论上是可以用这个方法来实现彩色俄罗斯方块的,但是本人没有想出处理速度较快的方法。
(测试时几乎以肉眼可辨的速度输出的每一行,完全不能接受)
调试时的一些实用命令:
| 加载:load |
代码:
|
| 加载各种变量并显示界面 |
| 卸载:unload |
代码:
|
| 卸载掉所有本数据包使用的变量,清除本数据包添加的实体标记 |
| 重载:reload |
代码:
|
| 重载(先卸载,再加载) |
| 清屏:clrall |
代码:
|
| 清空所有ln的数据,即清除所有记录的已落地方块 |
| 左移块:movl |
代码:
|
| 使当前操作的方块左移一格(会进行碰撞判断),与界面按钮操作效果相同 |
| 右移块:movr |
代码:
|
| 使当前操作的方块右移一格(会进行碰撞判断),与界面按钮操作效果相同 |
| 下移块:movd |
代码:
|
| 使当前操作的方块下移一格(会进行碰撞判断) |
| 旋转块:rot |
代码:
|
| 顺时针旋转当前操作的方块(会进行碰撞判断),与界面按钮操作效果相同 |
| 显示:print |
代码:
|
| “渲染”画面并tellraw输出 |
| 修改块类型 (值为1~7) |
代码:
|
| 修改下落中的方块的类型 |
| 修改行储存数据 (ln有ln1~20,值的范围由游戏区域宽带决定) |
代码:
|
| 直接修改某一行储存的已落地方块的数据(若修改的值不在穷举范围内,该行原地爆炸) |
| 结束游戏:gg |
代码:
|
| 直接结束游戏 |
| 更改游戏状态 (值为0/1) |
代码:
|
| 用于暂停timer,实现咋瓦鲁多与时间开始流动(雾) |
才发现B站视频引用到论坛了看不到简介,,,
这里补充一下视频中提到的帖子:http://www.mcbbs.net/thread-825458-1-1.html
我也不知道为什么要@SPGoding,但就是忍不住
感谢大佬们的捧场

这里补充一下视频中提到的帖子:http://www.mcbbs.net/thread-825458-1-1.html
我也不知道为什么要@SPGoding,但就是忍不住
感谢大佬们的捧场
羡慕命令方块大佬
厉害qwq羡慕
感觉又有一个cb新星要出来了
穷举一点也不丢人
穷举一点也不丢人
大佬np......
很不错的一个数据包!
穷举大法好
穷举大法好
感谢你的分享谢谢
我的妈。。这就是大佬吗
感谢分享,以后我的地图里一定要采用类似的东西
3333333333333333333333333333
厉害想学怎么学qwq
hawdsf. 发表于 2019-6-18 22:37
厉害想学怎么学qwq
是准备学命令吗
那就啃wiki,看教程
豁出一头秀发(不是
推荐教程:@pca006132的命令方块教程
推荐群聊:cbl新手交流群 861334080
大佬接受我正义的围观
乙烯:不穷举你怎么变强
(大佬太强了)
(大佬太强了)
强啊,跪着看完的
厉害qwq羡慕
1.14好有意思啊
好厉害呀,要是有直接用方块操作的就好了
666日常水评论233
第一次看见这种玩意儿
例害,大佬吸痰,大佬喝酒????
666简直了666
@00ll00
我想说
Log文件会炸啊,小心日志文件有几GB
好像也没什么问题
按理说方块型的俄罗斯方块也大有人在,但是这个聊天栏tellraw的我还是第一次见
我想说
Log文件会炸啊,小心日志文件有几GB
好像也没什么问题
按理说方块型的俄罗斯方块也大有人在,但是这个聊天栏tellraw的我还是第一次见
没颜色,差评
我感觉这个好
实用6666666666
神乎其技!6的飞起!