本帖最后由 gulang20230313 于 2023-3-23 19:34 编辑
小伙伴们,闲来无事,和大家一起来玩俄罗斯方块啦
大家都知道,俄罗斯方块是要反转成合适的方向,从而消失得分的,这是主线,
因此,只需要记录每类块的 4 种 4 X 4 翻转结构。
如果某种翻转结构数据以 255 开头,表示该结构不存在。
那么,就得到了块数据:
块数据 = { 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ' 竖条, 255 表示无此翻转状态。
块数据 = 块数据 + { 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ' 2 字形
块数据 = 块数据 + { 1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ' 7 字形
块数据 = 块数据 + { 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 } ' 丁字形
块数据 = 块数据 + { 1, 1, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ' 反 7 字形
块数据 = 块数据 + { 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ' 反 2 字形
块数据 = 块数据 + { 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } ' 方块
有了主线,就好办了,咱们做一个尺寸为7X4X4,分别记录7种块的4种位置数据(记录画各种块时所使用的画板)
0 为第 1 关,依此类推
那么,先建立七个画板:
连续赋值 (#背景图片, 底图, 当前关标签.底图, 提示画板.底图, 标题标签.底图, 标签1.底图, 总分标签.底图, 过关还差分数标签.底图) ' 添加底图。
方块画板 [1] = 画板1
方块画板 [2] = 画板2
方块画板 [3] = 画板3
方块画板 [4] = 画板4
方块画板 [5] = 画板5
方块画板 [6] = 画板6
方块画板 [7] = 画板7
初始化块数据 (块数据)
检查正确得分及设置落下的方向
检查 (欲进入关 ≥ 0 且 欲进入关 < 15)
暂停 = 假
置随机数种子 ()
当前关 = 欲进入关
过关还差分数 = 欲进入关 × 500 + 500 ' 过关分数
下落时钟.时钟周期 = 500 - 欲进入关 × 25 ' 下落速度
当前关标签.标题 = “第” + 数值到大写 (当前关 + 1, 真) + “关”
过关还差分数标签.标题 = “ 过关还差 ” + 到文本 (过关还差分数) + “ 分”
数组清零 (游戏区堆积块) ' 将所有现有堆积块清除
游戏区画板.清除 ()
初始堆积层数 = 欲进入关 \ 2 ' 根据当前关来设置初始堆积块。
.变量循环首 (21 - 初始堆积层数, 20, 1, 垂直位置)
.计次循环首 (10, 水平位置)
.如果真 (水平位置 ≠ 垂直位置 且 取随机数 (0, 2) = 0)
游戏区堆积块 [垂直位置] [水平位置] = 1
画方块 (游戏区画板, 1, (水平位置 - 1) × 20, (垂直位置 - 1) × 20, 真)
.如果真结束
.计次循环尾 ()
.变量循环尾 ()
即将下落块 = 0
准备下落 ()
游戏区画板.获取焦点 () ' 将输入焦点转移到游戏区画板。
下落块位置选择:
下落块 = 选择 (即将下落块 ≠ 0, 即将下落块, 取随机数 (0, 6) × 4 + 1) ' 取得当前下落块。
即将下落块 = 取随机数 (0, 6) × 4 + 1 ' 准备即将下落块。
下落垂直位置 = 1 ' 初始下落位置
下落水平位置 = 4
' 查看是否还可以下落。
偏移值 = (下落块 - 1) × 16 + 1
.变量循环首 (下落垂直位置, 下落垂直位置 + 3, 1, 垂直位置)
.变量循环首 (下落水平位置, 下落水平位置 + 3, 1, 水平位置)
.如果真 (块数据 [偏移值] ≠ 0)
.如果真 (游戏区堆积块 [垂直位置] [水平位置] ≠ 0)
' 如果不能下落则说明已经堆满。
.如果真 (音乐暂停 = 假)
播放音乐 (#失败, )
.如果真结束
下落时钟.时钟周期 = 0
游戏区画板.定位写出 (20, 180, “你输掉了此局!”)
开始按钮.获取焦点 ()
返回 ()
.如果真结束
游戏区堆积块 [垂直位置] [水平位置] = 1
.如果真结束
偏移值 = 偏移值 + 1
.变量循环尾 ()
.变量循环尾 ()
画方块 (游戏区画板, 下落块, 60, 0, 假)
提示画板.重画 ()
循环往复
.判断开始 (方块类型 = 0) ' 如果为空块,则返回。
返回 ()
.默认
图片画板 = 方块画板 [当前关 % 7 + 1] ' 取得画当前关的块的画板。
.如果 (仅画单一方块 = 真)
图片画板.复制 (0, 0, 20, 20, 画板, 绘画左边, 绘画顶边, )
.否则
偏移值 = (方块类型 - 1) × 16 + 1
.计次循环首 (4, 垂直位置)
.计次循环首 (4, 水平位置)
.如果真 (块数据 [偏移值] ≠ 0)
图片画板.复制 (0, 0, 20, 20, 画板, 绘画左边 + (水平位置 - 1) × 20, 绘画顶边 + (垂直位置 - 1) × 20, )
.如果真结束
偏移值 = 偏移值 + 1
.计次循环尾 ()
.计次循环尾 ()
.如果结束
.判断结束
上一关、下一关判断:
垂直位置 = 下落垂直位置 + 3
.如果真 (垂直位置 > 20)
垂直位置 = 20
.如果真结束
容器3 = 下落垂直位置
.判断循环首 (垂直位置 ≥ 容器3)
.计次循环首 (10, 水平位置)
.如果真 (游戏区堆积块 [垂直位置] [水平位置] = 0)
跳出循环 ()
.如果真结束
.计次循环尾 ()
.如果 (水平位置 > 10) ' 此层是否被堆满
消除层数 = 消除层数 + 1
游戏区画板.复制 (0, 0, 200, (垂直位置 - 1) × 20, 游戏区画板, 0, 20, ) ' 下移上面的所有层。
.如果真 (音乐暂停 = 假)
播放音乐 (#消层, )
.如果真结束
.计次循环首 (10, 容器2) ' 清除顶层。
.如果真 (游戏区堆积块 [1] [容器2] ≠ 0)
游戏区画板.填充矩形 ((容器2 - 1) × 20, 0, 容器2 × 20 + 1, 21)
.如果真结束
.计次循环尾 ()
.变量循环首 (垂直位置 - 1, 1, -1, 容器1) ' 下移上面层的数据。
.计次循环首 (10, 容器2)
游戏区堆积块 [容器1 + 1] [容器2] = 游戏区堆积块 [容器1] [容器2]
.计次循环尾 ()
.变量循环尾 ()
.计次循环首 (10, 容器2) ' 清除顶层的数据。
游戏区堆积块 [1] [容器2] = 0
.计次循环尾 ()
容器3 = 容器3 + 1 ' 下移目的层
.否则
垂直位置 = 垂直位置 - 1
.如果结束
.判断循环尾 ()
' 根据一次消除层的数目来给出不同的分数。
.如果真 (消除层数 = 0)
返回 (假)
.如果真结束
.判断开始 (消除层数 = 1)
容器1 = 10
.判断 (消除层数 = 2)
容器1 = 40
.判断 (消除层数 = 3)
容器1 = 80
.默认
容器1 = 160
.判断结束
总分 = 总分 + 容器1
总分标签.标题 = “ 总分: ” + 到文本 (总分)
过关还差分数 = 过关还差分数 - 容器1
.如果 (过关还差分数 ≤ 0) ' 是否已经过关
.如果 (当前关 = 14) ' 是否为最后一关
下落时钟.时钟周期 = 0
游戏区画板.定位写出 (0, 180, “恭喜你全部通关!”)
图片框1.可视 = 真
图片框1.刷新显示 ()
延时 (3000)
图片框1.可视 = 假
开始按钮.获取焦点 ()
.否则
' 寻找有块的最顶层
.计次循环首 (20, 垂直位置)
.计次循环首 (10, 水平位置)
.如果真 (游戏区堆积块 [垂直位置] [水平位置] ≠ 0)
跳出循环 ()
.如果真结束
.计次循环尾 ()
.如果真 (水平位置 ≤ 10)
跳出循环 ()
.如果真结束
.计次循环尾 ()
' 动态消层,表示过关。
.变量循环首 (20, 垂直位置, -1, 容器1)
游戏区画板.复制 (0, 0, 200, 380, 游戏区画板, 0, 20, )
延时 (50)
.变量循环尾 ()
延时 (500)
.如果真 (音乐暂停 = 假)
播放音乐 (#过关, )
.如果真结束
' 本关已过
进入游戏指定关 (当前关 + 1) ' 进入下一关
.如果结束
返回 (真)
.否则
过关还差分数标签.标题 = “ 过关还差 ” + 到文本 (过关还差分数) + “ 分”
.如果结束
返回 (假)
偏移值设置
.如果真 (暂停 = 真 或 下落块 = 0)
返回 ()
.如果真结束
偏移值2 = (下落块 - 1) × 16 + 1
偏移值1 = 偏移值2 + 16
.计次循环首 (4, 水平位置)
.计次循环首 (4, 垂直位置)
.如果真 (块数据 [偏移值1 - 垂直位置 × 4] ≠ 0)
垂直位置 = 5 - 垂直位置
.如果真 (下落垂直位置 + 垂直位置 > 20 或 游戏区堆积块 [下落垂直位置 + 垂直位置] [下落水平位置 + 水平位置 - 1] ≠ 0)
.如果真 (消除整层 () = 假)
下落块 = 0
准备下落 ()
.如果真结束
返回 ()
.如果真结束
跳出循环 ()
.如果真结束
.计次循环尾 ()
偏移值1 = 偏移值1 + 1
.计次循环尾 ()
偏移值1 = 偏移值2
.变量循环首 (下落垂直位置, 下落垂直位置 + 3, 1, 垂直位置)
.变量循环首 (下落水平位置, 下落水平位置 + 3, 1, 水平位置)
.如果真 (块数据 [偏移值1] ≠ 0)
游戏区堆积块 [垂直位置] [水平位置] = 0
.如果真 (垂直位置 = 下落垂直位置 或 块数据 [偏移值1 - 4] = 0)
游戏区画板.填充矩形 ((水平位置 - 1) × 20, (垂直位置 - 1) × 20, 水平位置 × 20 + 1, 垂直位置 × 20 + 1)
.如果真结束
.如果真结束
偏移值1 = 偏移值1 + 1
.变量循环尾 ()
.变量循环尾 ()
下落垂直位置 = 下落垂直位置 + 1
.变量循环首 (下落垂直位置, 下落垂直位置 + 3, 1, 垂直位置)
.变量循环首 (下落水平位置, 下落水平位置 + 3, 1, 水平位置)
.如果真 (块数据 [偏移值2] ≠ 0)
游戏区堆积块 [垂直位置] [水平位置] = 1
.如果真 (垂直位置 = 下落垂直位置 + 3 或 块数据 [偏移值2 + 4] = 0)
画方块 (游戏区画板, 下落块, (水平位置 - 1) × 20, (垂直位置 - 1) × 20, 真)
.如果真结束
.如果真结束
偏移值2 = 偏移值2 + 1
.变量循环尾 ()
.变量循环尾 ()
下落水平、垂直位置及偏移值
.如果真 (下落水平位置 = 10)
返回 ()
.如果真结束
偏移值1 = (下落块 - 1) × 16 + 1
偏移值2 = 偏移值1
.计次循环首 (4, 垂直位置)
.变量循环首 (4, 1, -1, 水平位置)
.如果真 (块数据 [偏移值1 + 水平位置 - 1] ≠ 0)
.如果真 (下落水平位置 + 水平位置 > 10 或 游戏区堆积块 [下落垂直位置 + 垂直位置 - 1] [下落水平位置 + 水平位置] ≠ 0)
返回 ()
.如果真结束
跳出循环 ()
.如果真结束
.变量循环尾 ()
偏移值1 = 偏移值1 + 4
.计次循环尾 ()
偏移值1 = 偏移值2
.变量循环首 (下落水平位置, 下落水平位置 + 3, 1, 水平位置)
.变量循环首 (下落垂直位置, 下落垂直位置 + 3, 1, 垂直位置)
.如果真 (块数据 [偏移值1 + (垂直位置 - 下落垂直位置) × 4] ≠ 0)
游戏区堆积块 [垂直位置] [水平位置] = 0
.如果真 (水平位置 = 下落水平位置 或 块数据 [偏移值1 + (垂直位置 - 下落垂直位置) × 4 - 1] = 0)
游戏区画板.填充矩形 ((水平位置 - 1) × 20, (垂直位置 - 1) × 20, 水平位置 × 20 + 1, 垂直位置 × 20 + 1)
.如果真结束
.如果真结束
.变量循环尾 ()
偏移值1 = 偏移值1 + 1
.变量循环尾 ()
下落水平位置 = 下落水平位置 + 1
.变量循环首 (下落水平位置, 下落水平位置 + 3, 1, 水平位置)
.变量循环首 (下落垂直位置, 下落垂直位置 + 3, 1, 垂直位置)
.如果真 (块数据 [偏移值2 + (垂直位置 - 下落垂直位置) × 4] ≠ 0)
游戏区堆积块 [垂直位置] [水平位置] = 1
.如果真 (水平位置 = 下落水平位置 + 3 或 块数据 [偏移值2 + (垂直位置 - 下落垂直位置) × 4 + 1] = 0)
画方块 (游戏区画板, 下落块, (水平位置 - 1) × 20, (垂直位置 - 1) × 20, 真)
.如果真结束
.如果真结束
.变量循环尾 ()
偏移值2 = 偏移值2 + 1
.变量循环尾 ()
就是这个思路,就可以开心的玩啦,这里给大家把源码和成品软件都奉上,知道了思路,学习起来就更容易上手啦
源码:https://wwdy.lanzouf.com/iRDP70qfzdoj
易语言编译的成品软件容易感染病毒,给大家带来不便,这里不在发表成品,提供源码和大家一起学习编程的思路
我也会不时的进行电脑全盘杀毒,谢谢大家的支持!
|