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

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

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

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

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

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

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

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

驴友花雕  中级技神
 楼主|

发表于 2 小时前

【花雕动手做】基于Kitronik可编程开发板之打砖块游戏


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

MicroPython实验代码



  1. @namespace
  2. class SpriteKind:
  3.     block = SpriteKind.create()
  4. def getPos(sprite: Sprite, otherSprite: Sprite):
  5.     global direction
  6.     if sprite.x < otherSprite.x - 8 or sprite.x > otherSprite.x + 8:
  7.         direction = 1
  8.     else:
  9.         direction = 0
  10. def on_on_overlap(sprite2, otherSprite2):
  11.     sprite2.set_velocity(sprite2.vx, -1 * sprite2.vy)
  12. sprites.on_overlap(SpriteKind.projectile, SpriteKind.player, on_on_overlap)
  13. def on_on_overlap2(sprite3, otherSprite3):
  14.     info.change_score_by(1)
  15.     getPos(sprite3, otherSprite3)
  16.     if direction == 1:
  17.         sprite3.set_velocity(-1 * sprite3.vx, sprite3.vy)
  18.     else:
  19.         sprite3.set_velocity(sprite3.vx, -1 * sprite3.vy)
  20.     otherSprite3.destroy()
  21. sprites.on_overlap(SpriteKind.projectile, SpriteKind.block, on_on_overlap2)
  22. direction = 0
  23. tile: Sprite = None
  24. tilePick = 0
  25. x = 0
  26. paddle = sprites.create(img("""
  27.         ................................
  28.         ................................
  29.         ................................
  30.         ................................
  31.         ................................
  32.         ................................
  33.         ................................
  34.         ................................
  35.         ................................
  36.         ................................
  37.         ................................
  38.         ................................
  39.         ................................
  40.         ................................
  41.         ................................
  42.         ................................
  43.         ................................
  44.         ................................
  45.         ................................
  46.         ................................
  47.         ................................
  48.         ................................
  49.         ................................
  50.         ................................
  51.         ................................
  52.         ....bbbbbbbbbbbbbbbbbbbbbb......
  53.         ....bbbbbbbbbbbbbbbbbbbbbb......
  54.         ....bbbbbbbbbbbbbbbbbbbbbb......
  55.         ................................
  56.         ................................
  57.         ................................
  58.         ................................
  59.         """),
  60.     SpriteKind.player)
  61. paddle.set_position(79, 100)
  62. paddle.set_stay_in_screen(True)
  63. controller.move_sprite(paddle, 100, 0)
  64. projectile = sprites.create_projectile_from_sprite(img("""
  65.         . . . . . . . . . . . . . . . .
  66.         . . . . . . . . . . . . . . . .
  67.         . . . . . . . . . . . . . . . .
  68.         . . . . . . . . . . . . . . . .
  69.         . . . . . . . . . . . . . . . .
  70.         . . . . . . . . . . . . . . . .
  71.         . . . . . . 9 9 9 . . . . . . .
  72.         . . . . . 9 6 7 6 9 . . . . . .
  73.         . . . . 9 6 7 6 7 6 9 . . . . .
  74.         . . . . 1 7 1 7 1 7 1 . . . . .
  75.         . . . . 8 6 7 6 7 6 8 . . . . .
  76.         . . . . . 8 6 7 6 8 . . . . . .
  77.         . . . . . . 8 8 8 . . . . . . .
  78.         . . . . . . . . . . . . . . . .
  79.         . . . . . . . . . . . . . . . .
  80.         . . . . . . . . . . . . . . . .
  81.         """),
  82.     paddle,
  83.     50,
  84.     -55)
  85. projectile.set_flag(SpriteFlag.DESTROY_ON_WALL, False)
  86. projectile.set_bounce_on_wall(True)
  87. for index in range(10):
  88.     for index2 in range(3):
  89.         x = index * 18
  90.         if index2 % 2 == 1:
  91.             x = index * 18 + 8
  92.         tilePick = randint(0, 2)
  93.         if tilePick == 0:
  94.             tile = sprites.create(img("""
  95.                     8 8 1 1 8 8 6 6 1 7 7 7 1 8 8 9
  96.                     8 8 9 1 1 6 6 9 9 8 8 7 1 8 8 9
  97.                     7 6 9 9 9 8 8 7 9 8 8 6 6 1 9 9
  98.                     7 6 6 1 1 8 8 7 9 1 6 6 1 1 9 9
  99.                     7 7 6 1 1 6 6 7 7 8 8 1 1 1 7 9
  100.                     8 8 9 1 6 6 9 9 9 8 8 1 6 1 7 9
  101.                     8 8 9 9 9 7 8 8 9 6 6 1 6 6 7 7
  102.                     7 7 7 8 8 7 8 8 6 6 9 9 9 6 8 8
  103.                     7 6 6 8 8 7 7 6 1 7 7 7 9 1 8 8
  104.                     6 6 7 7 7 1 1 6 6 7 1 8 8 7 7 7
  105.                     1 1 7 9 9 9 1 1 6 1 1 8 8 7 1 9
  106.                     8 8 1 1 6 9 8 8 6 1 9 9 9 1 1 9
  107.                     8 8 9 1 6 6 8 8 6 6 8 8 9 1 9 9
  108.                     7 6 9 9 9 6 9 9 9 6 8 8 6 6 7 7
  109.                     7 6 6 8 8 1 6 6 9 7 9 6 6 8 8 7
  110.                     7 7 6 8 8 6 6 7 7 7 9 9 9 8 8 7
  111.                     """),
  112.                 SpriteKind.block)
  113.         elif tilePick == 1:
  114.             tile = sprites.create(img("""
  115.                     3 d 1 3 3 3 3 3 3 3 3 3 3 3 3 3
  116.                     3 d 1 3 d d d d d d d d d d d 3
  117.                     3 d 1 3 d 1 1 1 1 1 1 1 1 1 d 3
  118.                     3 d 1 3 d 1 3 3 3 3 3 3 3 1 d 3
  119.                     3 d 1 3 d 1 3 d d d d d 3 1 d 3
  120.                     3 d 1 3 d 1 3 d 1 1 1 d 3 1 d 3
  121.                     3 d 1 3 d 1 3 d 1 3 1 d 3 1 d 3
  122.                     3 d 1 3 d 1 3 d 1 3 1 d 3 1 d 3
  123.                     3 d 1 3 d 1 3 d d 3 1 d 3 1 d 3
  124.                     3 d 1 3 d 1 3 3 3 3 1 d 3 1 d 3
  125.                     3 d 1 3 d 1 1 1 1 1 1 d 3 1 d 3
  126.                     3 d 1 3 d d d d d d d d 3 1 d 3
  127.                     3 d 1 3 3 3 3 3 3 3 3 3 3 1 d 3
  128.                     3 d 1 1 1 1 1 1 1 1 1 1 1 1 d 3
  129.                     3 d d d d d d d d d d d d d d 3
  130.                     3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
  131.                     """),
  132.                 SpriteKind.block)
  133.         else:
  134.             tile = sprites.create(img("""
  135.                     2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1
  136.                     1 2 2 2 2 2 2 2 1 1 1 4 4 4 4 4
  137.                     1 1 2 2 2 2 2 4 4 4 4 4 4 4 4 4
  138.                     4 4 4 2 2 5 5 5 5 5 5 4 4 4 4 4
  139.                     4 4 4 4 2 2 2 2 2 5 5 5 5 5 4 4
  140.                     4 4 b b b b b b b 5 5 5 5 5 5 5
  141.                     b b b b b b b 5 5 5 5 5 2 2 2 2
  142.                     b b b b 5 5 5 5 5 5 5 5 5 5 2 2
  143.                     b b b 2 2 2 2 2 2 2 2 2 1 1 1 1
  144.                     1 1 1 1 1 1 2 2 2 1 1 1 1 1 1 1
  145.                     1 1 4 4 2 2 2 2 2 2 2 1 1 1 1 1
  146.                     4 4 4 4 4 4 2 2 2 2 2 2 2 2 2 4
  147.                     4 4 4 5 5 5 5 5 5 5 5 5 4 4 4 4
  148.                     5 5 5 5 5 5 5 5 5 4 4 4 4 4 4 4
  149.                     b b b b b 5 5 5 5 5 5 5 5 4 4 4
  150.                     . b b b b b b b b b b b 4 4 4 4
  151.                     """),
  152.                 SpriteKind.block)
  153.         tile.set_position(x, index2 * 18 + 20)
  154. info.set_score(1)
  155. scene.set_background_color(13)
  156. direction = 1
  157. def on_forever():
  158.     if projectile.bottom > 119:
  159.         game.over(False, effects.slash)
  160.     if info.score() == 30:
  161.         game.over(True, effects.bubbles)
  162. forever(on_forever)
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

