回到首页 返回首页
回到顶部 回到顶部
返回上一页 返回上一页

【花雕动手做】Kitronik 可编程游戏开发板基于 ARCADE MakeCode 之埃拉托色尼筛子 简单

头像 驴友花雕 2025.09.17 4 0

Kitronik ARCADE 是一款由英国教育科技公司 Kitronik 精心打造的可编程游戏机开发板,专为编程教学与创客实践而设计。该设备原生支持微软的 MakeCode Arcade 平台,用户可通过图形化或 JavaScript 编程方式,轻松创建、下载并运行复古风格的街机游戏。

它集成了彩色 LCD 显示屏、方向控制键、功能按键、蜂鸣器和震动马达等交互组件,提供完整的游戏输入输出体验。无论是初学者进行编程启蒙,还是创客群体开发交互式作品,Kitronik ARCADE 都能作为理想的硬件载体,助力创意实现。

凭借其开源友好、易于上手、兼容性强等特点,该开发板广泛应用于中小学编程课程、创客工作坊、游戏开发教学以及个人项目原型设计,深受教育者与技术爱好者的喜爱。

 

00 (4).jpg
00 (5).jpg

作为学习、练习与尝试,这里创建一个埃拉托色尼筛子的小游戏。
打开网页版:https://arcade.makecode.com/,设置项目名称:埃拉托色尼筛子

JavaScript 实验代码

代码
let naturals = 0
let idleCount = 0
let j = 0
let boxY = 0
let boxX = 0
let boxSprite: Sprite = null
let spriteList: Sprite[] = null
enum SieveSteps {
    StartList,
    PrintList,
    EndList,
    Scan,
    StartCollect,
    DoCollect,
    EndCollect,
    DropBounce,
    Idle
}
let factor = 2
let idleReturn = SieveSteps.Idle
let step = SieveSteps.StartList
game.splash("Sieve of Eratosthenes")
game.onUpdateInterval(10, function () {
    switch (step) {
        case SieveSteps.StartList:
            boxY = 5
            boxX = 4
            naturals = 2
            step = SieveSteps.PrintList
            break

        case SieveSteps.PrintList:
            if (boxY + 14 < scene.screenHeight()) {
                if (boxX + 16 >= scene.screenWidth()) {
                    boxX = 4
                    boxY += 14
                } else {
                    boxSprite = sprites.create(img`
                        b b b b b b b b b b b b b b b b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
                        b b b b b b b b b b b b b b b b
                    `, SpriteKind.Player)
                    boxSprite.setBounceOnWall(true)
                    boxSprite.image.printCenter("" + naturals, 2)
                    boxSprite.left = boxX
                    boxSprite.top = boxY
                    boxX += 17
                    naturals += 1
                    music.playTone(Note.C, BeatFraction.Sixteenth)
                    idleCount = 5
                    idleReturn = SieveSteps.PrintList
                    step = SieveSteps.Idle
                }
            } else {
                step = SieveSteps.EndList
            }
            break

        case SieveSteps.EndList:
            spriteList = sprites.allOfKind(SpriteKind.Player)
            game.showLongText("Scan for primes in the sequence of numbers. The score will show your current factor.", DialogLayout.Center)
            step = SieveSteps.Scan
            break

        case SieveSteps.Scan:
            j += factor
            if (j < spriteList.length) {
                if (spriteList[j].image.getPixel(0, 0) > 0) {
                    spriteList[j].startEffect(effects.disintegrate, 200)
                    spriteList[j].image.fill(0)
                    music.playTone(Note.C5, BeatFraction.Sixteenth)
                    idleCount = 10
                    idleReturn = SieveSteps.Scan
                    step = SieveSteps.Idle
                }
            } else {
                if (factor > 2) {
                    factor += 2
                } else {
                    factor += 1
                }
                j = factor - 2
            }
            if (factor > spriteList.length + 2) {
                step = SieveSteps.StartCollect
            } else {
                info.setScore(factor)
            }
            break

        case SieveSteps.StartCollect:
            boxY = 5
            boxX = 4
            j = 0
            step = SieveSteps.DoCollect
            break

        case SieveSteps.DoCollect:
            if (j < spriteList.length) {
                if (spriteList[j].image.getPixel(0, 0) > 0) {
                    if (boxX + 16 >= scene.screenWidth()) {
                        boxX = 4
                        boxY += 14
                    }
                    spriteList[j].left = boxX
                    spriteList[j].top = boxY
                    boxX += 17
                    music.playTone(Note.FSharp4, BeatFraction.Sixteenth)
                    idleCount = 10
                    idleReturn = SieveSteps.DoCollect
                    step = SieveSteps.Idle
                }
                j += 1
            } else {
                idleCount = 2
                idleReturn = SieveSteps.EndCollect
                step = SieveSteps.Idle
            }
            break

        case SieveSteps.EndCollect:
            step = SieveSteps.Idle
            music.jumpDown.play()
            idleCount = 100
            idleReturn = SieveSteps.DropBounce
            step = SieveSteps.Idle
            break

        case SieveSteps.DropBounce:
            music.magicWand.play()
            for (let box of spriteList) {
                box.ay = randint(100, 400)
            }
            idleCount = -1
            step = SieveSteps.Idle
            break

        case SieveSteps.Idle:
            if (idleCount > 0) {
                idleCount += -1
            } else if (idleCount == 0) {
                step = idleReturn
            }
            break
    }
})

