12浏览
查看: 12|回复: 4

[项目] 【花雕动手做】基于Kitronik可编程开发板之塞维游戏

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

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

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

【花雕动手做】基于Kitronik可编程开发板之塞维游戏图1

【花雕动手做】基于Kitronik可编程开发板之塞维游戏图2

驴友花雕  中级技神
 楼主|

发表于 7 小时前

【花雕动手做】基于Kitronik可编程开发板之塞维游戏

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

JavaScript 实验代码

  1. let naturals = 0
  2. let idleCount = 0
  3. let j = 0
  4. let boxY = 0
  5. let boxX = 0
  6. let boxSprite: Sprite = null
  7. let spriteList: Sprite[] = null
  8. enum SieveSteps {
  9.     StartList,
  10.     PrintList,
  11.     EndList,
  12.     Scan,
  13.     StartCollect,
  14.     DoCollect,
  15.     EndCollect,
  16.     DropBounce,
  17.     Idle
  18. }
  19. let factor = 2
  20. let idleReturn = SieveSteps.Idle
  21. let step = SieveSteps.StartList
  22. game.splash("Sieve of Eratosthenes")
  23. game.onUpdateInterval(10, function () {
  24.     switch (step) {
  25.         case SieveSteps.StartList:
  26.             boxY = 5
  27.             boxX = 4
  28.             naturals = 2
  29.             step = SieveSteps.PrintList
  30.             break
  31.         case SieveSteps.PrintList:
  32.             if (boxY + 14 < scene.screenHeight()) {
  33.                 if (boxX + 16 >= scene.screenWidth()) {
  34.                     boxX = 4
  35.                     boxY += 14
  36.                 } else {
  37.                     boxSprite = sprites.create(img`
  38.                         b b b b b b b b b b b b b b b b
  39.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  40.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  41.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  42.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  43.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  44.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  45.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  46.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  47.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  48.                         b 4 4 4 4 4 4 4 4 4 4 4 4 4 4 b
  49.                         b b b b b b b b b b b b b b b b
  50.                     `, SpriteKind.Player)
  51.                     boxSprite.setBounceOnWall(true)
  52.                     boxSprite.image.printCenter("" + naturals, 2)
  53.                     boxSprite.left = boxX
  54.                     boxSprite.top = boxY
  55.                     boxX += 17
  56.                     naturals += 1
  57.                     music.playTone(Note.C, BeatFraction.Sixteenth)
  58.                     idleCount = 5
  59.                     idleReturn = SieveSteps.PrintList
  60.                     step = SieveSteps.Idle
  61.                 }
  62.             } else {
  63.                 step = SieveSteps.EndList
  64.             }
  65.             break
  66.         case SieveSteps.EndList:
  67.             spriteList = sprites.allOfKind(SpriteKind.Player)
  68.             game.showLongText("Scan for primes in the sequence of numbers. The score will show your current factor.", DialogLayout.Center)
  69.             step = SieveSteps.Scan
  70.             break
  71.         case SieveSteps.Scan:
  72.             j += factor
  73.             if (j < spriteList.length) {
  74.                 if (spriteList[j].image.getPixel(0, 0) > 0) {
  75.                     spriteList[j].startEffect(effects.disintegrate, 200)
  76.                     spriteList[j].image.fill(0)
  77.                     music.playTone(Note.C5, BeatFraction.Sixteenth)
  78.                     idleCount = 10
  79.                     idleReturn = SieveSteps.Scan
  80.                     step = SieveSteps.Idle
  81.                 }
  82.             } else {
  83.                 if (factor > 2) {
  84.                     factor += 2
  85.                 } else {
  86.                     factor += 1
  87.                 }
  88.                 j = factor - 2
  89.             }
  90.             if (factor > spriteList.length + 2) {
  91.                 step = SieveSteps.StartCollect
  92.             } else {
  93.                 info.setScore(factor)
  94.             }
  95.             break
  96.         case SieveSteps.StartCollect:
  97.             boxY = 5
  98.             boxX = 4
  99.             j = 0
  100.             step = SieveSteps.DoCollect
  101.             break
  102.         case SieveSteps.DoCollect:
  103.             if (j < spriteList.length) {
  104.                 if (spriteList[j].image.getPixel(0, 0) > 0) {
  105.                     if (boxX + 16 >= scene.screenWidth()) {
  106.                         boxX = 4
  107.                         boxY += 14
  108.                     }
  109.                     spriteList[j].left = boxX
  110.                     spriteList[j].top = boxY
  111.                     boxX += 17
  112.                     music.playTone(Note.FSharp4, BeatFraction.Sixteenth)
  113.                     idleCount = 10
  114.                     idleReturn = SieveSteps.DoCollect
  115.                     step = SieveSteps.Idle
  116.                 }
  117.                 j += 1
  118.             } else {
  119.                 idleCount = 2
  120.                 idleReturn = SieveSteps.EndCollect
  121.                 step = SieveSteps.Idle
  122.             }
  123.             break
  124.         case SieveSteps.EndCollect:
  125.             step = SieveSteps.Idle
  126.             music.jumpDown.play()
  127.             idleCount = 100
  128.             idleReturn = SieveSteps.DropBounce
  129.             step = SieveSteps.Idle
  130.             break
  131.         case SieveSteps.DropBounce:
  132.             music.magicWand.play()
  133.             for (let box of spriteList) {
  134.                 box.ay = randint(100, 400)
  135.             }
  136.             idleCount = -1
  137.             step = SieveSteps.Idle
  138.             break
  139.         case SieveSteps.Idle:
  140.             if (idleCount > 0) {
  141.                 idleCount += -1
  142.             } else if (idleCount == 0) {
  143.                 step = idleReturn
  144.             }
  145.             break
  146.     }
  147. })
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 7 小时前

