驴友花雕 发表于 2025-9-23 17:09:25

【花雕动手做】基于Kitronik可编程开发板之板条箱地牢



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

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

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





驴友花雕 发表于 2025-9-23 17:11:05

【花雕动手做】基于Kitronik可编程开发板之板条箱地牢

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

MicroPython实验代码

@namespace
class SpriteKind:
    Stupid = SpriteKind.create()
    PlaceHolder = SpriteKind.create()
    Box = SpriteKind.create()
    Item = SpriteKind.create()
    Book = SpriteKind.create()

def on_overlap_tile(sprite, location):
    tiles.set_tile_at(location, assets.tile("""
      transparency8
      """))
    tiles.set_wall_at(location, False)
scene.on_overlap_tile(SpriteKind.food,
    assets.tile("""
      breakible wall0
      """),
    on_overlap_tile)

# WALLS ARE BUGGY FIX LTR
def PushTiles(Pusher: Sprite, Pushing: Sprite):
    characterAnimations.clear_character_state(Pushing)
    sprites.set_data_boolean(Pushing, "RecentlyPushed", True)
    if characterAnimations.matches_rule(Pusher, characterAnimations.rule(Predicate.MOVING_LEFT)):
      if not (tiles.tile_at_location_is_wall(grid.add(grid.get_location(Pushing), -1, 0))):
            characterAnimations.set_character_state(Pushing, characterAnimations.rule(Predicate.MOVING_LEFT))
            grid.move(Pushing, -1, 0)
      else:
            grid.move(sprites.read_data_sprite(Something, "S-Control"), 1, 0)
            if Pusher.kind() == SpriteKind.Box:
                characterAnimations.set_character_state(Pusher, characterAnimations.rule(Predicate.MOVING_RIGHT))
                grid.move(Pusher, 1, 0)
    if characterAnimations.matches_rule(Pusher, characterAnimations.rule(Predicate.MOVING_RIGHT)):
      if not (tiles.tile_at_location_is_wall(grid.add(grid.get_location(Pushing), 1, 0))):
            characterAnimations.set_character_state(Pushing, characterAnimations.rule(Predicate.MOVING_RIGHT))
            grid.move(Pushing, 1, 0)
      else:
            grid.move(sprites.read_data_sprite(Something, "S-Control"), -1, 0)
            if Pusher.kind() == SpriteKind.Box:
                characterAnimations.set_character_state(Pusher, characterAnimations.rule(Predicate.MOVING_LEFT))
                grid.move(Pusher, -1, 0)
    if characterAnimations.matches_rule(Pusher, characterAnimations.rule(Predicate.MOVING_DOWN)):
      if not (tiles.tile_at_location_is_wall(grid.add(grid.get_location(Pushing), 0, 1))):
            characterAnimations.set_character_state(Pushing, characterAnimations.rule(Predicate.MOVING_DOWN))
            grid.move(Pushing, 0, 1)
      else:
            grid.move(sprites.read_data_sprite(Something, "S-Control"), 0, -1)
            if Pusher.kind() == SpriteKind.Box:
                characterAnimations.set_character_state(Pusher, characterAnimations.rule(Predicate.MOVING_UP))
                grid.move(Pusher, 0, -1)
    if characterAnimations.matches_rule(Pusher, characterAnimations.rule(Predicate.MOVING_UP)):
      if not (tiles.tile_at_location_is_wall(grid.add(grid.get_location(Pushing), 0, -1))):
            characterAnimations.set_character_state(Pushing, characterAnimations.rule(Predicate.MOVING_UP))
            grid.move(Pushing, 0, -1)
      else:
            grid.move(sprites.read_data_sprite(Something, "S-Control"), 0, 1)
            if Pusher.kind() == SpriteKind.Box:
                characterAnimations.set_character_state(Pusher, characterAnimations.rule(Predicate.MOVING_DOWN))
                grid.move(Pusher, 0, 1)
   
    def on_after():
      sprites.set_data_boolean(Pushing, "RecentlyPushed", False)
    timer.after(100, on_after)
   
   
    def on_background():
      pass
    timer.background(on_background)
   

def on_create_renderable(screen2):
    if lvl >= 17 and not (lvl == 99):
      screen2.replace(11, 8)
      screen2.replace(15, 12)
spriteutils.create_renderable(0, on_create_renderable)

def on_overlap_tile2(sprite2, location2):
    Customeffects("Fall", sprite2, True, 1, 1, 100)
    sprites.destroy(sprite2)
    tiles.set_tile_at(location2, assets.tile("""
      BoxCovering Pit
      """))
scene.on_overlap_tile(SpriteKind.Box,
    assets.tile("""
      Pit
      """),
    on_overlap_tile2)

def on_overlap_tile3(sprite3, location3):
    if sprites.read_data_string(sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand"),
      "I-Type") == "Key":
      tiles.set_tile_at(location3, assets.tile("""
            transparency8
            """))
      Customeffects("Twinkle", sprite3, True, 1, 1, 200)
      sprites.set_data_string(sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand"),
            "I-Type",
            "Null")
      sprites.destroy(sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand"))
    else:
      if characterAnimations.matches_rule(sprites.read_data_sprite(Something, "S-Control"),
            characterAnimations.rule(Predicate.MOVING_LEFT)):
            grid.move(sprites.read_data_sprite(Something, "S-Control"), 1, 0)
      if characterAnimations.matches_rule(sprites.read_data_sprite(Something, "S-Control"),
            characterAnimations.rule(SpriteKind.player)):
            grid.move(sprites.read_data_sprite(Something, "S-Control"), -1, 0)
      if characterAnimations.matches_rule(sprites.read_data_sprite(Something, "S-Control"),
            characterAnimations.rule(Predicate.MOVING_UP)):
            grid.move(sprites.read_data_sprite(Something, "S-Control"), 0, 1)
      if characterAnimations.matches_rule(sprites.read_data_sprite(Something, "S-Control"),
            characterAnimations.rule(Predicate.MOVING_DOWN)):
            grid.move(sprites.read_data_sprite(Something, "S-Control"), 0, -1)
scene.on_overlap_tile(SpriteKind.player,
    assets.tile("""
      Lock
      """),
    on_overlap_tile3)

def on_on_overlap(sprite4, otherSprite):
    if controller.A.is_pressed():
      sprites.set_data_sprite(sprite4, "H-Hand", otherSprite)
      music.play(music.create_sound_effect(WaveShape.NOISE,
                1,
                973,
                98,
                0,
                100,
                SoundExpressionEffect.VIBRATO,
                InterpolationCurve.LINEAR),
            music.PlaybackMode.IN_BACKGROUND)
sprites.on_overlap(SpriteKind.player, SpriteKind.Item, on_on_overlap)

def on_overlap_tile4(sprite5, location4):
    tiles.set_tile_at(location4, assets.tile("""
      transparency8
      """))
    tiles.set_wall_at(location4, False)
scene.on_overlap_tile(SpriteKind.food,
    assets.tile("""
      Cannon LR
      """),
    on_overlap_tile4)

def on_overlap_tile5(sprite6, location5):
    tiles.set_tile_at(location5, assets.tile("""
      transparency8
      """))
    Customeffects("Twinkle", sprite6, True, 1, 1, 500)
    SwapBlocks(1)
scene.on_overlap_tile(SpriteKind.player,
    assets.tile("""
      RButton2
      """),
    on_overlap_tile5)

def on_b_pressed():
    global Placeholder
    if sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand") != spriteutils.null_consts(spriteutils.NullConsts.NULL):
      sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand").set_position(sprites.read_data_sprite(Something, "S-Control").x,
            sprites.read_data_sprite(Something, "S-Control").y)
      Placeholder = sprites.create(assets.image("""
            Door Open
            """), SpriteKind.Item)
      sprites.set_data_sprite(sprites.read_data_sprite(Something, "S-Control"),
            "H-Hand",
            Placeholder)
      sprites.destroy(Placeholder)
      music.play(music.create_sound_effect(WaveShape.SQUARE,
                694,
                583,
                59,
                0,
                100,
                SoundExpressionEffect.NONE,
                InterpolationCurve.LINEAR),
            music.PlaybackMode.IN_BACKGROUND)
controller.B.on_event(ControllerButtonEvent.PRESSED, on_b_pressed)

def on_menu_pressed():
    Level(lvl)
controller.menu.on_event(ControllerButtonEvent.PRESSED, on_menu_pressed)

def ColorGrid(Color1: number, Color2: number):
    global picture
    picture = assets.image("""
      BG
      """)
    picture.replace(1, Color1)
    scene.set_background_image(picture)
    scene.set_background_color(Color2)

def on_a_pressed():
    if mySprite:
      if not (sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand") == spriteutils.null_consts(spriteutils.NullConsts.NULL)):
            Use_Item(sprites.read_data_string(sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand"),
                  "I-Type"))
controller.A.on_event(ControllerButtonEvent.PRESSED, on_a_pressed)

def on_overlap_tile6(sprite7, location6):
    tiles.set_tile_at(location6, assets.tile("""
      TeleporterOff
      """))
    sprite7.set_flag(SpriteFlag.GHOST_THROUGH_TILES, True)
    tiles.place_on_random_tile(sprite7, assets.tile("""
      Teleporter
      """))
    grid.place(sprite7, sprite7.tilemap_location())
    tiles.set_tile_at(grid.get_location(sprite7),
      assets.tile("""
            TeleporterOff
            """))
    sprite7.set_flag(SpriteFlag.GHOST_THROUGH_TILES, False)
   
    def on_background2():
      tiles.set_tile_at(location6, assets.tile("""
            Teleporter
            """))
      
      def on_pause_until():
            pass
      pause_until(on_pause_until)
      
      for value in tiles.get_tiles_by_type(assets.tile("""
            TeleporterOff
            """)):
            tiles.set_tile_at(value, assets.tile("""
                Teleporter
                """))
    timer.background(on_background2)
   
scene.on_overlap_tile(SpriteKind.Box,
    assets.tile("""
      Teleporter
      """),
    on_overlap_tile6)

def on_overlap_tile7(sprite8, location7):
    if sprites.read_data_string(sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand"),
      "I-Type") == "Key":
      tiles.set_tile_at(location7, assets.tile("""
            Exit
            """))
      Customeffects("Twinkle", sprite8, True, 1, 1, 200)
      sprites.set_data_string(sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand"),
            "I-Type",
            "Null")
      sprites.destroy(sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand"))
scene.on_overlap_tile(SpriteKind.player,
    assets.tile("""
      Lock0
      """),
    on_overlap_tile7)

def on_left_pressed():
    if not (tiles.tile_at_location_is_wall(tiles.get_tile_location(-1 + sprites.read_data_sprite(Something, "S-Control").tilemap_location().column,
            sprites.read_data_sprite(Something, "S-Control").tilemap_location().row))):
      Customeffects("Steps",
            sprites.read_data_sprite(Something, "S-Control"),
            False,
            sprites.read_data_sprite(Something, "S-Control").x,
            sprites.read_data_sprite(Something, "S-Control").y,
            400)
      grid.move(sprites.read_data_sprite(Something, "S-Control"), -1, 0)
      music.play(music.create_sound_effect(WaveShape.NOISE,
                randint(300, 350),
                0,
                127,
                0,
                100,
                SoundExpressionEffect.NONE,
                InterpolationCurve.LINEAR),
            music.PlaybackMode.IN_BACKGROUND)
controller.left.on_event(ControllerButtonEvent.PRESSED, on_left_pressed)

def SwapBlocks(Stage: number):
    if 1 == Stage:
      tiles.replace_all_tiles(assets.tile("""
                RedTileOFF
                """),
            assets.tile("""
                HiddenGem
                """))
      tiles.replace_all_tiles(assets.tile("""
                RedTileOn0
                """),
            assets.tile("""
                RedTileOFF
                """))
      tiles.replace_all_tiles(assets.tile("""
                HiddenGem
                """),
            assets.tile("""
                RedTileOn0
                """))
      for value2 in tiles.get_tiles_by_type(assets.tile("""
            RedTileOFF
            """)):
            Customeffects("Twinkle",
                mySprite,
                False,
                4 + 8 * value2.column,
                4 + 8 * value2.row,
                100)
            tiles.set_wall_at(value2, False)
      for value22 in tiles.get_tiles_by_type(assets.tile("""
            RedTileOn0
            """)):
            Customeffects("Twinkle",
                mySprite,
                False,
                4 + 8 * value22.column,
                4 + 8 * value22.row,
                100)
            tiles.set_wall_at(value22, True)
      music.play(music.create_sound_effect(WaveShape.NOISE,
                839,
                0,
                255,
                0,
                200,
                SoundExpressionEffect.NONE,
                InterpolationCurve.LINEAR),
            music.PlaybackMode.IN_BACKGROUND)
    elif 2 == Stage:
      music.play(music.create_sound_effect(WaveShape.TRIANGLE,
                692,
                1,
                131,
                0,
                200,
                SoundExpressionEffect.NONE,
                InterpolationCurve.LINEAR),
            music.PlaybackMode.IN_BACKGROUND)
      tiles.replace_all_tiles(assets.tile("""
                BlueTileOFF
                """),
            assets.tile("""
                HiddenGem
                """))
      tiles.replace_all_tiles(assets.tile("""
                BlueTileOn
                """),
            assets.tile("""
                BlueTileOFF
                """))
      tiles.replace_all_tiles(assets.tile("""
                HiddenGem
                """),
            assets.tile("""
                BlueTileOn
                """))
      for value3 in tiles.get_tiles_by_type(assets.tile("""
            BlueTileOFF
            """)):
            Customeffects("Wand",
                mySprite,
                False,
                4 + 8 * value3.column,
                4 + 8 * value3.row,
                100)
            tiles.set_wall_at(value3, False)
      for value23 in tiles.get_tiles_by_type(assets.tile("""
            BlueTileOn
            """)):
            Customeffects("Wand",
                mySprite,
                False,
                4 + 8 * value23.column,
                4 + 8 * value23.row,
                100)
            tiles.set_wall_at(value23, True)
    else:
      pass

def on_on_overlap2(sprite9, otherSprite2):
    if sprites.read_data_boolean(otherSprite2, "RecentlyPushed"):
      PushTiles(otherSprite2, sprite9)
      sprites.set_data_boolean(otherSprite2, "RecentlyPushed", False)
    elif sprites.read_data_boolean(sprite9, "RecentlyPushed"):
      PushTiles(sprite9, otherSprite2)
      sprites.set_data_boolean(sprite9, "RecentlyPushed", False)
sprites.on_overlap(SpriteKind.Box, SpriteKind.Box, on_on_overlap2)

def Use_Item(Text: str):
    global Placeholder, PlayCutScene
    if Text == "Sword":
      Placeholder = sprites.create(img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            SpriteKind.food)
      Placeholder.set_flag(SpriteFlag.GHOST_THROUGH_WALLS, True)
      Placeholder.set_position(sprites.read_data_sprite(Something, "S-Control").x,
            sprites.read_data_sprite(Something, "S-Control").y)
      animation.run_image_animation(Placeholder,
            [img("""
                  . . . . . . . . . . . . . .
                  . . . 4 4 4 4 . . 4 4 . . .
                  . . 4 1 1 1 . . 1 1 1 4 . .
                  . 4 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 4 .
                  . . 1 . . . . . . . . 1 4 .
                  . . . . . . . . . . . . 4 .
                  . 4 . . . . . . . . . . . .
                  . 4 1 . . . . . . . . 1 . .
                  . 4 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 4 .
                  . . 4 1 1 1 . . 1 1 1 4 . .
                  . . . 4 4 . . 4 4 4 4 . . .
                  . . . . . . . . . . . . . .
                  """),
                img("""
                  . . . . . . . . . . . . . .
                  . . . 4 4 4 4 4 . . 4 . . .
                  . . 4 1 1 1 1 . . 1 1 4 . .
                  . 4 1 . . . . . . . . 1 4 .
                  . . 1 . . . . . . . . 1 4 .
                  . . . . . . . . . . . 1 4 .
                  . 4 . . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . . 4 .
                  . 4 1 . . . . . . . . . . .
                  . 4 1 . . . . . . . . 1 . .
                  . 4 1 . . . . . . . . 1 4 .
                  . . 4 1 1 . . 1 1 1 1 4 . .
                  . . . 4 . . 4 4 4 4 4 . . .
                  . . . . . . . . . . . . . .
                  """),
                img("""
                  . . . . . . . . . . . . . .
                  . . . . 4 4 4 4 4 4 4 . . .
                  . . . 4 1 1 1 1 1 1 . . . .
                  . 4 . . . . . . . . . 4 . .
                  . 4 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 4 .
                  . . 4 . . . . . . . . . 4 .
                  . . . . 1 1 1 1 1 1 4 . . .
                  . . . 4 4 4 4 4 4 4 . . . .
                  . . . . . . . . . . . . . .
                  """),
                img("""
                  . . . . . . . . . . . . . .
                  . . . . 4 4 4 4 . . . . . .
                  . . . 4 1 1 1 1 1 4 4 . . .
                  . . 4 1 . . . . . . 1 4 . .
                  . . 4 . . . . . . . . 1 4 .
                  . . 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 4 .
                  . 4 1 . . . . . . . . 1 . .
                  . 4 1 . . . . . . . . 4 . .
                  . . 4 1 . . . . . . 1 4 . .
                  . . . 4 4 1 1 1 1 1 4 . . .
                  . . . . . . 4 4 4 4 . . . .
                  . . . . . . . . . . . . . .
                  """),
                img("""
                  . . . . . . . . . . . . . .
                  . . . . 4 . . . . . . . . .
                  . . . 4 1 4 4 4 4 4 4 . . .
                  . . 4 1 1 . 1 1 1 1 1 4 . .
                  . . 4 1 . . . . . . 1 1 4 .
                  . . 4 1 . . . . . . . 4 . .
                  . . 4 1 . . . . . . 1 4 . .
                  . . 4 1 . . . . . . 1 4 . .
                  . . 4 . . . . . . . 1 4 . .
                  . 4 1 1 . . . . . . 1 4 . .
                  . . 4 1 1 1 1 1 . 1 1 4 . .
                  . . . 4 4 4 4 4 4 1 4 . . .
                  . . . . . . . . . 4 . . . .
                  . . . . . . . . . . . . . .
                  """),
                img("""
                  . . . . . . . . . . . . . .
                  . . . . . . . . . . . . . .
                  . . . . 4 4 4 4 4 4 . . . .
                  . . . 4 1 1 1 1 1 1 4 . . .
                  . . 4 1 1 . . . . 1 1 4 . .
                  . . 4 1 . . . . . . 1 4 . .
                  . . 4 1 . . . . . . 1 4 . .
                  . . 4 1 . . . . . . 1 4 . .
                  . . 4 1 . . . . . . 1 4 . .
                  . . 4 1 1 . . . . 1 1 4 . .
                  . . . 4 1 1 1 1 1 1 4 . . .
                  . . . . 4 4 4 4 4 4 . . . .
                  . . . . . . . . . . . . . .
                  . . . . . . . . . . . . . .
                  """),
                img("""
                  . . . . . . . . . . . . . .
                  . . . . . . . . . . . . . .
                  . . . . . . . . . . . . . .
                  . . . . . 4 4 4 4 . . . . .
                  . . . . 4 1 1 1 1 4 . . . .
                  . . . 4 1 . . . . 1 4 . . .
                  . . . 4 1 . . . . 1 4 . . .
                  . . . 4 1 . . . . 1 4 . . .
                  . . . 4 1 . . . . 1 4 . . .
                  . . . . 4 1 1 1 1 4 . . . .
                  . . . . . 4 4 4 4 . . . . .
                  . . . . . . . . . . . . . .
                  . . . . . . . . . . . . . .
                  . . . . . . . . . . . . . .
                  """)],
            100,
            False)
      music.play(music.create_sound_effect(WaveShape.SAWTOOTH,
                randint(770, 800),
                0,
                98,
                0,
                100,
                SoundExpressionEffect.NONE,
                InterpolationCurve.LINEAR),
            music.PlaybackMode.IN_BACKGROUND)
      Placeholder.lifespan = 700
    elif Text == "Book":
      PlayCutScene = True
      Level(99)
    else:
      pass
def CutScene(Text1: str, Text2: str, Background: Image, Time: number):
    global textSprite, textSprite2
    if PlayCutScene:
      mySprite.set_flag(SpriteFlag.INVISIBLE, True)
      tiles.load_map(tiles.create_small_map(tilemap("""
            EmptyTilemap
            """)))
      scene.set_background_image(Background)
      scene.set_background_color(15)
      textSprite = textsprite.create(Text1, 0, 15)
      textSprite2 = textsprite.create(Text2, 0, 15)
      textSprite.scale = 0
      textSprite2.scale = 0
      textSprite.set_outline(1, 1)
      textSprite2.set_outline(1, 1)
      textSprite.set_position(80, 50)
      textSprite2.set_position(80, 70)
      for index in range(10):
            textSprite.scale += 0.1
            textSprite2.scale += 0.1
            pause(50)
      pause(Time)
      for index2 in range(10):
            textSprite.scale += -0.1
            textSprite2.scale += -0.1
            pause(50)
      sprites.destroy(textSprite)
      sprites.destroy(textSprite2)
      mySprite.set_flag(SpriteFlag.INVISIBLE, False)
      scene.set_background_color(15)

def on_overlap_tile8(sprite10, location8):
    SwapBlocks(2)
    tiles.set_tile_at(location8, assets.tile("""
      BButtonPressed
      """))
    Customeffects("Wand", sprite10, True, 1, 1, 200)
   
    def on_background3():
      
      def on_pause_until2():
            pass
      pause_until(on_pause_until2)
      
      tiles.set_tile_at(location8, assets.tile("""
            BButton
            """))
    timer.background(on_background3)
   
scene.on_overlap_tile(SpriteKind.player,
    assets.tile("""
      BButton
      """),
    on_overlap_tile8)

def on_overlap_tile9(sprite11, location9):
    global Placeholder
    if sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand") != spriteutils.null_consts(spriteutils.NullConsts.NULL):
      sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand").set_position(sprites.read_data_sprite(Something, "S-Control").x,
            sprites.read_data_sprite(Something, "S-Control").y)
      Placeholder = sprites.create(assets.image("""
            Door Open
            """), SpriteKind.Item)
      sprites.set_data_sprite(sprites.read_data_sprite(Something, "S-Control"),
            "H-Hand",
            Placeholder)
      sprites.destroy(Placeholder)
      music.play(music.create_sound_effect(WaveShape.SQUARE,
                694,
                583,
                59,
                0,
                100,
                SoundExpressionEffect.NONE,
                InterpolationCurve.LINEAR),
            music.PlaybackMode.IN_BACKGROUND)
    tiles.set_tile_at(location9, assets.tile("""
      TeleporterOff
      """))
    sprite11.set_flag(SpriteFlag.GHOST_THROUGH_TILES, True)
    tiles.place_on_random_tile(sprite11, assets.tile("""
      Teleporter
      """))
    grid.place(sprite11, sprite11.tilemap_location())
    tiles.set_tile_at(grid.get_location(sprite11),
      assets.tile("""
            TeleporterOff
            """))
    sprite11.set_flag(SpriteFlag.GHOST_THROUGH_TILES, False)
   
    def on_background4():
      tiles.set_tile_at(location9, assets.tile("""
            Teleporter
            """))
      
      def on_pause_until3():
            pass
      pause_until(on_pause_until3)
      
      for value4 in tiles.get_tiles_by_type(assets.tile("""
            TeleporterOff
            """)):
            tiles.set_tile_at(value4, assets.tile("""
                Teleporter
                """))
    timer.background(on_background4)
   
scene.on_overlap_tile(SpriteKind.player,
    assets.tile("""
      Teleporter
      """),
    on_overlap_tile9)

def Customeffects(Type: str, Sprite2: Sprite, Onsprite: bool, X: number, Y: number, Time2: number):
    global myEffect
    myEffect.z = -5
    if Type == "Steps":
      myEffect = extraEffects.create_custom_spread_effect_data(,
            True,
            ,
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_time_range(200, 300),
            0,
            0,
            extraEffects.create_percentage_range(50, 100),
            0,
            0,
            200)
    elif Type == "Wand":
      myEffect = extraEffects.create_custom_spread_effect_data(,
            False,
            extraEffects.create_shrinking_size_table(8),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_percentage_range(20, 20),
            extraEffects.create_time_range(200, 600),
            0,
            0,
            extraEffects.create_percentage_range(50, 100),
            0,
            0,
            500)
    elif Type == "Twinkle":
      myEffect.z = 4
      myEffect = extraEffects.create_custom_spread_effect_data(,
            True,
            extraEffects.create_shrinking_size_table(8),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_percentage_range(20, 20),
            extraEffects.create_time_range(200, 600),
            0,
            0,
            extraEffects.create_percentage_range(50, 100),
            0,
            0,
            500)
    elif Type == "Victory":
      myEffect = extraEffects.create_custom_spread_effect_data(,
            False,
            ,
            extraEffects.create_percentage_range(40, 40),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_time_range(1000, 1000))
    elif Type == "Fadeout":
      myEffect.z = 4
      myEffect = extraEffects.create_custom_spread_effect_data(,
            False,
            extraEffects.create_growing_size_table(450),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_time_range(1500, 1500))
    elif Type == "Fadein":
      myEffect.z = 5
      myEffect = extraEffects.create_custom_spread_effect_data(,
            False,
            extraEffects.create_shrinking_size_table(450),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_time_range(1500, 1500))
    elif Type == "fall":
      myEffect = extraEffects.create_custom_spread_effect_data(,
            False,
            extraEffects.create_shrinking_size_table(8),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_time_range(500, 500))
    elif Type == "Explode":
      myEffect = extraEffects.create_custom_spread_effect_data(,
            True,
            extraEffects.create_shrinking_size_table(24),
            extraEffects.create_percentage_range(0, 0),
            extraEffects.create_percentage_range(30, 30),
            extraEffects.create_time_range(500, 500))
    else:
      pass
    if Onsprite:
      extraEffects.create_spread_effect_on_anchor(Sprite2, myEffect, Time2)
    else:
      extraEffects.create_spread_effect_at(myEffect, X, Y, Time2)

def on_overlap_tile10(sprite12, location10):
    global lvl
    tiles.set_tile_at(location10, assets.tile("""
      transparency8
      """))
    Customeffects("Victory", sprite12, True, 1, 1, 1000)
    Customeffects("Victory", sprite12, True, 1, 1, 1000)
    music.play(music.string_playable("F - F E F G B - ", 320),
      music.PlaybackMode.IN_BACKGROUND)
    lvl += 1
   
    def on_after2():
      Customeffects("Fadeout", sprite12, True, 0, 0, 1000)
      music.play(music.create_sound_effect(WaveShape.SINE,
                1,
                520,
                145,
                0,
                2000,
                SoundExpressionEffect.NONE,
                InterpolationCurve.LINEAR),
            music.PlaybackMode.IN_BACKGROUND)
    timer.after(2000, on_after2)
   
   
    def on_after3():
      global PlayCutScene
      PlayCutScene = True
      Level(lvl)
    timer.after(3500, on_after3)
   
scene.on_overlap_tile(SpriteKind.player,
    assets.tile("""
      Exit
      """),
    on_overlap_tile10)

def Level(Lvl: number):
    global textSprite, Placeholder, PlayCutScene, PlayerBoxes
    mySprite.scale = 1
    scene.set_background_color(15)
    mySprite.set_flag(SpriteFlag.GHOST_THROUGH_TILES, False)
    mySprite.set_flag(SpriteFlag.GHOST_THROUGH_SPRITES, False)
    sprites.set_data_sprite(Something, "S-Control", mySprite)
    sprites.destroy_all_sprites_of_kind(SpriteKind.Box)
    sprites.destroy_all_sprites_of_kind(SpriteKind.text)
    sprites.destroy_all_sprites_of_kind(SpriteKind.Item)
    sprites.destroy_all_sprites_of_kind(SpriteKind.enemy)
    for value32 in tiles.get_tiles_by_type(assets.tile("""
      BButton
      """)):
      tiles.set_tile_at(value32, assets.tile("""
            transparency8
            """))
    for value33 in tiles.get_tiles_by_type(assets.tile("""
      BButtonPressed
      """)):
      tiles.set_tile_at(value33, assets.tile("""
            transparency8
            """))
    if Lvl == 0:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level3
            """)))
      textSprite = textsprite.create("Menu to reset", 0, 12)
      textSprite.set_position(100, 10)
    elif Lvl == 1:
      textSprite = textsprite.create("Red is one time use", 0, 12)
      textSprite.set_position(80, 110)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level8
            """)))
    elif Lvl == 2:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level12
            """)))
    elif Lvl == 3:
      textSprite = textsprite.create("Blue toggles on and off", 0, 12)
      textSprite.set_position(80, 20)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level6
            """)))
    elif Lvl == 4:
      CutScene("You have Done well",
            "So far. . .",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            2000)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level25
            """)))
    elif Lvl == 5:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level10
            """)))
    elif Lvl == 6:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level23
            """)))
    elif Lvl == 7:
      CutScene("To easy for you?",
            "Lets make this intresting",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            4000)
      textSprite = textsprite.create("Boxes Can Cover Pits", 0, 12)
      textSprite.set_position(80, 20)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level15
            """)))
      textSprite = textsprite.create("Pick up With A", 0, 12)
      textSprite.set_position(80, 100)
    elif Lvl == 8:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level27
            """)))
    elif Lvl == 9:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level9
            """)))
    elif Lvl == 10:
      CutScene("Not Bad ",
            "Most make it this far",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            3000)
      CutScene("Then Again ",
            "Your not most are you?",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            3000)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level17
            """)))
    elif Lvl == 11:
      CutScene("A Knight Driven by Mind",
            "Not War or battle",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            3000)
      CutScene("Maybe you are worthy",
            "Only time will tell",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            4000)
      textSprite = textsprite.create("", 0, 12)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level20
            """)))
    elif Lvl == 12:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level21
            """)))
    elif Lvl == 13:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level13
            """)))
    elif Lvl == 14:
      textSprite = textsprite.create("Doors > Keys", 0, 12)
      textSprite.set_position(80, 110)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level26
            """)))
    elif Lvl == 15:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level7
            """)))
    elif Lvl == 16:
      CutScene("The last of our tricks",
            "Now can you use them?",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            4000)
      textSprite = textsprite.create("Swords break Weak objects", 0, 12)
      textSprite.set_position(80, 100)
      textSprite = textsprite.create("B to Drop", 0, 12)
      textSprite.set_position(100, 15)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level28
            """)))
    elif Lvl == 17:
      CutScene("The Final Stretch",
            "Only 5 More Floors",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            3000)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level22
            """)))
    elif Lvl == 18:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level11
            """)))
    elif Lvl == 19:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level29
            """)))
    elif Lvl == 20:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level33
            """)))
    elif Lvl == 21:
      CutScene("The final Floor",
            "we watch with Anticipation",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            3000)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level37
            """)))
    elif Lvl == 22:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level41
            """)))
      Placeholder = sprites.create(img("""
                . 6 2 2 2 2 2 .
                . 6 2 c c c 2 .
                . 6 2 c c c 2 .
                . c b b 2 2 2 .
                . c b c c c b .
                . c b b b b b .
                . c b b b b b .
                . c b b b b b .
                """),
            SpriteKind.Item)
      Placeholder.set_position(80, 30)
      sprites.set_data_string(Placeholder, "I-Type", "Book")
    elif Lvl == 99:
      CutScene("As You Open the book",
            "Your mind fills with knowledge",
            img("""
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                . . . . . . . . . . . . . . . .
                """),
            4000)
      game.set_dialog_frame(img("""
            ffffffffffffffffffffffff
            ffffffffffffffffffffffff
            fffbbbbbbbbbbbbbbbbbbfff
            ffbffffffffffffffffffbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbfbbbbbbbbbbbbbbbbfbff
            ffbffffffffffffffffffbff
            fffbbbbbbbbbbbbbbbbbbfff
            ffffffffffffffffffffffff
            ffffffffffffffffffffffff
            """))
      game.show_long_text("As you Exit the dungeon Enlighted with knowledge you Wander the world spreading it with all",
            DialogLayout.FULL)
      game.show_long_text("Teaching people to understand there world and how to make it a better place for all ",
            DialogLayout.FULL)
      game.show_long_text("learning humanizes character and prevents it from being cruel So learn on Enlighted Warrior",
            DialogLayout.FULL)
      tiles.load_map(tiles.create_small_map(tilemap("""
            level46
            """)))
      textSprite = textsprite.create("Thank you for playing!", 0, 15)
      textSprite.set_outline(1, 1)
      textSprite.set_position(80, 10)
      textSprite = textsprite.create("I hope you enjoyed it", 0, 15)
      textSprite.set_position(80, 100)
      textSprite.set_outline(1, 1)
      textSprite = textsprite.create("-ADM_F", 0, 8)
      textSprite.set_outline(1, 9)
      textSprite.set_position(100, 110)
    else:
      tiles.load_map(tiles.create_small_map(tilemap("""
            level16
            """)))
    if Lvl < 17:
      ColorGrid(11, 1)
    if Lvl >= 17:
      ColorGrid(6, 8)
    if Lvl == 99:
      ColorGrid(11, 1)
    for value34 in tiles.get_tiles_by_type(assets.tile("""
      Box
      """)):
      Placeholder = sprites.create(assets.image("""
            BoxSprite
            """), SpriteKind.Box)
      grid.place(Placeholder,
            tiles.get_tile_location(value34.column, value34.row))
    for value35 in tiles.get_tiles_by_type(assets.tile("""
      Key
      """)):
      Placeholder = sprites.create(assets.image("""
            Key
            """), SpriteKind.Item)
      sprites.set_data_string(Placeholder, "I-Type", "Key")
      grid.place(Placeholder,
            tiles.get_tile_location(value35.column, value35.row))
      tiles.set_tile_at(value35, assets.tile("""
            transparency8
            """))
    for value36 in tiles.get_tiles_by_type(assets.tile("""
      SwordTile
      """)):
      Placeholder = sprites.create(assets.image("""
            Sword-
            """), SpriteKind.Item)
      sprites.set_data_string(Placeholder, "I-Type", "Sword")
      grid.place(Placeholder,
            tiles.get_tile_location(value36.column, value36.row))
      tiles.set_tile_at(value36, assets.tile("""
            transparency8
            """))
    tiles.replace_all_tiles(assets.tile("""
            Box
            """),
      assets.tile("""
            transparency8
            """))
    for value42 in tiles.get_tiles_by_type(assets.tile("""
      StartingPoint
      """)):
      grid.place(mySprite,
            tiles.get_tile_location(value42.column, value42.row))
      tiles.set_tile_at(value42, assets.tile("""
            transparency8
            """))
    Customeffects("Fadein", mySprite, True, 0, 0, 1000)
    music.play(music.create_sound_effect(WaveShape.SINE,
            520,
            1,
            145,
            0,
            2000,
            SoundExpressionEffect.NONE,
            InterpolationCurve.LINEAR),
      music.PlaybackMode.IN_BACKGROUND)
    PlayCutScene = False
    PlayerBoxes = []
    PlayerBoxes.append(mySprite)
    for value5 in sprites.all_of_kind(SpriteKind.Box):
      PlayerBoxes.append(value5)

def on_on_overlap3(sprite13, otherSprite3):
    sprites.set_data_sprite(Something, "S-Control", Something)
    mySprite.set_velocity(otherSprite3.vx * 2, otherSprite3.vy * 2)
    sprite13.set_flag(SpriteFlag.GHOST_THROUGH_TILES, True)
    sprite13.set_flag(SpriteFlag.GHOST_THROUGH_SPRITES, True)
   
    def on_background5():
      Customeffects("Explode", sprite13, True, 1, 1, 600)
      sprite13.scale = 0
      scene.camera_shake(4, 200)
      music.play(music.melody_playable(music.big_crash),
            music.PlaybackMode.IN_BACKGROUND)
      pause(1000)
      Level(lvl)
    timer.background(on_background5)
   
sprites.on_overlap(SpriteKind.player, SpriteKind.enemy, on_on_overlap3)

def on_on_overlap4(sprite14, otherSprite4):
    otherSprite4.set_velocity(0, 0)
    otherSprite4.set_flag(SpriteFlag.GHOST_THROUGH_SPRITES, True)
sprites.on_overlap(SpriteKind.Box, SpriteKind.enemy, on_on_overlap4)

def on_right_pressed():
    if Something:
      if not (tiles.tile_at_location_is_wall(tiles.get_tile_location(1 + sprites.read_data_sprite(Something, "S-Control").tilemap_location().column,
                sprites.read_data_sprite(Something, "S-Control").tilemap_location().row))):
            Customeffects("Steps",
                sprites.read_data_sprite(Something, "S-Control"),
                False,
                sprites.read_data_sprite(Something, "S-Control").x,
                sprites.read_data_sprite(Something, "S-Control").y,
                400)
            grid.move(sprites.read_data_sprite(Something, "S-Control"), 1, 0)
            music.play(music.create_sound_effect(WaveShape.NOISE,
                  randint(300, 350),
                  0,
                  104,
                  0,
                  100,
                  SoundExpressionEffect.NONE,
                  InterpolationCurve.LINEAR),
                music.PlaybackMode.IN_BACKGROUND)
controller.right.on_event(ControllerButtonEvent.PRESSED, on_right_pressed)

def on_overlap_tile11(sprite15, location11):
    SwapBlocks(2)
    tiles.set_tile_at(location11, assets.tile("""
      BButtonPressed
      """))
    Customeffects("Wand", sprite15, True, 1, 1, 200)
   
    def on_background6():
      
      def on_pause_until4():
            pass
      pause_until(on_pause_until4)
      
      tiles.set_tile_at(location11, assets.tile("""
            BButton
            """))
    timer.background(on_background6)
   
scene.on_overlap_tile(SpriteKind.Box,
    assets.tile("""
      BButton
      """),
    on_overlap_tile11)

def on_overlap_tile12(sprite16, location12):
    tiles.set_tile_at(location12, assets.tile("""
      transparency8
      """))
    Customeffects("Twinkle", sprite16, True, 1, 1, 500)
    SwapBlocks(1)
scene.on_overlap_tile(SpriteKind.Box,
    assets.tile("""
      RButton
      """),
    on_overlap_tile12)

def on_overlap_tile13(sprite17, location13):
    mySprite.set_flag(SpriteFlag.GHOST_THROUGH_TILES, True)
    music.play(music.create_sound_effect(WaveShape.TRIANGLE,
            2954,
            0,
            122,
            0,
            1500,
            SoundExpressionEffect.NONE,
            InterpolationCurve.LOGARITHMIC),
      music.PlaybackMode.IN_BACKGROUND)
   
    def on_background7():
      for index3 in range(10):
            pause(100)
            mySprite.scale += -0.1
      pause(1000)
      music.play(music.melody_playable(music.big_crash),
            music.PlaybackMode.IN_BACKGROUND)
      Level(lvl)
    timer.background(on_background7)
   
scene.on_overlap_tile(SpriteKind.player,
    assets.tile("""
      Pit
      """),
    on_overlap_tile13)

def on_overlap_tile14(sprite18, location14):
    tiles.set_tile_at(location14, assets.tile("""
      transparency8
      """))
    tiles.set_wall_at(location14, False)
scene.on_overlap_tile(SpriteKind.food,
    assets.tile("""
      Cannon UD0
      """),
    on_overlap_tile14)

def on_up_pressed():
    if Something:
      if not (tiles.tile_at_location_is_wall(tiles.get_tile_location(sprites.read_data_sprite(Something, "S-Control").tilemap_location().column,
                -1 + sprites.read_data_sprite(Something, "S-Control").tilemap_location().row))):
            Customeffects("Steps",
                sprites.read_data_sprite(Something, "S-Control"),
                False,
                sprites.read_data_sprite(Something, "S-Control").x,
                sprites.read_data_sprite(Something, "S-Control").y,
                400)
            grid.move(sprites.read_data_sprite(Something, "S-Control"), 0, -1)
            music.play(music.create_sound_effect(WaveShape.NOISE,
                  randint(300, 350),
                  0,
                  127,
                  0,
                  100,
                  SoundExpressionEffect.NONE,
                  InterpolationCurve.LINEAR),
                music.PlaybackMode.IN_BACKGROUND)
controller.up.on_event(ControllerButtonEvent.PRESSED, on_up_pressed)

def on_on_overlap5(sprite19, otherSprite5):
    PushTiles(sprite19, otherSprite5)
sprites.on_overlap(SpriteKind.player, SpriteKind.Box, on_on_overlap5)

def on_down_pressed():
    if not (tiles.tile_at_location_is_wall(tiles.get_tile_location(sprites.read_data_sprite(Something, "S-Control").tilemap_location().column,
            1 + sprites.read_data_sprite(Something, "S-Control").tilemap_location().row))):
      Customeffects("Steps",
            sprites.read_data_sprite(Something, "S-Control"),
            False,
            sprites.read_data_sprite(Something, "S-Control").x,
            sprites.read_data_sprite(Something, "S-Control").y,
            400)
      grid.move(sprites.read_data_sprite(Something, "S-Control"), 0, 1)
      music.play(music.create_sound_effect(WaveShape.NOISE,
                randint(300, 350),
                0,
                113,
                0,
                100,
                SoundExpressionEffect.NONE,
                InterpolationCurve.LINEAR),
            music.PlaybackMode.IN_BACKGROUND)
controller.down.on_event(ControllerButtonEvent.PRESSED, on_down_pressed)

PlayerBoxes: List = []
picture: Image = None
myEffect: SpreadEffectData = None
mySprite: Sprite = None
Something: Sprite = None
textSprite2: TextSprite = None
textSprite: TextSprite = None
Placeholder: Sprite = None
lvl = 0
PlayCutScene = False
music.stop_all_sounds()
PlayCutScene = True
lvl = 0
scene.set_background_color(15)
Placeholder = sprites.create(assets.image("""
    Logo
    """), SpriteKind.PlaceHolder)
textSprite = textsprite.create("Press A to Start", 0, 1)
textSprite.set_position(80, 80)
textSprite2 = textsprite.create("Made by ADM_F", 0, 8)
textSprite2.set_position(100, 110)

def on_pause_until5():
    pass
pause_until(on_pause_until5)

if controller.right.is_pressed():
    Keybinds.set_simulator_keymap(Keybinds.PlayerNumber.ONE,
      Keybinds.CustomKey.W,
      Keybinds.CustomKey.S,
      Keybinds.CustomKey.A,
      Keybinds.CustomKey.D,
      Keybinds.CustomKey.F,
      Keybinds.CustomKey.G)
if controller.up.is_pressed():
    lvl = game.ask_for_number("Level Select ", 2)
sprites.destroy(textSprite2)
for index4 in range(10):
    Placeholder.scale += -0.1
    textSprite.scale += -0.1
    pause(50)
sprites.destroy(textSprite)
sprites.destroy(Placeholder)
Something = sprites.create(assets.image("""
    Empty
    """), SpriteKind.Stupid)
mySprite = sprites.create(assets.image("""
    Sir Blue
    """), SpriteKind.player)
sprites.set_data_sprite(Something, "S-Control", mySprite)
CurrentParty =
characterAnimations.loop_frames(mySprite,
    assets.animation("""
      BlueLeft
      """),
    300,
    characterAnimations.rule(Predicate.FACING_LEFT))
characterAnimations.loop_frames(mySprite,
    assets.animation("""
      BlueDown
      """),
    300,
    characterAnimations.rule(Predicate.FACING_DOWN))
characterAnimations.loop_frames(mySprite,
    assets.animation("""
      BlueUp
      """),
    300,
    characterAnimations.rule(Predicate.FACING_UP))
characterAnimations.loop_frames(mySprite,
    assets.animation("""
      BlueRight
      """),
    300,
    characterAnimations.rule(Predicate.FACING_RIGHT))
myEffect = extraEffects.create_custom_spread_effect_data(,
    False,
    extraEffects.create_preset_size_table(ExtraEffectPresetShape.SPARK),
    extraEffects.create_percentage_range(50, 100),
    extraEffects.create_percentage_range(50, 100),
    extraEffects.create_time_range(200, 400))
music.play(music.string_playable("G G F A B G A B ", 300),
    music.PlaybackMode.IN_BACKGROUND)
CutScene("Journey Onward",
    "Warrior Of Blue",
    img("""
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      . . . . . . . . . . . . . . . .
      """),
    2000)
music.play(music.create_song(assets.song("""
      Song1
      """)),
    music.PlaybackMode.LOOPING_IN_BACKGROUND)
Level(lvl)

def on_update_interval():
    global Placeholder
    for value6 in tiles.get_tiles_by_type(assets.tile("""
      Cannon LR
      """)):
      Placeholder = sprites.create(assets.image("""
            LaserSIDE
            """), SpriteKind.enemy)
      tiles.place_on_tile(Placeholder, value6)
      Placeholder.lifespan = 800
      Placeholder.z = -5
      Placeholder.vx = 75
      Placeholder = sprites.create(assets.image("""
            LaserSIDE
            """), SpriteKind.enemy)
      tiles.place_on_tile(Placeholder, value6)
      Placeholder.z = -5
      Placeholder.lifespan = 800
      Placeholder.vx = -75
    for value7 in tiles.get_tiles_by_type(assets.tile("""
      Cannon UD0
      """)):
      Placeholder = sprites.create(assets.image("""
            Laser UPDOWN
            """), SpriteKind.enemy)
      tiles.place_on_tile(Placeholder, value7)
      Placeholder.lifespan = 800
      Placeholder.vy = 75
      Placeholder.z = -5
      Placeholder = sprites.create(assets.image("""
            Laser UPDOWN
            """), SpriteKind.enemy)
      tiles.place_on_tile(Placeholder, value7)
      Placeholder.z = -5
      Placeholder.lifespan = 800
      Placeholder.vy = -75
game.on_update_interval(100, on_update_interval)

def on_on_update():
    if Something:
      Something.set_position(sprites.read_data_sprite(Something, "S-Control").x,
            sprites.read_data_sprite(Something, "S-Control").y - 7)
      if (characterAnimations.matches_rule(sprites.read_data_sprite(Something, "S-Control"),
            characterAnimations.rule(Predicate.FACING_RIGHT)) or characterAnimations.matches_rule(sprites.read_data_sprite(Something, "S-Control"),
            characterAnimations.rule(Predicate.FACING_DOWN))) and sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand") != spriteutils.null_consts(spriteutils.NullConsts.NULL):
            if sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"),
                "H-Offhand") != spriteutils.null_consts(spriteutils.NullConsts.NULL):
                sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"),
                  "H-Offhand").set_position(-1 + sprites.read_data_sprite(Something, "S-Control").x,
                  2 + sprites.read_data_sprite(Something, "S-Control").y)
            sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand").set_position(4 + sprites.read_data_sprite(Something, "S-Control").x,
                sprites.read_data_sprite(Something, "S-Control").y)
      elif (characterAnimations.matches_rule(sprites.read_data_sprite(Something, "S-Control"),
            characterAnimations.rule(Predicate.FACING_UP)) or characterAnimations.matches_rule(sprites.read_data_sprite(Something, "S-Control"),
            characterAnimations.rule(Predicate.FACING_LEFT))) and sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand") != spriteutils.null_consts(spriteutils.NullConsts.NULL):
            sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"), "H-Hand").set_position(-3 + sprites.read_data_sprite(Something, "S-Control").x,
                sprites.read_data_sprite(Something, "S-Control").y)
            if sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"),
                "H-Offhand") != spriteutils.null_consts(spriteutils.NullConsts.NULL):
                sprites.read_data_sprite(sprites.read_data_sprite(Something, "S-Control"),
                  "H-Offhand").set_position(3 + sprites.read_data_sprite(Something, "S-Control").x,
                  2 + sprites.read_data_sprite(Something, "S-Control").y)
game.on_update(on_on_update)


驴友花雕 发表于 2025-9-23 17:16:11

【花雕动手做】基于Kitronik可编程开发板之板条箱地牢

这是一个基于MakeCode Arcade的"板条箱地牢"(Crate Dungeon)推箱子解谜游戏代码。

游戏概述
这是一个经典的推箱子解谜游戏,玩家控制蓝色骑士在地牢中移动箱子,解开各种机关谜题。

核心游戏机制
1. 角色控制与移动
python
def on_left_pressed():

def on_right_pressed():

def on_up_pressed():

def on_down_pressed():
网格化移动系统
移动时播放脚步声特效
碰撞检测防止穿墙
2. 箱子推动系统
python
def PushTiles(Pusher: Sprite, Pushing: Sprite):
复杂的箱子推动逻辑
支持连锁推动(箱子推箱子)
防止推动到墙壁时的反弹机制

游戏特色功能
1. 机关系统
按钮机制:
红色按钮(RButton):一次性开关,改变红色地砖状态
蓝色按钮(BButton):切换开关,改变蓝色地砖状态
传送门:
家和箱子都可以通过传送门
自动传送并重置传送门状态
陷阱与障碍:
深坑(Pit):玩家掉落会重置关卡
激光炮台:定期发射激光障碍
可破坏墙壁:使用剑破坏
2. 物品系统
python
def Use_Item(Text: str):
钥匙(Key):打开锁住的门
剑(Sword):破坏脆弱墙壁和物体
书(Book):触发剧情和结局
3. 特效系统
python
def Customeffects(Type: str, Sprite2: Sprite, Onsprite: bool, X: number, Y: number, Time2: number):
丰富的粒子特效:
Steps:移动脚步效果
Wand:魔法棒效果
Twinkle:闪烁星光
Victory:胜利效果
Explode:**效果

关卡设计
渐进式难度
游戏包含22+个关卡,难度逐渐增加:
1-3关:基础推箱子教学
4-10关:引入按钮机制和陷阱
11-16关:复杂机关组合
17-22关:最终挑战关卡

剧情系统
python
def CutScene(Text1: str, Text2: str, Background: Image, Time: number):
关卡间的剧情过渡
教育性主题:知识的力量
最终传达积极信息

技术实现亮点
1. 状态管理
python
sprites.set_data_boolean(Pushing, "RecentlyPushed", True)
使用精灵数据存储系统管理游戏状态

2. 关卡加载系统
python
def Level(Lvl: number):
动态加载不同地图
自动生成箱子和物品
重置游戏状态

3. 物理系统
网格化碰撞检测
连锁推动物理
实时障碍物生成

驴友花雕 发表于 2025-9-23 17:21:27

【花雕动手做】基于Kitronik可编程开发板之板条箱地牢

图形编程参考实验程序



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



实验场景记录







驴友花雕 发表于 2025-9-23 17:23:23

【花雕动手做】基于Kitronik可编程开发板之板条箱地牢


页: [1]
查看完整版本: 【花雕动手做】基于Kitronik可编程开发板之板条箱地牢