gulang20230313 发表于 2023-3-18 19:17

俄罗斯方块1.0

本帖最后由 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
方块画板 = 画板2
方块画板 = 画板3
方块画板 = 画板4
方块画板 = 画板5
方块画板 = 画板6
方块画板 = 画板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)' 清除顶层。
            .如果真 (游戏区堆积块 [容器2] ≠ 0)
                游戏区画板.填充矩形 ((容器2 - 1) × 20, 0, 容器2 × 20 + 1, 21)
            .如果真结束


      .计次循环尾 ()
      .变量循环首 (垂直位置 - 1, 1, -1, 容器1)' 下移上面层的数据。
            .计次循环首 (10, 容器2)
                游戏区堆积块 [容器1 + 1] [容器2] = 游戏区堆积块 [容器1] [容器2]
            .计次循环尾 ()
      .变量循环尾 ()
      .计次循环首 (10, 容器2)' 清除顶层的数据。
            游戏区堆积块 [容器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
易语言编译的成品软件容易感染病毒,给大家带来不便,这里不在发表成品,提供源码和大家一起学习编程的思路
我也会不时的进行电脑全盘杀毒,谢谢大家的支持!

云在天 发表于 2023-3-19 00:37

经人工核查,该用户发布的成品捆绑1-2个蠕虫,远控木马

请使用者使用杀毒软件全盘杀毒。

kk1212 发表于 2023-3-19 07:45

还真带病毒……无语

gulang20230313 发表于 2023-3-18 21:03

sjt5396 发表于 2023-3-18 20:26
带病毒?????

楼主担心可以尽量少下载易语言类程序{:301_1000:}杀毒软件检查报毒通常是特征扫描,只有满足特征符合就会报毒,不会管你是用什么语言编写的。但通常易语言编译生成的EXE在运行时,绝大多数情况下CPU指令运行在支持库领空(仅少数在EXE领空,这与其它编译器生成的EXE的行为有很大不同),给杀毒软件查杀和机器分析造成了较大阻力,而且由于易语言影响力远不如JAVA/C/C++,很难吸引杀软厂商重视,从而导致误报时有发生。

wdz2018 发表于 2023-3-18 19:38

受教了,成品源码和整个流程明明白白{:301_1003:}

gulang20230313 发表于 2023-3-18 19:43

wdz2018 发表于 2023-3-18 19:38
受教了,成品源码和整个流程明明白白

大佬言重啦{:301_986:}

wdz2018 发表于 2023-3-18 19:47

gulang20230313 发表于 2023-3-18 19:43
大佬言重啦

不敢不敢,说实在的我不懂这方面的{:301_992:}

gulang20230313 发表于 2023-3-18 19:51

wdz2018 发表于 2023-3-18 19:47
不敢不敢,说实在的我不懂这方面的

相互学习,共同进步{:17_1056:}

yestodayonece 发表于 2023-3-18 19:56

学习了,我也来试试。

kk159 发表于 2023-3-18 19:59

这么复杂么{:1_918:}

chizha 发表于 2023-3-18 20:00

感谢分享,学习了

mokson 发表于 2023-3-18 20:01

gulang20230313 发表于 2023-3-18 20:03

mokson 发表于 2023-3-18 20:01
楼主这几天真高产。

被你发现啦{:301_1000:}周末嘛,给大家分享一些好的东西,独乐乐不如众乐乐{:300_966:}
页: [1] 2 3 4 5
查看完整版本: 俄罗斯方块1.0