Day28 ( 游戏设计 ) 吃角子老虎机

吃角子老虎机

教学原文参考:吃角子老虎机

这篇文章会介绍如何使用「函式」、「计次回圈」、「随机取数」、「加减乘除」、「余数」、「点亮」等积木,实作一个小型的吃角子老虎机游戏 ( 五颗灯从上往下重复循环移动,停止时如果五颗灯在同一直线上就获胜 )。

相关文章参考:函式计次回圈随机取数加减乘除余数点亮

游戏方式

吃角子老虎机是一种赌博游戏机,开始游戏後 ( 投币 + 拉下拉霸 ),机器萤幕上会随机滚动出现不同图案,当停止後如果出现指定的图案连线,则以不同赔率胜出。

micro:bit - 吃角子老虎机

这个范例会透过 micro:bit 的 LED,模拟吃角子老虎机的游戏程序。游戏操作步骤如下:

  • 按下 A 按钮,开始游戏,灯号从上往下不断移动。
  • 灯号会从第一排依序停止道第五排。
  • 如果五个灯号连成一直线则获胜
  • 如果连成一直线太困难,也可绘制图形卡,如果灯号最後的排列组合和图形卡相同则获胜

micro:bit - 吃角子老虎机

积木程序原理

因为吃角子老虎机要用「同样的程序」去控制五颗灯的移动,所以可以使用「函式」将同样的程序独立出来,建立一个名为 slot 的函式,并加入 x 和 y 两个数字参数

micro:bit - 吃角子老虎机

接着编辑 slot 函式内容:

  • 放入计次回圈,index 次数设定 0~20 次 ( 後续步骤会再做调整 )。
  • 每次重复时,点亮座标为「x, index + ( y 除以 5 的余数 )」的 LED 灯,index + ( y 除以 5 的余数 ) 表示可以修改起始 LED 灯的 y 座标,避免都是从 index=0 开始。
  • 使用逻辑判断,第一个判断如果第一颗灯亮起,就熄灭最後一颗灯,第二个判断每颗灯亮起时,就熄灭前一颗灯
  • 放入暂停 50 毫秒积木,让每次重复都暂停 50 毫秒。

micro:bit - 吃角子老虎机

将函式放入「当启动时」积木里,micro:bit 启动後,会看到 LED 灯依序从第一排到第五排,从上往下移动。

micro:bit - 吃角子老虎机

不过由於回圈的特性是「在同一组积木里,回圈结束後,才会进行下面的程序」,所以如果按照上面的做法,LED 无法同时一起移动,这时就必须使用「多个」「重复无限次」积木,来让回圈可以同时运作。

将函式分别放入五个重复无限次积木里,micro:bit 启动後,会看到 LED 灯第一排到第五排,同时从上往下移动。

micro:bit - 吃角子老虎机

到这个步骤,已经大致了解灯号移动的原理,接下来要修改 slot 函式,让灯号的移动是随机的:

  • 将 index 为 0~20 的 20 改成「(x x 10) + 20 + y」,就能让 x 越大的灯越慢停止,并让每次移动都是随机数 ( 因为 y 是 1~5 的随机数 )。
  • 函式里的回圈结束後,返回 y 除以 5 的余数 ( 停下之後是第几颗灯亮着 )。

micro:bit - 吃角子老虎机

接着在「当启动时」和「当按钮 A 被按下」的积木里,放入 a0、a1、a2、a3、a4 五个变数,当启动时的数值设定 -2,按下按钮的数值设定为 -1,目的作为「游戏开始」以及「最後是否同一直线」的判断依据,此外再新增一个数值为 1 的 ok 变数,作为最後是否获胜的判断。

micro:bit - 吃角子老虎机

修改第一个灯 ( 0,y ) 的重复无限次积木,放入「逻辑判断」积木,判断当 a0 = -1 时就呼叫 slot 函式

slot 函式执行结束後,会返回 y 除以 5 的余数给 a0,所以 a0 的数值会从 0 变成 y 除以 5 的余数

micro:bit - 吃角子老虎机

第二个灯 ( 1,y)、第三个灯 ( 2,y ) 和第四个灯 ( 3,y ) 的重复无限次积木几乎相同,分别让 a1、a2、a3 变数等於 slot 函式执行後的结果,接着使用逻辑判断数值是否相同,如果相同,表示在同样的位置,如果不相同,就让 ok 变数等於 0

micro:bit - 吃角子老虎机

最後一颗灯的重复无限次积木和前几颗灯类似,差别在於最後判断如果 ok 等於 1,表示获胜,出现爱心图示。

micro:bit - 吃角子老虎机

完成後,启动 micro:bit,按下 A 按钮,开始玩吃角子老虎游戏机。

micro:bit - 吃角子老虎机

范例解答

范例解答:吃角子老虎机

实作「吃角子老虎机」的小技巧

  • 为什麽要使用那麽多个「重复无限次」呢?

    因为每个灯号都要各自移动,如果放在同一个回圈里,会互相干扰和影响,造成程序较为复杂,分成不同的回圈也较容易管理。

  • 函式里的变数,使用时需要特别注意

    实作过程中,曾经一度想在函式里建立新的变数,但积木在转换成 JavaScript 的过程中,会发生区域变数和全域变数互相干扰状况 ( 直接写程序不会发生,但积木转换後就会发生错误 ),因此不建议直接在函式里建立变数 ( 除非很熟悉程序语法 )。

关於我

大家好,我是 OXXO,是个即将迈入中年的斜杠青年,如果对我有点兴趣(笑,可以与我联系,一起来做点有玩又有创意的东西吧!


<<:  Day_16 : 让 Vite 来开启你的Vue 之 资料定义 ref 与 reactive

>>:  【day13】DashboardFragment X CardView

第 30 型 - 环境配置与建构 (Build)

实务上,因应不同的开发阶段,应用程序会运行在开发环境 (Develop Environment)、预...

Day04-入口管制(三)

前言 前两天讲完基本的格式、语义检查後,今天特别来讲一下关於 email 的部分 大部分网站希望使用...

【React Hook 03】useEffect

useEffect 的 Effect 意指「副作用」, 即是指 fetch 资料、订阅事件与改变 D...

Day17-维稳? StatefulSet介绍

在pod的生态中,本身就是一个小小世界,新旧pod之间通常不影响,当建立新的pod时,基本上不会跟被...

认识 C#

C# C# 读做 (see sharp), 是一个基於 .Net Framework 的通用, 多范...