【花雕动手做】基于Kitronik可编程开发板之塞维游戏

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

总体结构概览

【花雕动手做】基于Kitronik可编程开发板之塞维游戏图1

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


状态机流程详解
1、StartList → 初始化生成数字
javascript
  1. boxY = 5
  2. boxX = 4
  3. naturals = 2
  4. step = SieveSteps.PrintList
复制代码

设置起始坐标,从数字 2 开始准备生成精灵

2、PrintList → 创建数字精灵
javascript
  1. boxSprite = sprites.create(...)
  2. boxSprite.image.printCenter("" + naturals, 2)
复制代码

每个数字是一个精灵,显示在屏幕上
自动换行排列
播放音效,节奏感十足
每生成一个数字后进入 Idle,延时继续生成

3、EndList → 准备筛选
javascript
  1. spriteList = sprites.allOfKind(SpriteKind.Player)
  2. step = SieveSteps.Scan
复制代码

获取所有数字精灵
显示提示信息
进入筛选阶段

4、Scan → 埃拉托色尼筛选核心逻辑
javascript
  1. j += factor
  2. if (spriteList[j].image.getPixel(0, 0) > 0) {
  3.     spriteList[j].startEffect(effects.disintegrate, 200)
  4.     spriteList[j].image.fill(0)
  5. }
复制代码

从当前因子的倍数开始筛除
如果该精灵还没被筛掉(像素不为0),就执行销毁动画
每次筛完一个数后进入 Idle,节奏控制
筛完当前因子后,更新 factor,继续下一轮

5、 StartCollect / DoCollect → 收集素数
javascript
  1. if (spriteList[j].image.getPixel(0, 0) > 0) {
  2.     spriteList[j].left = boxX
  3.     spriteList[j].top = boxY
  4. }
复制代码

将剩下的素数重新排列在屏幕上
每移动一个精灵就播放音效
进入 Idle 控制节奏

6、 EndCollect → 收尾准备
javascript
  1. music.jumpDown.play()
  2. idleReturn = SieveSteps.DropBounce
复制代码

播放音效
准备进入炫酷掉落阶段

7、 DropBounce → 炫酷收尾
javascript
  1. for (let box of spriteList) {
  2.     box.ay = randint(100, 400)
  3. }
复制代码

给所有剩下的素数加上重力
让它们像跳跳糖一样弹起来
视觉效果拉满

8、 Idle → 节奏控制器
javascript
  1. if (idleCount > 0) {
  2.     idleCount -= 1
  3. } else if (idleCount == 0) {
  4.     step = idleReturn
  5. }
复制代码

控制每个阶段之间的节奏
让动画和逻辑有呼吸感,不会一口气跑完

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

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 7 小时前

【花雕动手做】基于Kitronik可编程开发板之塞维游戏

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

【花雕动手做】基于Kitronik可编程开发板之塞维游戏图1

实验场景记录

【花雕动手做】基于Kitronik可编程开发板之塞维游戏图2

【花雕动手做】基于Kitronik可编程开发板之塞维游戏图3

【花雕动手做】基于Kitronik可编程开发板之塞维游戏图4

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 7 小时前

【花雕动手做】基于Kitronik可编程开发板之塞维游戏

【花雕动手做】基于Kitronik可编程开发板之塞维游戏图1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail