吃角子老虎机
这篇文章会介绍如何使用“函数”、“计次循环”、“随机取数”、“加减乘除”、“余数”、“点亮”等积木,实作一个小型的吃角子老虎机游戏 ( 五颗灯从上往下重复循环移动,停止时如果五颗灯在同一直线上就获胜 )。
游戏方式
吃角子老虎机是一种赌博游戏机,开始游戏后 ( 投币 + 拉下拉霸 ),机器屏幕上会随机滚动出现不同图案,当停止后如果出现指定的图案连线,则以不同赔率胜出。
这个范例会透过 micro:bit 的 LED,模拟吃角子老虎机的游戏程序。游戏操作步骤如下:
- 按下 A 按钮,开始游戏,灯号从上往下不断移动。
- 灯号会从第一排依序停止道第五排。
- 如果五个灯号连成一直线则获胜。
- 如果连成一直线太困难,也可绘制图形卡,如果灯号最后的排列组合和图形卡相同则获胜。
积木程序原理
因为吃角子老虎机要用“同样的程序”去控制五颗灯的移动,所以可以使用“函数”将同样的程序独立出来,建立一个名为 slot 的函数,并加入 x 和 y 两个数字参数。
接着编辑 slot 函数内容:
- 放入计次循环,index 次数设定 0~20 次 ( 后续步骤会再做调整 )。
- 每次重复时,点亮座标为“x, index + ( y 除以 5 的余数 )”的 LED 灯,index + ( y 除以 5 的余数 ) 表示可以修改起始 LED 灯的 y 座标,避免都是从 index=0 开始。
- 使用逻辑判断,第一个判断如果第一颗灯亮起,就熄灭最后一颗灯,第二个判断每颗灯亮起时,就熄灭前一颗灯。
- 放入暂停 50 毫秒积木,让每次重复都暂停 50 毫秒。
将函数放入“当启动时”积木里,micro:bit 启动后,会看到 LED 灯依序从第一排到第五排,从上往下移动。
不过由于循环的特性是“在同一组积木里,循环结束后,才会进行下面的程序”,所以如果按照上面的做法,LED 无法同时一起移动,这时就必须使用“多个”“重复无限次”积木,来让循环可以同时运作。
将函数分别放入五个重复无限次积木里,micro:bit 启动后,会看到 LED 灯第一排到第五排,同时从上往下移动。
到这个步骤,已经大致了解灯号移动的原理,接下来要修改 slot 函数,让灯号的移动是随机的:
- 将 index 为 0~20 的 20 改成“(x x 10) + 20 + y”,就能让 x 越大的灯越慢停止,并让每次移动都是随机数 ( 因为 y 是 1~5 的随机数 )。
- 函数里的循环结束后,返回 y 除以 5 的余数 ( 停下之后是第几颗灯亮着 )。
接着在“当启动时”和“当按钮 A 被按下”的积木里,放入 a0、a1、a2、a3、a4 五个变数,当启动时的数值设定 -2,按下按钮的数值设定为 -1,目的作为“游戏开始”以及“最后是否同一直线”的判断依据,此外再新增一个数值为 1 的 ok 变数,作为最后是否获胜的判断。
修改第一个灯 ( 0,y ) 的重复无限次积木,放入“逻辑判断”积木,判断当 a0 = -1 时就呼叫 slot 函数。
slot 函数执行结束后,会返回 y 除以 5 的余数给 a0,所以 a0 的数值会从 0 变成 y 除以 5 的余数。
第二个灯 ( 1,y)、第三个灯 ( 2,y ) 和第四个灯 ( 3,y ) 的重复无限次积木几乎相同,分别让 a1、a2、a3 变数等于 slot 函数执行后的结果,接着使用逻辑判断数值是否相同,如果相同,表示在同样的位置,如果不相同,就让 ok 变数等于 0。
最后一颗灯的重复无限次积木和前几颗灯类似,差别在于最后判断如果 ok 等于 1,表示获胜,出现爱心图示。
完成后,启动 micro:bit,按下 A 按钮,开始玩吃角子老虎游戏机。
范例解答
范例解答:吃角子老虎机
实作“吃角子老虎机”的小技巧
为什么要使用那么多个“重复无限次”呢?
因为每个灯号都要各自移动,如果放在同一个循环里,会互相干扰和影响,造成程序较为复杂,分成不同的循环也较容易管理。
函数里的变数,使用时需要特别注意
实作过程中,曾经一度想在函数里建立新的变数,但积木在转换成 JavaScript 的过程中,会发生区域变数和全域变数互相干扰状况 ( 直接写程序不会发生,但积木转换后就会发生错误 ),因此不建议直接在函数里建立变数 ( 除非很熟悉程序语法 )。
微信扫码关注
抖音扫码关注