这段代码是一个非常炫酷的可视化演示,用 MakeCode Arcade 的 JavaScript 实现了埃拉托色尼筛法,并通过精灵动画、音效和状态机来展示筛选素数的过程。

总体结构概览

 

138-.jpg

变量说明
javascript
let naturals = 0        // 当前生成的自然数
let factor = 2          // 当前筛选的因子(从2开始)
let spriteList: Sprite[] = null  // 所有数字精灵列表
let step = SieveSteps.StartList // 当前状态

状态机流程详解
1、StartList → 初始化生成数字
javascript
boxY = 5
boxX = 4
naturals = 2
step = SieveSteps.PrintList
设置起始坐标,从数字 2 开始准备生成精灵

2、PrintList → 创建数字精灵
javascript
boxSprite = sprites.create(...)
boxSprite.image.printCenter("" + naturals, 2)
每个数字是一个精灵,显示在屏幕上

自动换行排列

播放音效,节奏感十足

每生成一个数字后进入 Idle,延时继续生成

3、EndList → 准备筛选
javascript
spriteList = sprites.allOfKind(SpriteKind.Player)
step = SieveSteps.Scan
获取所有数字精灵

显示提示信息

进入筛选阶段

4、Scan → 埃拉托色尼筛选核心逻辑
javascript
j += factor
if (spriteList[j].image.getPixel(0, 0) > 0) {
   spriteList[j].startEffect(effects.disintegrate, 200)
   spriteList[j].image.fill(0)
}
从当前因子的倍数开始筛除

如果该精灵还没被筛掉(像素不为0),就执行销毁动画

每次筛完一个数后进入 Idle,节奏控制

筛完当前因子后,更新 factor,继续下一轮

5、 StartCollect / DoCollect → 收集素数
javascript
if (spriteList[j].image.getPixel(0, 0) > 0) {
   spriteList[j].left = boxX
   spriteList[j].top = boxY
}
将剩下的素数重新排列在屏幕上

每移动一个精灵就播放音效

进入 Idle 控制节奏

6、 EndCollect → 收尾准备
javascript
music.jumpDown.play()
idleReturn = SieveSteps.DropBounce
播放音效

准备进入炫酷掉落阶段

7、 DropBounce → 炫酷收尾
javascript
for (let box of spriteList) {
   box.ay = randint(100, 400)
}
给所有剩下的素数加上重力

让它们像跳跳糖一样弹起来

视觉效果拉满

8、 Idle → 节奏控制器
javascript
if (idleCount > 0) {
   idleCount -= 1
} else if (idleCount == 0) {
   step = idleReturn
}
控制每个阶段之间的节奏

让动画和逻辑有呼吸感,不会一口气跑完

可视化亮点
每个数字是一个精灵,带有编号
筛除时播放 disintegrate 粒子特效
剩下的素数重新排列
最后跳跃弹起,收尾炫酷
音效贯穿整个过程,节奏感强。

通过模拟器,调试与模拟运行

 

00212---0.gif


实验场景记录

 

139 (1).jpg
139 (2).jpg
139 (3).jpg

评论

user-avatar
icon 他的勋章
    展开更多