猫史档案馆


【Python作品分享】走格子游戏【作业帖】

用户:王胤蔚王胤蔚查看:0 回复:1 评论:0 创建时间:2024-08-09T22:09:38


【作品展示】

center_image

 

【作品介绍】

 

【作品源代码】

import turtle
import copy
import os
import sys

# Python解释器工作目录
base_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
os.chdir(base_dir)


# -----------------------------------------------------------------
# 功能模块区,主要放置函数  
# 观察绘制砖块和角喵像的代码,合并简化,这里可以引入global
def draw(pen, img, x, y):
    """
    绘制砖块
    """
    global origin_x, origin_y, size
    pen.shape(img)
    pen.goto(origin_x + x * size, origin_y - y * size)
    pen.stamp()


def move_up():
    global grid_x, grid_y, grid, result
    if result != 2:
        return
    grid_y -= 1
    # 移动范围
    if grid_y < 0:
        grid_y += 1
        return
    elif grid[grid_y][grid_x] == 1:
        grid_y += 1
        return
    # 更新信息
    update()


def move_down():
    global grid_x, grid_y, grid, height, result
    if result != 2:
        return
    grid_y += 1
    # 移动范围
    if grid_y >= height:
        grid_y -= 1
        return
    elif grid[grid_y][grid_x] == 1:
        grid_y -= 1
        return
    # 更新信息
    update()


def move_left():
    global grid_x, grid_y, grid, result
    if result != 2:
        return
    grid_x -= 1
    # 移动范围
    if grid_x < 0:
        grid_x += 1
        return
    elif grid[grid_y][grid_x] == 1:
        grid_x += 1
        return
    # 更新信息
    update()


def move_right():
    global grid_x, grid_y, grid, width, result
    if result != 2:
        return
    grid_x += 1
    # 移动范围
    if grid_x >= width:
        grid_x -= 1
        return
    elif grid[grid_y][grid_x] == 1:
        grid_x -= 1
        return
    # 更新信息
    update()


def update():
    global grid, grid_x, grid_y
    if grid[grid_y][grid_x] == 2:
        grid[grid_y][grid_x] = 3
    elif grid[grid_y][grid_x] == 3:
        grid[grid_y][grid_x] = 4
    elif grid[grid_y][grid_x] == 5:
        grid[grid_y][grid_x] = 2
    update_result()


def exchange(grid_x, grid_y):
    global grid, width, height
    for i in range(height):
        for j in range(width):
            if grid[i][j] == grid[grid_y][grid_x] and (grid_y != i or grid_x != j):
                return j, i


def update_result():
    """
    更新游戏状态
    """
    global result, grid, grid_x, grid_y
    if grid[grid_y][grid_x] == 4:
        result = 0
    else:
        result = 1
        for i in grid:
            if 2 in i:
                result = 2
                break


def next_level():
    global result, level_num, grid, grid_x, grid_y, width, height, origin_x, origin_y, size
    if result == 1:
        level_num += 1
    result = 2
    grid = copy.deepcopy((level_store[level_num - 1]))
    grid_x = position_store[level_num - 1][0]
    grid_y = position_store[level_num - 1][1]
    width = len(grid[0])
    height = len(grid)
    origin_x = 0 - size * (width - 1) / 2
    origin_y = 0 + size * (height - 1) / 2


# ------------------------------------------------------------
# 基本信息区,放置游戏相关的一些信息
''' 地图二维列表信息  0: 空  1:墙壁  2:通道  3:目标  4:窟窿  5:箱子.gif 6:'''
# 关卡地图列表
level1 = [[1, 1, 1, 1, 1, 1],
          [1, 2, 2, 2, 2, 1],
          [1, 2, 1, 2, 2, 1],
          [1, 3, 2, 2, 3, 1],
          [1, 1, 2, 2, 2, 1],
          [0, 1, 1, 1, 1, 1]]
level2 = [[2, 2, 2, 2, 2, 2],
          [2, 2, 2, 2, 2, 2],
          [2, 2, 5, 5, 2, 2],
          [2, 2, 2, 2, 2, 2],
          [2, 2, 2, 2, 2, 2],
          [2, 2, 2, 2, 2, 2]]
level3 = [[1, 2, 2, 2, 2, 2, 1],
          [2, 2, 2, 2, 2, 2, 1],
          [2, 5, 5, 5, 5, 2, 1],
          [2, 3, 2, 2, 3, 2, 1],
          [2, 2, 2, 2, 2, 2, 1],
          [1, 2, 2, 2, 2, 5, 1]]
level4 = [[6, 5, 2, 2, 2, 2, 2, 5, 6],
          [2, 2, 2, 5, 2, 5, 2, 2, 1],
          [2, 6, 5, 6, 6, 6, 5, 2, 1],
          [5, 2, 3, 2, 2, 3, 2, 1, 5],
          [2, 5, 2, 2, 2, 2, 2, 5, 1],
          [2, 2, 2, 2, 2, 2, 2, 2, 2],
          [6, 5, 2, 2, 2, 2, 5, 6, 4]]
          [2, 2, 2, 2, 2, 2, 2, 2, 2]]


level_store = [level1, level2, level3, level4]
# 关卡角色位置列表
position_store = [[1, 3],
                  [4, 1]]
level_num = 1
grid = copy.deepcopy(level_store[level_num - 1])
size = 70
width = len(grid[0])
height = len(grid)
origin_x = 0 - size * (width - 1) / 2
origin_y = 0 + size * (height - 1) / 2
# 角色初始位置
grid_x = position_store[level_num - 1][0]
grid_y = position_store[level_num - 1][1]
# 游戏状态
'''  result    
0: 游戏结束    1:过关    2:游戏进行中'''
result = 2

# ------------------------------------------------------------
# 操作事件区
# 事件监听
turtle.onkey(move_up, 'Up')
turtle.onkey(move_down, 'Down')
turtle.onkey(move_left, 'Left')
turtle.onkey(move_right, 'Right')
turtle.onkey(next_level, 'Return')
turtle.listen()

# ------------------------------------------------------------
# 场景素材区,游戏画面相关的素材
# 添加素材
tile_shapes = ['空.gif', '墙壁.gif', '通道.gif', '目标.gif',
               '窟窿.gif', '通道2.gif']
for i in tile_shapes:
    turtle.addshape(i)
turtle.addshape('编程猫.gif')
result_shapes = ['失败.gif', '成功.gif', '空.gif']
for i in result_shapes:
    turtle.addshape(i)

# ------------------------------------------------------------
# 画面绘制区,绘制场景用的画笔,绘制场景的代码
# 创建绘制场景的画笔
p = turtle.Pen()
p.penup()
p.hideturtle()

turtle.tracer(False)
while True:
    p.clear()
    # 绘制地图
    for i in range(len(grid)):
        for j in range(len(grid[i])):
            draw(p, tile_shapes[grid[i][j]], j, i)
            # 绘制角色
    draw(p, '编程猫.gif', grid_x, grid_y)
    # 绘制结果
    draw(p, result_shapes[result], (width - 1) / 2, (height - 1) / 2)

    turtle.update()

turtle.done()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 1下一页
没有昵称才怪呢没有昵称才怪呢

笑死,一点都不难

点赞0


评论