13浏览
查看: 13|回复: 5

[项目] 【花雕动手做】基于 Kitronik 可编程开发板之红色弹球

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

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

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

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球图3

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球图1

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球图2

驴友花雕  中级技神
 楼主|

发表于 昨天 19:43

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球


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

MicroPython实验参考代码




  1. @namespace
  2. class SpriteKind:
  3.     Projectile2 = SpriteKind.create()
  4.     snake = SpriteKind.create()
  5. def on_on_overlap(sprite, otherSprite):
  6.     global falling
  7.     falling = sprites.create(img("""
  8.             . . 2 2 2 2 . .
  9.             . 2 2 2 2 2 2 .
  10.             2 2 2 2 2 2 2 2
  11.             2 2 2 2 2 2 2 2
  12.             2 2 2 2 2 2 2 2
  13.             2 2 2 2 2 2 2 2
  14.             . 2 2 2 2 2 2 .
  15.             . . 2 2 2 2 . .
  16.             """),
  17.         SpriteKind.projectile)
  18.     falling.set_bounce_on_wall(True)
  19.     falling.set_position(sprite.x, sprite.y - 5)
  20.     falling.set_velocity(sprite.vx, 0 - sprite.vy)
  21.     falling.ay = sprite.ay
  22.     sprite.destroy()
  23. sprites.on_overlap(SpriteKind.Projectile2, SpriteKind.player, on_on_overlap)
  24. def on_on_overlap2(sprite2, otherSprite2):
  25.     info.set_score(info.score() + 1)
  26.     sprite2.destroy()
  27. sprites.on_overlap(SpriteKind.projectile, SpriteKind.player, on_on_overlap2)
  28. def on_hit_wall(sprite3, location):
  29.     if tiles.tile_at_location_equals(location, assets.tile("""
  30.         tile3
  31.         """)):
  32.         info.change_life_by(-1)
  33.         sprite3.destroy()
  34. scene.on_hit_wall(SpriteKind.Projectile2, on_hit_wall)
  35. def on_hit_wall2(sprite4, location2):
  36.     if tiles.tile_at_location_equals(location2, assets.tile("""
  37.         tile3
  38.         """)):
  39.         info.change_life_by(-1)
  40.         sprite4.destroy()
  41. scene.on_hit_wall(SpriteKind.projectile, on_hit_wall2)
  42. limit = 0
  43. falling: Sprite = None
  44. s4Dir = 1
  45. info.set_life(3)
  46. basket = sprites.create(img("""
  47.         . . . . . . . . . . . . . . . .
  48.         . . . . . . . . . . . . . . . .
  49.         . . . . . . . . . . . . . . . .
  50.         . . . . . . . . . . . . . . . .
  51.         . . . . . . . . . . . . . . . .
  52.         . . 7 7 7 7 7 7 7 7 7 7 7 . . .
  53.         . . 7 1 7 1 7 1 7 1 7 1 7 . . .
  54.         . . 7 1 7 1 7 1 7 1 7 1 7 . . .
  55.         . . 7 1 7 1 7 1 7 1 7 1 7 . . .
  56.         . . 7 1 7 1 7 1 7 1 7 1 7 . . .
  57.         . . 7 1 7 1 7 1 7 1 7 1 7 . . .
  58.         . . 7 1 7 1 7 1 7 1 7 1 7 . . .
  59.         . . 7 1 7 1 7 1 7 1 7 1 7 . . .
  60.         . . 7 1 7 1 7 1 7 1 7 1 7 . . .
  61.         . . 7 7 7 7 7 7 7 7 7 7 7 . . .
  62.         . . . . . . . . . . . . . . . .
  63.         """),
  64.     SpriteKind.player)
  65. basket.set_position(80, 100)
  66. controller.move_sprite(basket, 160, 0)
  67. mySprite4 = sprites.create(img("""
  68.         . . . . . . . . . . . . . . . .
  69.         . 8 8 8 8 8 8 8 1 1 1 1 1 . . .
  70.         8 8 8 8 8 8 8 8 1 1 1 1 1 1 . .
  71.         8 8 8 8 8 8 8 8 1 1 1 1 1 1 . .
  72.         8 8 8 8 8 8 8 8 1 1 1 1 1 1 . .
  73.         8 8 8 8 8 1 8 8 1 1 1 1 1 1 . .
  74.         8 8 8 8 8 1 1 8 1 1 1 1 1 1 . .
  75.         8 8 8 8 8 1 1 1 1 1 1 1 1 1 . .
  76.         8 8 8 8 8 1 1 1 1 1 1 1 1 1 . .
  77.         8 8 8 8 8 1 1 8 1 1 1 1 1 1 . .
  78.         8 8 8 8 8 1 8 8 1 1 1 1 1 1 . .
  79.         8 8 8 8 8 8 8 8 1 1 1 1 1 1 . .
  80.         8 8 8 8 8 8 8 8 1 1 1 1 1 1 . .
  81.         . 8 8 8 8 8 8 8 1 1 1 1 1 . . .
  82.         . . . 8 8 8 . . . . . . . . . .
  83.         . . . . . . . . . . . . . . . .
  84.         """),
  85.     SpriteKind.snake)
  86. mySprite4.set_flag(SpriteFlag.GHOST, True)
  87. mySprite4.set_position(-7, 100)
  88. tiles.set_tilemap(tilemap("""
  89.     level
  90.     """))
  91. def on_update_interval():
  92.     global s4Dir
  93.     mySprite4.vx = 10 * s4Dir
  94.     s4Dir = s4Dir * -1
  95. game.on_update_interval(2200, on_update_interval)
  96. def on_update_interval2():
  97.     global falling, limit
  98.     if info.score() < 10 or randint(1, min(50, info.score())) < 10:
  99.         falling = sprites.create(img("""
  100.                 . . 2 2 2 2 . .
  101.                 . 2 2 2 2 2 2 .
  102.                 2 2 2 2 2 2 2 2
  103.                 2 2 2 2 2 2 2 2
  104.                 2 2 2 2 2 2 2 2
  105.                 2 2 2 2 2 2 2 2
  106.                 . 2 2 2 2 2 2 .
  107.                 . . 2 2 2 2 . .
  108.                 """),
  109.             SpriteKind.projectile)
  110.     else:
  111.         falling = sprites.create(img("""
  112.                 . . 8 8 8 8 . .
  113.                 . 8 8 8 8 8 8 .
  114.                 8 8 8 8 8 8 8 8
  115.                 8 8 8 8 8 8 8 8
  116.                 8 8 8 8 8 8 8 8
  117.                 8 8 8 8 8 8 8 8
  118.                 . 8 8 8 8 8 8 .
  119.                 . . 8 8 8 8 . .
  120.                 """),
  121.             SpriteKind.Projectile2)
  122.     falling.set_position(randint(20, 140), 20)
  123.     limit = min(10, info.score())
  124.     falling.set_velocity(randint(-100, 100), randint(0 - limit, 5))
  125.     falling.ay = 20
  126.     falling.set_bounce_on_wall(True)
  127. game.on_update_interval(2000, on_update_interval2)
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:47

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球