【花雕动手做】基于Kitronik可编程开发板之打砖块游戏

这段代码是用 MakeCode Arcade 编写的一个经典的 打砖块游戏(Breakout)。它融合了玩家控制、弹球物理、砖块碰撞、得分系统和游戏胜负判定等机制。解读如下:

一、游戏核心机制概览

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

二、代码逐段解析
1、玩家挡板初始化
python
  1. paddle = sprites.create(..., SpriteKind.player)
  2. paddle.set_position(79, 100)
  3. controller.move_sprite(paddle, 100, 0)
复制代码

创建一个宽大的挡板精灵

设置初始位置在屏幕底部

允许玩家左右移动(X 轴速度为 100)

2、弹球初始化
python
  1. projectile = sprites.create_projectile_from_sprite(..., paddle, 50, -55)
  2. projectile.set_bounce_on_wall(True)
  3. projectile.set_flag(SpriteFlag.DESTROY_ON_WALL, False)
复制代码

从挡板发射一个弹球,初始速度向上

设置为可在墙壁上反弹

不在碰到墙壁时销毁,保持游戏持续性

3、砖块阵列生成
python
  1. for index in range(10):
  2.     for index2 in range(3):
  3.         ...
  4.         tilePick = randint(0, 2)
  5.         tile = sprites.create(..., SpriteKind.block)
  6.         tile.set_position(x, index2 * 18 + 20)
