Kitronik ARCADE 是一款由英国教育科技公司 Kitronik 精心打造的可编程游戏机开发板,专为编程教学与创客实践而设计。该设备原生支持微软的 MakeCode Arcade 平台,用户可通过图形化或 JavaScript 编程方式,轻松创建、下载并运行复古风格的街机游戏。
它集成了彩色 LCD 显示屏、方向控制键、功能按键、蜂鸣器和震动马达等交互组件,提供完整的游戏输入输出体验。无论是初学者进行编程启蒙,还是创客群体开发交互式作品,Kitronik ARCADE 都能作为理想的硬件载体,助力创意实现。
凭借其开源友好、易于上手、兼容性强等特点,该开发板广泛应用于中小学编程课程、创客工作坊、游戏开发教学以及个人项目原型设计,深受教育者与技术爱好者的喜爱。

作为学习、练习与尝试,这里创建一个穿越热气球的小游戏。
打开网页版:https://arcade.makecode.com/,设置项目名称:穿越热气球
MicroPython实验代码
@namespace
class SpriteKind:
Background = SpriteKind.create()
Mountain = SpriteKind.create()
def spawnSomething(roll: number):
if roll <= 2:
createSaucer()
elif roll <= 6:
createTree()
elif roll <= 24:
createCloud()
elif roll <= 40:
createBird()
def createSaucer():
global saucerSpeed, saucer
if Math.percent_chance(50):
saucerSpeed = 40
else:
saucerSpeed = -40
saucer = sprites.create_projectile_from_side(img("""
.........fff.........
.......ff888ff.......
......f8888998f......
.....f888888998f.....
....f888a8a88998f....
...ff88888888898ff...
..fdddddddddddddddf..
.fbbbbbbbbbbbbbbbbbf.
fa9b9bb9bb9bb9bb9b9af
.facccccccccccccccaf.
..faacccccccccccaaf..
...ffaacccccccaaff...
.....fffffffffff.....
.....f999999999f.....
......fffffffff......
"""),
saucerSpeed,
0)
animation.run_image_animation(saucer, flyingSaucer, 400, True)
saucer.y = randint(10, scene.screen_height() - 10)
def createAnimationArrays():
global flyingSaucer, birdGoingLeft, birdGoingRight
flyingSaucer = [img("""
.........fff.........
.......ff888ff.......
......f8888998f......
.....f888888998f.....
....f888a8a88998f....
...ff88888888898ff...
..fdddddddddddddddf..
.fbbbbbbbbbbbbbbbbbf.
fa9b9bb9bb9bb9bb9b9af
.facccccccccccccccaf.
..faacccccccccccaaf..
...ffaacccccccaaff...
.....fffffffffff.....
.....f999999999f.....
......fffffffff......
"""),
img("""
.........fff.........
.......ff888ff.......
......f8888998f......
.....f888888998f.....
....f888a8a88998f....
...ff88888888898ff...
..fdddddddddddddddf..
.fbbbbbbbbbbbbbbbbbf.
fab4b44b44b44b44b4baf
.facccccccccccccccaf.
..faacccccccccccaaf..
...ffaacccccccaaff...
.....fffffffffff.....
.....f999999999f.....
......fffffffff......
""")]
birdGoingLeft = [img("""
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . f f f f . . . . . . . . .
. . f 8 8 8 8 f f f f . f f f .
. f 8 f 8 8 8 8 8 8 8 f 8 8 8 f
f 4 5 8 8 8 8 8 8 8 8 8 f f 8 f
f 5 5 5 8 8 f 8 8 8 8 8 8 8 f .
. f f f 8 8 8 f 8 8 8 8 8 8 f .
. . . . f f f f f 8 8 8 f f . .
. . . . . . . . f f f f . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
"""),
img("""
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . f f f f . . . . . . . . . .
. . f 8 8 8 8 f f f f . f f f . .
. f 8 f 8 8 8 8 8 f 8 f 8 8 8 f .
f 4 5 8 8 8 8 8 8 8 f 8 8 8 8 f .
f 5 5 5 8 8 f 8 8 8 8 f 8 8 f . .
. f f f 8 8 8 f 8 8 8 8 f 8 f . .
. . . . f f a f f 8 8 8 8 f f . .
. . . . . . . . f 8 8 8 f . . . .
. . . . . . . . . f 8 8 f . . . .
. . . . . . . . . . f f . . . . .
"""),
img("""
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . f f f f . . . . . . . . .
. . f 8 8 8 8 f f f f . f f f .
. f 8 f 8 8 8 8 8 8 8 f 8 8 8 f
f 4 5 8 8 8 8 8 8 8 8 8 f f 8 f
f 5 5 5 8 8 f 8 8 8 8 8 8 8 f .
. f f f 8 8 8 f 8 8 8 8 8 8 f .
. . . . f f f f f 8 8 8 f f . .
. . . . . . . . f f f f . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
"""),
img("""
. . . . . . . . . . . f f . . .
. . . . . . . . . . f 8 8 f . .
. . . f f f f . f f 8 8 8 f . .
. . f 8 8 8 8 f f 8 8 8 f f f .
. f 8 f 8 8 8 8 8 8 8 f 8 8 8 f
f 4 5 8 8 8 8 8 8 8 f 8 f f 8 f
f 5 5 5 8 8 8 8 8 f 8 8 8 8 f .
. f f f 8 8 8 8 8 8 8 8 8 8 f .
. . . . f f f f f 8 8 8 f f . .
. . . . . . . . f f f f . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
""")]
birdGoingRight = [img("""
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . f f f f . . .
. f f f . f f f f 8 8 8 8 f . .
f 8 8 8 f 8 8 8 8 8 8 8 f 8 f .
f 8 f f 8 8 8 8 8 8 8 8 8 5 4 f
. f 8 8 8 8 8 8 8 f 8 8 5 5 5 f
. f 8 8 8 8 8 8 f 8 8 8 f f f .
. . f f 8 8 8 f f f f f . . . .
. . . . f f f f . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
"""),
img("""
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . f f f f . . .
. f f f . f f f f 8 8 8 8 f . .
f 8 8 8 f 8 f 8 8 8 8 8 f 8 f .
f 8 8 8 8 f 8 8 8 8 8 8 8 5 4 f
. f 8 8 f 8 8 8 8 f 8 8 5 5 5 f
. f 8 f 8 8 8 8 f 8 8 8 f f f .
. . f f 8 8 8 8 f f f f . . . .
. . . f 8 8 8 f . . . . . . . .
. . . f 8 8 f . . . . . . . . .
. . . . f f . . . . . . . . . .
"""),
img("""
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . f f f f . . .
. f f f . f f f f 8 8 8 8 f . .
f 8 8 8 f 8 8 8 8 8 8 8 f 8 f .
f 8 f f 8 8 8 8 8 8 8 8 8 5 4 f
. f 8 8 8 8 8 8 8 f 8 8 5 5 5 f
. f 8 8 8 8 8 8 f 8 8 8 f f f .
. . f f 8 8 8 f f f f f . . . .
. . . . f f f f . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
"""),
img("""
. . . f f . . . . . . . . . . .
. . f 8 8 f . . . . . . . . . .
. . f 8 8 8 f f . f f f f . . .
. f f f 8 8 8 f f 8 8 8 8 f . .
f 8 8 8 f 8 8 8 8 8 8 8 f 8 f .
f 8 f f 8 f 8 8 8 8 8 8 8 5 4 f
. f 8 8 8 8 f 8 8 8 8 8 5 5 5 f
. f 8 8 8 8 8 8 8 8 8 8 f f f .
. . f f 8 8 8 f f f f f . . . .
. . . . f f f f . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
""")]
def createBird():
global saucerSpeed, chosenAnimation, bird
if Math.percent_chance(50):
saucerSpeed = 20
chosenAnimation = birdGoingRight
else:
saucerSpeed = -20
chosenAnimation = birdGoingLeft
bird = sprites.create_projectile_from_side(img("""
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . f f f f . . . . . . . . .
. . f 8 8 8 8 f f f f . f f f .
. f 8 f 8 8 8 8 8 8 8 f 8 8 8 f
f 4 5 8 8 8 8 8 8 8 8 8 f f 8 f
f 5 5 5 8 8 f 8 8 8 8 8 8 8 f .
. f f f 8 8 8 f 8 8 8 8 8 8 f .
. . . . f f f f f 8 8 8 f f . .
. . . . . . . . f f f f . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
"""),
saucerSpeed,
0)
animation.run_image_animation(bird, chosenAnimation, 100, True)
bird.y = randint(12, scene.screen_height() - 10)
def createCloud():
global cloudImages, cloud
cloudImages = [img("""
..................1111...............
................11111111.............
...............1111111111............
..............11111111111....11111...
..............111111111111.11111111..
.............11111111111111111111111.
........11111111111111111111111111111
.......111111111111111111111111111111
1111111111111111111111111111111111111
.111111111111111111111111111111111111
.......111111111111111111111111111111
.......................1111111111111.
"""),
img("""
. . . 1 1 1 1 . . . 1 1 . . . . . . . .
. . 1 1 1 1 1 1 . 1 1 1 1 . . . . . . .
. 1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . .
. 1 1 1 1 1 1 1 1 1 1 1 1 1 . 1 1 . . .
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 . . . . . . .
"""),
img("""
............111111...........
..........111111111..........
.........11111111111.........
........1111111111111........
........1111111111111........
........11111111111111.......
....111111111111111111111111.
...11111111111111111111111111
..111111111111111111111111111
..111111111111111111111111111
11111111111111111111111111111
.11111111111111111111.1.1111.
1........11111111111.....11..
11111111111111...............
""")]
cloud = sprites.create_projectile_from_side(cloudImages[randint(0, len(cloudImages) - 1)], -5, 0)
cloud.z = -10
cloud.set_flag(SpriteFlag.GHOST, True)
cloud.y = randint(0, scene.screen_height() * 0.6)
def on_on_overlap(sprite, otherSprite):
info.change_life_by(-1)
otherSprite.set_flag(SpriteFlag.GHOST, True)
sprite.say("ow!", 500)
sprites.on_overlap(SpriteKind.player, SpriteKind.projectile, on_on_overlap)
def placeMountain(leftPosition: number):
global lastCreatedMountain
lastCreatedMountain = sprites.create(mountains[randint(0, 1)], SpriteKind.Mountain)
lastCreatedMountain.set_flag(SpriteFlag.GHOST, True)
lastCreatedMountain.set_flag(SpriteFlag.AUTO_DESTROY, True)
lastCreatedMountain.bottom = scene.screen_height()
lastCreatedMountain.left = leftPosition
lastCreatedMountain.z = -15
def on_button_released():
balloon.ay = 50
effects.clear_particles(balloon)
balloon.set_image(balloonDeflated)
controller.any_button.on_event(ControllerButtonEvent.RELEASED, on_button_released)
def on_button_pressed():
balloon.start_effect(effects.fire)
balloon.start_effect(effects.fire)
balloon.ay = -50
balloon.set_image(balloonInflated)
controller.any_button.on_event(ControllerButtonEvent.PRESSED, on_button_pressed)
def createTree():
global tree
tree = sprites.create_projectile_from_side(img("""
. . . . . . . c c . . . . . . .
. . . . c c c 6 5 c 6 6 . . . .
. . . . c 6 c 5 5 c 7 6 . . . .
. . . 6 c c 7 5 5 7 c 6 6 . . .
. . c c 7 7 7 7 7 5 7 7 c 6 . .
. 6 6 6 c 6 7 7 7 7 6 c c 6 6 .
c 7 7 7 6 c 7 c 6 7 6 7 7 7 7 6
c c c 6 6 6 c 6 6 6 6 7 7 6 6 6
. c c 7 6 6 6 6 6 7 7 7 7 c 6 .
. c 7 7 6 6 7 6 6 7 7 6 7 7 c .
. c c c c 7 7 6 f 7 7 c c c c .
. . . . c 7 c f f c 7 c . . . .
. . . . . 6 f e e e c . . . . .
. . . . . e e e d e e . . . . .
"""),
-10,
0)
tree.z = -5
tree.bottom = scene.screen_height()
tree.set_flag(SpriteFlag.GHOST, True)
nearGroundCount = 0
tree: Sprite = None
cloud: Sprite = None
cloudImages: List[Image] = []
bird: Sprite = None
chosenAnimation: List[Image] = []
birdGoingRight: List[Image] = []
birdGoingLeft: List[Image] = []
flyingSaucer: List[Image] = []
saucer: Sprite = None
saucerSpeed = 0
lastCreatedMountain: Sprite = None
mountains: List[Image] = []
balloon: Sprite = None
balloonInflated: Image = None
balloonDeflated: Image = None
balloonDeflated = img("""
...................
...................
.......fffff.......
.....ff22222ff.....
....f222222442f....
...f22222222442f...
..f2222222222442f..
.f222322223222422f.
.f222322223222222f.
.f222322223222222f.
.f222232222322222f.
.f222222222222222f.
..f2222322232222f..
..f2222233322222f..
...ff222222222ff...
....ffff222ffff....
.....f.fffff.f.....
.....f.......f.....
.....f.......f.....
......f.....f......
......f.....f......
.......f...f.......
.......f.2.f.......
......fffffff......
.....fcccccccf.....
.....fcbbbbbcf.....
.....fcabbbacf.....
.....fcbaaabcf.....
.....fcbbbbbcf.....
.....fcabbbacf.....
.....fccaaaccf.....
......fcccccf......
.......fffff.......
""")
balloonInflated = img("""
...................
......fffffff......
....ff2222222ff....
...f22222222442f...
..f2222222222442f..
.f222222222222442f.
f22232222223222422f
f22232222223222222f
f22232222223222222f
f22223222222322222f
f22222222222222222f
f22222222222222222f
.f222232222232222f.
.f222223333322222f.
..ff22222222222ff..
....ffff222ffff....
.....f.fffff.f.....
.....f.......f.....
.....f.......f.....
......f.....f......
......f.....f......
.......f...f.......
.......f.2.f.......
......fffffff......
.....fcccccccf.....
.....fcbbbbbcf.....
.....fcabbbacf.....
.....fcbaaabcf.....
.....fcbbbbbcf.....
.....fcabbbacf.....
.....fccaaaccf.....
......fcccccf......
.......fffff.......
""")
music.set_volume(0)
balloon = sprites.create(balloonDeflated, SpriteKind.player)
scene.set_background_color(9)
balloon.ay = 35
balloon.set_stay_in_screen(True)
balloon.z = 100
info.set_score(0)
info.set_life(3)
createAnimationArrays()
mountains = [img("""
......................333333........................3333........................
...................333333333333...................3333333333....................
................333333333333333333..............3333333333333333................
.............33333333333333333333333.........333333333333333333333333...........
..........333333333333333333333333333......333333333333333333333333333333.......
........3333333333333333333333333333333..33333333333333333333333333bb33333333...
......333333333bb3333333333333333b33333b3333333333333333333333333bbbb333333333..
....333333333333b33333333333333333b333bb3333333333333333333333bbbbbbbb333333333.
..3333333333333bbb33b3333333333b33bbbbbbbb3b33333333333333b3bbbbbbbbbb3333333333
3333333333333333bb33b3333333333bbbbbbbbbbbbb33333333333333bbbbbbbbbbbbb3333b3333
3333333333333b33bbbbbb33b3b3bbbbbbbbbbbbbbbbb333333333b33bbbbbbbbbbbbbbbb33b3333
333333333333bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb3b333333bbbbbbbbbbbcbbbbbbbbbb3bb3
333333b33bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb333bbbbbbbbbcbbbcccbbbbbbbbb3b33
333b33bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbcbbcccccbccbbbbbbbbbb33
333bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccbccbbbbbbbbbb
33bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccbccbbbbbbcb
cbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccbccccccccccccbcccccccccccccbcbbcc
cccbcbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcbbcccbccccccccccccccccccbcccccccccccccbccccc
cccccbbcbbbbbbbbbbbbbbbbbbbbbbbbbcbcccccccccccccccccccccccccccccccccccccccbbcccc
ccccccccbcbcbbbbbbbbbbbbbbbbbbcbcccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccbbcbbbbcbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccbcbcbbbbbbcbcccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccbcccccccccccccccccbcbbcccccccccbcccccccccccccccccccccccccccccccccccccccccccc
ccccccbcccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccccccccccccccc
ccccbcccbcccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
"""),
img("""
....................3...........................................................
....................3...........................................................
...................333..........................................................
...................3333.........................................................
..................333333........................................................
..................33333333......................................................
.................33333333333....................................................
................33333333333333..................................................
...............3333333333333333.......................3.........................
..............333333333333333333...................33333........................
.............33333333333333333333...............333333333333....................
...........33333333333333333333333............3333333333333333..................
..........3333333333333333333333333..........3333333333333333333................
........3333333333333333333333333333.......3333333333333333333b333..............
.....33333333333333333333333333333333...333333333333333333333bbb3333..........3.
.33333333333333333333333333333333333333333333333333333333333bbbbb33333......3333
33333333333333333333333333333333333333333333333333333333333333b33333333333333333
333333333333333333333333333333333b333333333333333333333333333bb33333333333333333
333333333333333333333333333333b3bbb3b3333333333333333333333bbbbb333333333b333333
333333333333b33333333333333333bbbbbbb3333333333333333333bbbbbbbbb33333333bb33333
333333333b33b33b33b333333b33bbbbbbbbbb333333333333bbbbbbbbbbbbbbb33333333bbb3333
33333333bbbbbbbbbbbb3b333bbbbbbbbbbbbbb33333333bbbbbbbbbbbbbbbbbbb333333bbbb33b3
3333b3bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb3333bbbbbbbbbbbbbbbbbbbbbbb3b3bbbbbbbbb
c333bbbbbbbbbbbbbbbbbbbbbbbbbbbcbcbbbbbbbbb3bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbc
cccbbbbbbbbbbbbbbbbbbbbbbbbbcbbccccbbbbbbbbbbbbbbbbbbbbcbbbbbbbbbbbbbbbbbbbcbbcc
ccccbbbbbbbbbbbbbbbbbbbbbbbccccccbccbcbcbbbbbbbbbbbcbbccbbbbbbbbbbbbbbbbbbbcbccc
ccccccbcbbbbbbbbbbbbbbbbbccccccccccccccccbbbbbbbcbbcccccccbcbbbbbbbbbbbbbcbccccc
ccccccccbcbbbbbccbbbbbbcccccccccccccccccccccbcbcccccccccccccbbcbbbbbbbbbbccccccc
cbccccccccbbcbccccbbcbcccccccccccccccccccccccccccccccccccccccccbbbbbcccccccccbcc
cccccccccccccbbccbbbcccccbcbcccccccccccccccccccccccccccbccccbccccccccccccccccccc
ccccccccccccccccccccccccccbcbcccccccccccccccccccccccbccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
ccccccccccccccccccccccccccccccccccccccccccccccbccccccccccccccccccccccccccccccccc
ccccccbcbcbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccbccccccccc
ccccccccbcbccccccccccccccccccccccccccccccccccccccccccccccbcccccccccccccccccccccc
ccccccccccbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
""")]
sun = sprites.create(img("""
......................................................................444444444444444...........................................................................
..............................................................444444444444444444444444444444444.................................................................
........................................................44444444444444444444555555444444444444444444444.........................................................
.....................................................444444444444444444444555555555544444444444444444444444444444...............................................
..................................................44444444444444444444445555555555555544444444444444444444444444444.............................................
...............................................44444444444444444444444455555555555555554444444444444444444444444444444444444....................................
.......................................4444444444444444444444444444444455555555555555554444444444444444444444444444444444444444444444444........................
.................................444444444444444444444444444444444444455555555555555555544444444444444444444444444444444444444444444444444444444................
.........................44444444444444444444444444444444444444444444455555555555555555544444444444444444444444444444444444444444444444444444444444444444.......
44444.......444444444444444444444444444444444444444444444444444444444555555555555555555554444444444444444444444444444444444444444444444444444444444444444444....
444444444444444444444444444444444444444444444444444444444444444444444555555555555555555554444444444444444444444444444444444444444444444444444444444444444444444.
4444444444444444444444444444444444444444444444444444444444444444444445555555555555555555544444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444445555555555555555555544444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444445555555555555555555544444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444555555555555555555444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444555555555555555555444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444455555555555555554444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444455555555555555554444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444445555555555555544444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444455555555554444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444555555444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
4444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444444
"""),
SpriteKind.Background)
sun.bottom = scene.screen_height()
sun.set_flag(SpriteFlag.GHOST, True)
sun.z = -20
placeMountain(0)
placeMountain(lastCreatedMountain.right)
game.set_dialog_frame(img("""
...cc......................cc....
..c55c..bbbb...bbbbb......c55c...
.cb55bcbdddbbbbbdddbbbbbbcb55bc..
b555555bbdddb111bdddb11db555555b.
bb5555bbdbdb11111bdb1111bb5555bb.
cb5555bcddd11111ddd11111cb5555bc.
.c5bb5c1111d111d111d111ddc5bb5c..
.cbbbbc111111111111111111cbbbbc..
..b11111111111111111111111d111bb.
..b111111111111111111111111d1bdb.
..bb11111111111111111111111dbddb.
.bbdb1d11111111111111111111ddddb.
.bdddd11111111111111111111d1bdbb.
.bddbd11111111111111111111111bb..
.bdb1d111111111111111111111111b..
.bb111d11111111111111111111111b..
..b11111111111111111111111d111bb.
..b111111111111111111111111d1bdb.
..bb11111111111111111111111dbddb.
.bbdb1d11111111111111111111ddddb.
.bdddd11111111111111111111d1bdbb.
.bddbd11111111111111111111111bb..
.bdbb1111111111111111111111111b..
.bbbd1111111111111111111111111b..
..bcc111111111111111111111dccdb..
..c55c111d111d111d111d1111c55cb..
.cb55bcdd11111ddd11111dddcb55bc..
b555555b11111bdb11111bdbb555555b.
bb5555bbb111bdddb111bdddbb5555bb.
cb5555bcdbbbbbdddbbbbbddcb5555bc.
.c5bb5c.bb...bbbbb...bbbbc5bb5c..
.cbbbbc..................cbbbbc..
.................................
"""))
game.show_long_text("Stay in the air as long as you can! Hold any button to turn on the burner.",
DialogLayout.CENTER)
for index in range(2):
spawnSomething(randint(0, 40))
def on_on_update():
info.change_score_by(1)
game.on_update(on_on_update)
def on_on_update2():
balloon.vy = Math.constrain(balloon.vy, -25, 25)
game.on_update(on_on_update2)
def on_update_interval():
spawnSomething(randint(0, 100))
game.on_update_interval(750, on_update_interval)
def on_forever():
global nearGroundCount
nearGroundCount = -1
while balloon.bottom >= scene.screen_height() - 1:
balloon.say("pull up!", 100)
nearGroundCount += 1
if nearGroundCount > 25:
info.change_life_by(-1)
nearGroundCount = -20
pause(25)
forever(on_forever)
def on_update_interval2():
# changing position explicitly to avoid fractions of
# movement / clipping
for value in sprites.all_of_kind(SpriteKind.Mountain):
value.x += -1
if lastCreatedMountain.right < scene.screen_width():
placeMountain(lastCreatedMountain.right)
game.on_update_interval(200, on_update_interval2)
MakeCode 热气球穿越游戏代码解读
这是一个热气球飞行游戏,玩家需要控制热气球避开障碍物并尽可能长时间地保持在空中。
游戏概述
玩家控制一个热气球,通过按住任何按钮来启动燃烧器使气球上升,松开按钮则气球会下降。目标是避开飞碟、鸟类等障碍物,同时避免触地,尽可能获得高分。
代码结构分析
1. 自定义精灵类型
python
class SpriteKind:
Background = SpriteKind.create()
Mountain = SpriteKind.create()
创建了背景(Background)和山脉(Mountain)精灵类型
2. 障碍物生成系统
随机生成机制
python
def spawnSomething(roll: number):
根据随机数决定生成哪种障碍物:
1-2:飞碟 (2%概率)
3-6:树木 (4%概率)
7-24:云朵 (18%概率)
25-40:鸟类 (16%概率)
其他:不生成任何东西
飞碟(UFO)
python
def createSaucer():
随机选择向左或向右飞行
使用动画让飞碟看起来在旋转
随机出现在屏幕高度范围内
鸟类
python
def createBird():
随机选择飞行方向
使用不同的动画序列表示左右飞行
随机出现在屏幕中上部
云朵
python
def createCloud():
缓慢向左移动
设置为幽灵模式(不会发生碰撞)
随机出现在屏幕上部分
树木
python
def createTree():
从右侧生成并向左移动
放置在地面高度
设置为幽灵模式
3. 动画系统
python
def createAnimationArrays():
创建飞碟的旋转动画(2帧)
创建鸟类左右飞行的动画(各4帧)
创建多种云朵图像变体
4. 热气球控制系统
上升机制
python
def on_button_pressed():
balloon.start_effect(effects.fire) # 火焰特效
balloon.ay = -50 # 负加速度使气球上升
balloon.set_image(balloonInflated) # 切换到充气状态
按住任何按钮时启动燃烧器
产生火焰粒子效果
给气球负向加速度使其上升
切换到充气状态图像
下降机制
python
def on_button_released():
balloon.ay = 50 # 正加速度使气球下降
effects.clear_particles(balloon) # 清除火焰效果
balloon.set_image(balloonDeflated) # 切换到放气状态
松开按钮时停止燃烧器
给气球正向加速度使其下降
清除火焰粒子效果
切换到放气状态图像
5. 碰撞检测
python
def on_on_overlap(sprite, otherSprite):
info.change_life_by(-1) # 减少生命值
otherSprite.set_flag(SpriteFlag.GHOST, True) # 设置障碍物为幽灵模式
sprite.say("ow!", 500) # 显示受伤提示
热气球与障碍物碰撞时减少生命值
碰撞后障碍物变为幽灵模式(避免重复碰撞)
显示"ow!"提示
6. 游戏环境设置
山脉系统
python
def placeMountain(leftPosition: number):
创建随机选择的山脉图像
放置在地面位置
设置为幽灵模式和自动销毁
太阳背景
创建大型太阳图像作为背景元素
放置在地平线位置
设置为幽灵模式
7. 游戏机制
分数系统
python
def on_on_update():
info.change_score_by(1) # 每帧增加1分
游戏运行时间越长分数越高
高度限制
python
def on_on_update2():
balloon.vy = Math.constrain(balloon.vy, -25, 25) # 限制垂直速度
限制热气球的最大上升和下降速度
地面检测
python
def on_forever():
while balloon.bottom >= scene.screen_height() - 1:
balloon.say("pull up!", 100) # 提示拉起
if nearGroundCount > 25: # 长时间触地则减少生命
info.change_life_by(-1)
检测热气球是否接近或触地
长时间触地会减少生命值
显示"pull up!"警告提示
山脉移动
python
def on_update_interval2():
for value in sprites.all_of_kind(SpriteKind.Mountain):
value.x += -1 # 山脉向左移动
if lastCreatedMountain.right < scene.screen_width():
placeMountain(lastCreatedMountain.right) # 在右侧生成新山脉
山脉持续向左移动创造前进感
当最后一个山脉移出屏幕时在右侧生成新山脉
游戏玩法
控制:按住任何按钮使热气球上升,松开按钮使之下
目标:避开飞碟、鸟类等障碍物,避免触地
计分:生存时间越长分数越高
生命:初始3条生命,碰撞障碍物或长时间触地会减少生命
技术亮点
物理模拟:使用加速度控制热气球的上升和下降
多种障碍物:飞碟、鸟类、云朵、树木等不同类型的障碍物
动画系统:飞碟旋转和鸟类飞行动画
粒子效果:燃烧器火焰效果
无限地形:山脉持续生成创造无尽前进感
碰撞优化:碰撞后设置幽灵模式避免重复伤害
用户反馈:文字提示和视觉反馈
这个游戏展示了MakeCode的多种高级功能,包括物理模拟、动画控制、粒子效果、碰撞检测和游戏状态管理,是一个完整的小游戏示例。
图形编程参考实验程序

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

实验场景记录



评论