作为学习、练习与尝试,这里创建一个扫地雷的小游戏。
打开网页版:https://arcade.makecode.com/,设置项目名称:扫地雷
MicroPython实验代码
- @namespace
- class SpriteKind:
- Collison = SpriteKind.create()
- Tile = SpriteKind.create()
- secret = SpriteKind.create()
-
- def on_overlap_tile(sprite, location):
- sprite.destroy()
- scene.on_overlap_tile(SpriteKind.Tile,
- assets.tile("""
- tile16
- """),
- on_overlap_tile)
-
- def flood_reveal(num: number, num2: number):
- global number_of_gophers_but_here
- if not (tiles.tile_is_wall(tiles.get_tile_location(num, num2))):
- if not (tiles.tile_at_location_equals(tiles.get_tile_location(num, num2),
- assets.tile("""
- tile
- """))):
- return
- else:
- tiles.place_on_tile(recursive_target, tiles.get_tile_location(num, num2))
- number_of_gophers_but_here = count_gophers_where_i_am(recursive_target)
- tiles.set_tile_at(tiles.get_tile_location(num, num2),
- tile_Numbers[number_of_gophers_but_here])
- if 0 < number_of_gophers_but_here:
- return
- else:
- flood_reveal(num - 1, num2 - 1)
- flood_reveal(num - 1, num2 - 0)
- flood_reveal(num - 0, num2 - 1)
- flood_reveal(num + 1, num2 - 0)
- flood_reveal(num + 1, num2 + 1)
- flood_reveal(num + 0, num2 + 1)
- flood_reveal(num - 1, num2 + 1)
- flood_reveal(num + 1, num2 - 1)
- def game_over():
- currentTile.destroy()
- for value in sprites.all_of_kind(SpriteKind.Tile):
- value.destroy()
- pause(10)
- game.over(False)
-
- def on_a_pressed():
- global temp_number
- if target.overlaps_with(currentTile):
- if tiles.tile_at_location_equals(tiles.location_of_sprite(currentTile),
- assets.tile("""
- tile2
- """)):
- game_over()
- temp_number = count_gophers_where_i_am(currentTile)
- if 0 < temp_number:
- tiles.set_tile_at(tiles.location_of_sprite(currentTile),
- tile_Numbers[temp_number])
- else:
- flood_reveal(tiles.location_xy(tiles.location_of_sprite(currentTile), tiles.XY.COLUMN),
- tiles.location_xy(tiles.location_of_sprite(currentTile), tiles.XY.ROW))
- currentTile.destroy()
- if len(sprites.all_of_kind(SpriteKind.Tile)) <= number_of_gophers:
- game.over(True)
- controller.A.on_event(ControllerButtonEvent.PRESSED, on_a_pressed)
-
- def on_overlap_tile2(sprite2, location2):
- sprite2.destroy()
- scene.on_overlap_tile(SpriteKind.Tile,
- assets.tile("""
- tile17
- """),
- on_overlap_tile2)
-
- def on_overlap_tile3(sprite3, location3):
- sprite3.destroy()
- scene.on_overlap_tile(SpriteKind.Tile,
- assets.tile("""
- tile19
- """),
- on_overlap_tile3)
-
- def on_overlap_tile4(sprite4, location4):
- sprite4.destroy()
- scene.on_overlap_tile(SpriteKind.Tile,
- assets.tile("""
- tile18
- """),
- on_overlap_tile4)
-
- def on_b_pressed():
- if not (sprites.read_data_boolean(currentTile, "revealed")):
- if currentTile.image.equals(unseenTileImage):
- currentTile.set_image(seenTileImage)
- else:
- currentTile.set_image(unseenTileImage)
- controller.B.on_event(ControllerButtonEvent.PRESSED, on_b_pressed)
-
- def on_overlap_tile5(sprite5, location5):
- sprite5.destroy()
- scene.on_overlap_tile(SpriteKind.Tile,
- assets.tile("""
- tile14
- """),
- on_overlap_tile5)
-
- def on_overlap_tile6(sprite6, location6):
- sprite6.destroy()
- scene.on_overlap_tile(SpriteKind.Tile,
- assets.tile("""
- tile15
- """),
- on_overlap_tile6)
-
- def on_overlap_tile7(sprite7, location7):
- sprite7.destroy()
- scene.on_overlap_tile(SpriteKind.Tile,
- assets.tile("""
- tile12
- """),
- on_overlap_tile7)
-
- def make_cover_tiles():
- global tile
- for value2 in tiles.get_tiles_by_type(assets.tile("""
- tile
- """)):
- tile = sprites.create(img("""
- 9 1 1 1 1 1 1 d
- 1 b b b b b b c
- 1 b b b b b b c
- 1 b b b b b b c
- 1 b b b b b b c
- 1 b b b b b b c
- 1 b b b b b b c
- d c c c c c c f
- """),
- SpriteKind.Tile)
- tile.set_flag(SpriteFlag.INVISIBLE, False)
- tiles.place_on_tile(tile, value2)
- sprites.set_data_boolean(tile, "revealed", False)
- def count_gophers_where_i_am(mySprite: Sprite):
- global currentTileLocation, number_of_gophers_next_to_me
- currentTileLocation = tiles.location_of_sprite(mySprite)
- number_of_gophers_next_to_me = 0
- if tiles.tile_is(tiles.location_in_direction(tiles.location_in_direction(currentTileLocation, CollisionDirection.LEFT),
- CollisionDirection.TOP),
- assets.tile("""
- tile2
- """)):
- number_of_gophers_next_to_me += 1
- if tiles.tile_is(tiles.location_in_direction(currentTileLocation, CollisionDirection.TOP),
- assets.tile("""
- tile2
- """)):
- number_of_gophers_next_to_me += 1
- if tiles.tile_is(tiles.location_in_direction(tiles.location_in_direction(currentTileLocation, CollisionDirection.TOP),
- CollisionDirection.RIGHT),
- assets.tile("""
- tile2
- """)):
- number_of_gophers_next_to_me += 1
- if tiles.tile_is(tiles.location_in_direction(currentTileLocation, CollisionDirection.LEFT),
- assets.tile("""
- tile2
- """)):
- number_of_gophers_next_to_me += 1
- if tiles.tile_is(tiles.location_in_direction(currentTileLocation, CollisionDirection.RIGHT),
- assets.tile("""
- tile2
- """)):
- number_of_gophers_next_to_me += 1
- if tiles.tile_is(tiles.location_in_direction(tiles.location_in_direction(currentTileLocation, CollisionDirection.BOTTOM),
- CollisionDirection.LEFT),
- assets.tile("""
- tile2
- """)):
- number_of_gophers_next_to_me += 1
- if tiles.tile_is(tiles.location_in_direction(currentTileLocation, CollisionDirection.BOTTOM),
- assets.tile("""
- tile2
- """)):
- number_of_gophers_next_to_me += 1
- if tiles.tile_is(tiles.location_in_direction(tiles.location_in_direction(currentTileLocation, CollisionDirection.BOTTOM),
- CollisionDirection.RIGHT),
- assets.tile("""
- tile2
- """)):
- number_of_gophers_next_to_me += 1
- return number_of_gophers_next_to_me
-
- def on_on_overlap(sprite8, otherSprite):
- global currentTile
- currentTile = otherSprite
- sprites.on_overlap(SpriteKind.Collison, SpriteKind.Tile, on_on_overlap)
-
- def on_overlap_tile8(sprite9, location8):
- sprite9.destroy()
- scene.on_overlap_tile(SpriteKind.Tile,
- assets.tile("""
- tile0
- """),
- on_overlap_tile8)
-
- def on_overlap_tile9(sprite10, location9):
- sprite10.destroy()
- scene.on_overlap_tile(SpriteKind.Tile,
- assets.tile("""
- tile13
- """),
- on_overlap_tile9)
-
- def place_gophers():
- global allOpenTiles, random_tile_index
- allOpenTiles = tiles.get_tiles_by_type(assets.tile("""
- tile
- """))
- index = 0
- while index <= number_of_gophers - 1:
- random_tile_index = randint(0, len(allOpenTiles) - 1)
- tiles.set_tile_at(allOpenTiles.remove_at(random_tile_index),
- assets.tile("""
- tile2
- """))
- index += 1
- random_tile_index = 0
- allOpenTiles: List[tiles.Location] = []
- number_of_gophers_next_to_me = 0
- currentTileLocation: tiles.Location = None
- tile: Sprite = None
- temp_number = 0
- currentTile: Sprite = None
- number_of_gophers_but_here = 0
- tile_Numbers: List[Image] = []
- number_of_gophers = 0
- seenTileImage: Image = None
- unseenTileImage: Image = None
- target: Sprite = None
- recursive_target: Sprite = None
- num_flags_placed = 0
- tiles.set_small_tilemap(tilemap("""
- level1
- """))
- recursive_target = sprites.create(img("""
- 3
- """), SpriteKind.secret)
- recursive_target.set_flag(SpriteFlag.INVISIBLE, True)
- cursor = sprites.create(img("""
- . . f . . . . .
- . f 1 f . . . .
- . f 1 f f f . .
- . f 1 b 1 b f .
- . f 1 b 1 b 1 f
- f 1 1 1 1 1 1 f
- f 1 1 1 1 1 1 f
- . f f f f f f .
- """),
- SpriteKind.player)
- cursor.z = 10000000000
- target = sprites.create(img("""
- 2
- """), SpriteKind.Collison)
- target.set_flag(SpriteFlag.INVISIBLE, True)
- controller.move_sprite(cursor, 50, 50)
- unseenTileImage = img("""
- 9 1 1 1 1 1 1 d
- 1 b b b b b b c
- 1 b b b b b b c
- 1 b b b b b b c
- 1 b b b b b b c
- 1 b b b b b b c
- 1 b b b b b b c
- d c c c c c c f
- """)
- seenTileImage = img("""
- 9 1 1 1 1 1 1 d
- 1 b b b b 2 2 c
- 1 b e e e e b 2
- 1 b f e f e 2 c
- 1 e e e e e b c
- 1 b e e e e 2 c
- 1 b b b b b b c
- d c c c c c c f
- """)
- number_of_gophers = 30
- tile_Numbers = [assets.tile("""
- tile12
- """),
- assets.tile("""
- tile0
- """),
- assets.tile("""
- tile13
- """),
- assets.tile("""
- tile14
- """),
- assets.tile("""
- tile15
- """),
- assets.tile("""
- tile16
- """),
- assets.tile("""
- tile17
- """),
- assets.tile("""
- tile18
- """),
- assets.tile("""
- tile19
- """)]
- make_cover_tiles()
- place_gophers()
-
- def on_on_update():
- target.set_position(Math.floor(cursor.left) + 3, Math.floor(cursor.top) + 1)
- game.on_update(on_on_update)
复制代码
|