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

[项目] 【花雕动手做】基于Kitronik可编程开发板之乒乓球小游戏

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

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

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

【花雕动手做】基于Kitronik可编程开发板之乒乓球小游戏图3

【花雕动手做】基于Kitronik可编程开发板之乒乓球小游戏图1

【花雕动手做】基于Kitronik可编程开发板之乒乓球小游戏图2

驴友花雕  中级技神
 楼主|

发表于 3 小时前

【花雕动手做】基于Kitronik可编程开发板之乒乓球小游戏

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

MicroPython实验参考代码

  1. @namespace
  2. class SpriteKind:
  3.     teft = SpriteKind.create()
  4.     left = SpriteKind.create()
  5. def left3():
  6.     global aaaaa
  7.     aaaaa = sprites.create(img("""
  8.             . . . . . . 2 7 f 8 . . . . . .
  9.             . . . . . . 2 7 f 8 . . . . . .
  10.             . . . . . . 2 7 f 8 . . . . . .
  11.             . . . . . . 2 1 f 8 . . . . . .
  12.             . . . . . . 2 7 f 8 . . . . . .
  13.             . . . . . . 2 7 f 8 . . . . . .
  14.             . . . . . . 2 7 f 8 . . . . . .
  15.             . . . . . . 2 1 f 8 . . . . . .
  16.             . . . . . . 2 7 f 8 . . . . . .
  17.             . . . . . . 2 7 f 8 . . . . . .
  18.             . . . . . . 2 7 f 8 . . . . . .
  19.             . . . . . . 2 1 f 8 . . . . . .
  20.             . . . . . . 2 7 f 8 . . . . . .
  21.             . . . . . . 2 7 f 8 . . . . . .
  22.             . . . . . . 2 7 f 8 . . . . . .
  23.             . . . . . . 2 7 f 8 . . . . . .
  24.             """),
  25.         SpriteKind.teft)
  26.     controller.player2.move_sprite(aaaaa, 0, 150)
  27.     aaaaa.right = 163
  28.     aaaaa.set_stay_in_screen(True)
  29. def left2():
  30.     global bbbbb
  31.     bbbbb = sprites.create(img("""
  32.             . . . . . . . 7 f 2 8 . . . . .
  33.             . . . . . . . 7 f 2 8 . . . . .
  34.             . . . . . . . 7 f 2 8 . . . . .
  35.             . . . . . . . 7 1 2 8 . . . . .
  36.             . . . . . . . 7 f 2 8 . . . . .
  37.             . . . . . . . 7 f 2 8 . . . . .
  38.             . . . . . . . 7 f 2 8 . . . . .
  39.             . . . . . . . 7 1 2 8 . . . . .
  40.             . . . . . . . 7 f 2 8 . . . . .
  41.             . . . . . . . 7 f 2 8 . . . . .
  42.             . . . . . . . 7 f 2 8 . . . . .
  43.             . . . . . . . 7 1 2 8 . . . . .
  44.             . . . . . . . 7 f 2 8 . . . . .
  45.             . . . . . . . 7 f 2 8 . . . . .
  46.             . . . . . . . 7 f 2 8 . . . . .
  47.             . . . . . . . 7 f 2 8 . . . . .
  48.             """),
  49.         SpriteKind.left)
  50.     controller.move_sprite(bbbbb, 0, 150)
  51.     bbbbb.right = 0
  52.     bbbbb.set_stay_in_screen(True)
  53. def on_on_overlap(sprite, otherSprite):
  54.     sprite.vx = sprite.vx * -1
  55.     info.change_score_by(1)
  56. sprites.on_overlap(SpriteKind.player, SpriteKind.left, on_on_overlap)
  57. def on_on_overlap2(sprite2, otherSprite2):
  58.     sprite2.vx = sprite2.vx * -1
  59.     info.player2.change_score_by(1)
  60. sprites.on_overlap(SpriteKind.player, SpriteKind.teft, on_on_overlap2)
  61. def ball():
  62.     global mySprite
  63.     mySprite = sprites.create(img("""
  64.             . . . . . . . . . . . . . . . .
  65.             . . . . . . . . . . . . . . . .
  66.             . . . . . . . . . . . . . . . .
  67.             . . . . . . . . . . . . . . . .
  68.             . . . . . . . . . . . . . . . .
  69.             . . . . . . 3 2 2 3 . . . . . .
  70.             . . . . . 3 1 1 1 1 3 . . . . .
  71.             . . . . . 2 1 1 1 1 2 . . . . .
  72.             . . . . . 2 1 1 1 1 2 . . . . .
  73.             . . . . . 3 1 1 1 1 3 . . . . .
  74.             . . . . . . 3 2 2 3 . . . . . .
  75.             . . . . . . . . . . . . . . . .
  76.             . . . . . . . . . . . . . . . .
  77.             . . . . . . . . . . . . . . . .
  78.             . . . . . . . . . . . . . . . .
  79.             . . . . . . . . . . . . . . . .
  80.             """),
  81.         SpriteKind.player)
  82.     mySprite.set_velocity(100, 100)
  83.     mySprite.set_bounce_on_wall(True)
  84.     mySprite.y = randint(0, 120)
  85. mySprite: Sprite = None
  86. bbbbb: Sprite = None
  87. aaaaa: Sprite = None
  88. ball()
  89. left2()
  90. left3()