复制代码

创建 10×3 的砖块阵列

每个砖块随机选择一种图案

使用 SpriteKind.block 类型,便于碰撞检测

4、碰撞逻辑:弹球与挡板
python
  1. sprites.on_overlap(SpriteKind.projectile, SpriteKind.player, on_on_overlap)
  2. def on_on_overlap(sprite2, otherSprite2):
  3.     sprite2.set_velocity(sprite2.vx, -1 * sprite2.vy)
复制代码

弹球碰到挡板时,垂直速度反向,实现反弹效果

5、 碰撞逻辑:弹球与砖块
python
  1. sprites.on_overlap(SpriteKind.projectile, SpriteKind.block, on_on_overlap2)
  2. def on_on_overlap2(sprite3, otherSprite3):
  3.     info.change_score_by(1)
  4.     getPos(sprite3, otherSprite3)
  5.     ...
  6.     otherSprite3.destroy()
复制代码

得分 +1

判断弹球与砖块的相对位置,决定反弹方向

销毁被击中的砖块

6、反弹方向判断函数
python
  1. def getPos(sprite, otherSprite):
  2.     if sprite.x < otherSprite.x - 8 or sprite.x > otherSprite.x + 8:
  3.         direction = 1
  4.     else:
  5.         direction = 0
复制代码

判断弹球是否击中砖块的边缘或中心

边缘碰撞则水平速度反向,中心则垂直速度反向

7、游戏胜负判定
python
  1. def on_forever():
  2.     if projectile.bottom > 119:
  3.         game.over(False, effects.slash)
  4.     if info.score() == 30:
  5.         game.over(True, effects.bubbles)
复制代码

弹球掉出底部:游戏失败,播放斩击特效

得分达到 30:游戏胜利,播放气泡特效


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

【花雕动手做】基于Kitronik可编程开发板之打砖块游戏

图形编程参考实验程序

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

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 2 小时前

【花雕动手做】基于Kitronik可编程开发板之打砖块游戏

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

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

实验场景记录

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

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

回复

使用道具 举报

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

本版积分规则

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

硬件清单

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

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

mail