这是一个弹球收集游戏,玩家控制底部的篮子接住从上方落下的弹球。游戏包含两种弹球:普通弹球(得分)和特殊弹球(需要反弹处理)。玩家有3条生命,碰到危险墙壁会失去生命。

核心代码解析

1. 自定义精灵类型
python
  1. @namespace
  2. class SpriteKind:
  3.     Projectile2 = SpriteKind.create()  # 特殊弹球(需要反弹)
  4.     snake = SpriteKind.create()         # 蛇形障碍物
复制代码


2. 碰撞检测系统
特殊弹球与玩家碰撞
python
  1. def on_on_overlap(sprite, otherSprite):
  2.     global falling
  3.     falling = sprites.create(img("""新弹球"""), SpriteKind.projectile)
  4.     falling.set_bounce_on_wall(True)
  5.     falling.set_position(sprite.x, sprite.y - 5)
  6.     falling.set_velocity(sprite.vx, 0 - sprite.vy)  # 速度反向
  7.     falling.ay = sprite.ay  # 保持相同的重力加速度
  8.     sprite.destroy()  # 销毁原弹球
复制代码

当特殊弹球(Projectile2)碰到玩家篮子时

创建一个新的普通弹球,位置略高于原弹球

设置反弹速度(垂直方向反向)

保持相同的重力加速度

销毁原特殊弹球

普通弹球与玩家碰撞
python
  1. def on_on_overlap2(sprite2, otherSprite2):
  2.     info.set_score(info.score() + 1)  # 得分+1
  3.     sprite2.destroy()  # 销毁弹球
复制代码

当普通弹球碰到玩家篮子时

玩家得分增加1分

销毁弹球