复制代码


回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 小时前

【花雕动手做】基于Kitronik可编程开发板之乒乓球小游戏

乒乓球小游戏代码解读

这是一个经典的乒乓球(Pong)游戏,支持两名玩家对战。左侧玩家使用主控制器,右侧玩家使用第二个控制器,双方控制球拍击打乒乓球。
核心代码解析

1. 自定义精灵类型
python
  1. class SpriteKind:
  2.     teft = SpriteKind.create()  # 右侧球拍
  3.     left = SpriteKind.create()  # 左侧球拍
复制代码

创建了两种自定义精灵类型:teft(可能是"right"的拼写错误)和left

用于区分左侧和右侧的球拍

2. 球拍创建函数
右侧球拍创建
python
  1. def left3():
  2.     global aaaaa
  3.     aaaaa = sprites.create(img("""右侧球拍图像"""), SpriteKind.teft)
  4.     controller.player2.move_sprite(aaaaa, 0, 150)  # 玩家2控制,只能垂直移动
  5.     aaaaa.right = 163  # 定位到右侧
  6.     aaaaa.set_stay_in_screen(True)  # 限制在屏幕内
复制代码

创建右侧球拍,使用ASCII艺术定义外观

使用controller.player2(第二个控制器)控制,只能垂直移动(速度150)

将球拍定位到屏幕右侧(x=163)

限制球拍不能离开屏幕

左侧球拍创建
python
  1. def left2():
  2.     global bbbbb
  3.     bbbbb = sprites.create(img("""左侧球拍图像"""), SpriteKind.left)
  4.     controller.move_sprite(bbbbb, 0, 150)  # 玩家1控制,只能垂直移动
  5.     bbbbb.right = 0  # 定位到左侧
  6.     bbbbb.set_stay_in_screen(True)  # 限制在屏幕内
复制代码

创建左侧球拍,使用ASCII艺术定义外观

使用controller(第一个控制器)控制,只能垂直移动(速度150)

将球拍定位到屏幕左侧(x=0)

限制球拍不能离开屏幕

3. 碰撞检测系统
球与左侧球拍碰撞
python
  1. def on_on_overlap(sprite, otherSprite):
  2.     sprite.vx = sprite.vx * -1  # 球的水平速度反向
  3.     info.change_score_by(1)  # 玩家1得分+1
  4. sprites.on_overlap(SpriteKind.player, SpriteKind.left, on_on_overlap)
复制代码

当球与左侧球拍碰撞时,球的水平速度反向(反弹)

玩家1得分增加1分

球与右侧球拍碰撞
python
  1. def on_on_overlap2(sprite2, otherSprite2):
  2.     sprite2.vx = sprite2.vx * -1  # 球的水平速度反向
  3.     info.player2.change_score_by(1)  # 玩家2得分+1
  4. sprites.on_overlap(SpriteKind.player, SpriteKind.teft, on_on_overlap2)
复制代码

当球与右侧球拍碰撞时,球的水平速度反向(反弹)

玩家2得分增加1分

4. 球创建函数
python
  1. def ball():
  2.     global mySprite
  3.     mySprite = sprites.create(img("""球图像"""), SpriteKind.player)
  4.     mySprite.set_velocity(100, 100)  # 设置初始速度
  5.     mySprite.set_bounce_on_wall(True)  # 碰到墙壁反弹
  6.     mySprite.y = randint(0, 120)  # 随机垂直位置
复制代码

创建乒乓球,使用ASCII艺术定义外观

设置球的初始速度为(100, 100)

设置球碰到墙壁时反弹

球的初始垂直位置随机(0-120)

5. 游戏初始化
python
  1. mySprite: Sprite = None
  2. bbbbb: Sprite = None
  3. aaaaa: Sprite = None
  4. ball()    # 创建球
  5. left2()   # 创建左侧球拍
  6. left3()   # 创建右侧球拍
复制代码

声明全局变量

依次创建球、左侧球拍和右侧球拍

游戏机制总结
双人对战:支持两名玩家对战,分别控制左右球拍
控制方式:
玩家1(左侧):使用主控制器上下移动
玩家2(右侧):使用第二个控制器上下移动
得分系统:
球击中左侧球拍:玩家1得分
球击中右侧球拍:玩家2得分
物理系统:
球碰到墙壁会自动反弹
球碰到球拍会水平速度反向

技术特点
多控制器支持:使用controller和controller.player2分别控制两个球拍
自定义精灵类型:使用SpriteKind.create()创建自定义精灵类型
简单物理模拟:通过直接修改速度实现反弹效果
随机化:球的初始位置随机,增加游戏变化性

回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 小时前

【花雕动手做】基于Kitronik可编程开发板之乒乓球小游戏

图形编程参考实验程序

【花雕动手做】基于Kitronik可编程开发板之乒乓球小游戏图1
回复

使用道具 举报

驴友花雕  中级技神
 楼主|

发表于 3 小时前

【花雕动手做】基于Kitronik可编程开发板之乒乓球小游戏

本帖最后由 驴友花雕 于 2025-9-6 13:41 编辑

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

【花雕动手做】基于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