弹球碰到危险墙壁
python
  1. def on_hit_wall(sprite3, location):
  2.     if tiles.tile_at_location_equals(location, assets.tile("tile3")):
  3.         info.change_life_by(-1)  # 生命值-1
  4.         sprite3.destroy()  # 销毁弹球
复制代码

当特殊弹球碰到特定瓦片(tile3)时

玩家失去1条生命

销毁弹球

python
  1. def on_hit_wall2(sprite4, location2):
  2.     if tiles.tile_at_location_equals(location2, assets.tile("tile3")):
  3.         info.change_life_by(-1)  # 生命值-1
  4.         sprite4.destroy()  # 销毁弹球
复制代码

当普通弹球碰到特定瓦片(tile3)时

玩家失去1条生命

销毁弹球

3. 游戏初始化
玩家设置
python
  1. info.set_life(3)  # 设置3条生命
  2. basket = sprites.create(img("""篮子图像"""), SpriteKind.player)
  3. basket.set_position(80, 100)  # 底部中央位置
  4. controller.move_sprite(basket, 160, 0)  # 只能水平移动
复制代码

玩家有3条生命

创建篮子精灵,使用ASCII艺术定义外观

将篮子放置在屏幕底部中央

设置只能水平移动(速度160)

蛇形障碍物
python
  1. mySprite4 = sprites.create(img("""蛇图像"""), SpriteKind.snake)
  2. mySprite4.set_flag(SpriteFlag.GHOST, True)  # 设置为幽灵模式(无碰撞)
  3. mySprite4.set_position(-7, 100)  # 初始位置在左侧外部
复制代码

创建蛇形障碍物,但设置为幽灵模式(不参与碰撞检测)

初始位置在屏幕左侧外部

游戏场景
python
  1. tiles.set_tilemap(tilemap("level"))  # 设置瓦片地图
复制代码

使用名为"level"的瓦片地图

4. 游戏循环与更新
蛇形障碍物移动
python
  1. def on_update_interval():
  2.     global s4Dir
  3.     mySprite4.vx = 10 * s4Dir  # 设置水平速度
  4.     s4Dir = s4Dir * -1  # 方向反转
  5. game.on_update_interval(2200, on_update_interval)  # 每2200ms更新一次
复制代码

蛇形障碍物每2.2秒改变一次移动方向

在左右方向之间来回移动

弹球生成系统
python
  1. def on_update_interval2():
  2.     global falling, limit
  3.     if info.score() < 10 or randint(1, min(50, info.score())) < 10:
  4.         falling = sprites.create(img("""红色弹球"""), SpriteKind.projectile)  # 普通弹球
  5.     else:
  6.         falling = sprites.create(img("""蓝色弹球"""), SpriteKind.Projectile2)  # 特殊弹球
  7.    
  8.     falling.set_position(randint(20, 140), 20)  # 随机水平位置,顶部
  9.     limit = min(10, info.score())  # 根据得分限制速度范围
  10.     falling.set_velocity(randint(-100, 100), randint(0 - limit, 5))  # 随机速度
  11.     falling.ay = 20  # 重力加速度
  12.     falling.set_bounce_on_wall(True)  # 开启墙壁反弹
  13. game.on_update_interval(2000, on_update_interval2)  # 每2000ms生成一个弹球
复制代码

每2秒生成一个新的弹球

根据得分决定生成普通弹球还是特殊弹球:

得分低于10时,主要生成普通弹球

得分高于10时,有概率生成特殊弹球

弹球从顶部随机位置生成

弹球具有随机速度和方向

设置重力加速度使弹球下落

开启墙壁反弹功能

游戏机制总结
控制方式:左右移动篮子接住弹球

得分系统:接住普通弹球得1分

生命系统:初始3条生命,弹球碰到危险墙壁失去1条生命

弹球类型:

普通弹球:直接得分

特殊弹球:需要反弹后才能接住

难度递增:随着得分增加,出现更多特殊弹球

技术特点
动态难度:根据玩家得分调整弹球类型和速度

物理模拟:使用速度、重力和反弹模拟弹球运动

瓦片地图:使用瓦片地图定义游戏场景和危险区域

幽灵模式:蛇形障碍物使用幽灵模式避免不必要的碰撞

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:51

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球

图形编程参考实验程序

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:53

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球

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

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球图1

实验场景记录

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球图3


【花雕动手做】基于 Kitronik 可编程开发板之红色弹球图2

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球图4

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 昨天 19:56

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球

【花雕动手做】基于 Kitronik 可编程开发板之红色弹球图1
回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail