python实现推箱子

Posted _刘文凯_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python实现推箱子相关的知识,希望对你有一定的参考价值。

python课程作业-推箱子

现在整理经常会用到的课程作业( python第三弹,持续更新中…)




目录




简介

现在经常需要用到各种作业,网上的资料存在着各种各样的问题,因此我就为了大家的方便,将这些收集整理并在本地进行验证。对这些代码或资料中能缺少、错误的部分加以修正和补充,确保按照我的步骤可以很简单的把这个代码运行出来,供大家当平时作业或者练习使用。

保证可以运行!!!



运行结果



系统环境

windows 10
python 3.6、3.7、3.8



其他依赖

需要先在win+r 输入 cmd,使用:

pip install keyboard




运行说明

按键盘进行操作:

W\\A\\S\\D 操作方向
T 退出




实现代码

新建“推箱子.py”文件,下列代码直接复制过去就可以使用:

# -*- coding: utf-8 -*-

# 初始化
# 墙:0    箱子:1   空:2    到达目的地:3   目的地: 4:   人:5

import keyboard
def Init():
    Interface = [
        [2, 0, 0, 0, 0, 2],
        [0, 0, 2, 2, 0, 2],
        [0, 5, 1, 2, 0, 2],
        [0, 0, 1, 2, 0, 0],
        [0, 0, 2, 1, 2, 0],
        [0, 4, 1, 2, 2, 0],
        [0, 4, 4, 3, 4, 0],
        [0, 0, 0, 0, 0, 0]
    ]  # 初始化界面
    return Interface

Interface = Init()

target = []  # 当人在目的地行走时,不会用空白将目的地覆盖
target_flag = 1
key = 0


# 显示界面
def show(Interface):
    global target_flag
    for i in range(len(Interface)):
        for j in range(len(Interface[i])):
            if ((j + 1) % len(Interface[i]) != 0):  # 没有一行不换行
                end = ''
            else:
                end = '\\n'
            if Interface[i][j] == 0:
                print('■', end=end)
            if Interface[i][j] == 1:
                print('☆', end=end)
            if Interface[i][j] == 2:
                print('  ', end=end)
            if Interface[i][j] == 3:
                print('●', end=end)
                if target_flag == 1:
                    target.append([i, j])
            if Interface[i][j] == 4:
                print('★', end=end)
                if target_flag == 1:
                    target.append([i, j])
            if Interface[i][j] == 5:
                print('♀', end=end)
    print('Show complete!')
    target_flag += 1  # 只添加第一次到target


def get_key(key_):
    global key
    key = key_

def get_input(Interface):
    def tui(input_key):
        break_flag = False  # 若指定运行完,则break
        input_key = input_key.name
        if input_key == 't' or input_key=='T':
            exit()
        for i in range(len(Interface)):
            for j in range(len(Interface[i])):
                if input_key == 'a' or input_key == 'A':  # 向左移动
                    # 如果数组为人且左边不为墙 那么俩种情况
                    if Interface[i][j] == 5 and Interface[i][j - 1] != 0:
                        if Interface[i][j - 1] != 1 and Interface[i][j - 1] != 3:  # 左边不为箱子,到达目的地
                            Interface[i][j - 1] = 5
                            Interface[i][j] = 2
                            break
                        else:  # 左边为箱子或目的地到达
                            if Interface[i][j - 2] != 0:  # 箱子左边不是墙
                                if Interface[i][j - 2] != 4:  # 箱子左边不是目的地
                                    Interface[i][j] = 2
                                    Interface[i][j - 1] = 5
                                    Interface[i][j - 2] = 1
                                else:  # 箱子到达目的地
                                    Interface[i][j] = 2
                                    Interface[i][j - 1] = 5
                                    Interface[i][j - 2] = 3

                            else:
                                pass
                elif input_key == 'd' or input_key == 'D':  # 向右移动
                    # 如果数组为人且右边不为墙 那么俩种情况
                    if Interface[i][j] == 5 and Interface[i][j + 1] != 0:
                        if Interface[i][j + 1] != 1 and Interface[i][j + 1] != 3:  # 右边不为箱子,到达目的地
                            Interface[i][j + 1] = 5
                            Interface[i][j] = 2
                            break  # 如果不break且右边没有障碍物 它会一直右走 for自左向右 向左无影响
                        else:  # 右边为箱子或目的地到达
                            if Interface[i][j + 2] != 0:  # 箱子右边不是墙
                                if Interface[i][j + 2] != 4:  # 箱子右边不是目的地
                                    Interface[i][j] = 2
                                    Interface[i][j + 1] = 5
                                    Interface[i][j + 2] = 1
                                    break
                                else:  # 箱子到达目的地
                                    Interface[i][j] = 2
                                    Interface[i][j + 1] = 5
                                    Interface[i][j + 2] = 3
                                    break
                            else:
                                pass
                elif input_key == 'w' or input_key == 'W':  # 向上移动
                    # 如果数组为人且上边不为墙 那么俩种情况
                    if Interface[i][j] == 5 and Interface[i - 1][j] != 0:
                        if Interface[i - 1][j] != 1 and Interface[i - 1][j] != 3:  # 上边不为箱子,到达目的地
                            Interface[i - 1][j] = 5
                            Interface[i][j] = 2
                            break
                        else:  # 上边为箱子或目的地到达
                            if Interface[i - 2][j] != 0:  # 箱子上边不是墙
                                if Interface[i - 2][j] != 4:  # 箱子上边不是目的地
                                    Interface[i][j] = 2
                                    Interface[i - 1][j] = 5
                                    Interface[i - 2][j] = 1
                                else:  # 箱子到达目的地
                                    Interface[i][j] = 2
                                    Interface[i - 1][j] = 5
                                    Interface[i - 2][j] = 3
                            else:
                                pass

                elif input_key == 's' or input_key == 'S':  # 向下移动
                    # 如果数组为人且下边不为墙 那么俩种情况
                    if Interface[i][j] == 5 and Interface[i + 1][j] != 0:
                        if Interface[i + 1][j] != 1 and Interface[i + 1][j] != 3:  # 下边不为 箱子,到达目的地
                            Interface[i + 1][j] = 5
                            Interface[i][j] = 2
                            break_flag = True

                        else:  # 下边为箱子或目的地到达
                            if Interface[i + 2][j] != 0:  # 箱子下边不是墙
                                if Interface[i + 2][j] != 4:  # 箱子下边不是目的地
                                    Interface[i][j] = 2
                                    Interface[i + 1][j] = 5
                                    Interface[i + 2][j] = 1
                                    break_flag = True
                                else:  # 箱子到达目的地
                                    Interface[i][j] = 2
                                    Interface[i + 1][j] = 5
                                    Interface[i + 2][j] = 3
                                    break_flag = True

                            else:
                                pass
                    if break_flag == True:  # 跳出第二层循环,否则会一直向下走 向上不会出现这种情况,因为for自上而下
                        break
                else:
                    print('您的输入有误,请重新输入')
                    break_flag = True
                    break
            if break_flag == True:  # 跳出第二层循环,否则会一直向下走 向上不会出现这种情况,因为for自上而下
                break

        for i in range(len(target)):
            for j in range(1):
                # 如果不是到达目的地的情况和人在目的地的情况   目的地还是为'★'
                if Interface[target[i][j]][target[i][j + 1]] != 3 and Interface[target[i][j]][target[i][j + 1]] != 5:
                    Interface[target[i][j]][target[i][j + 1]] = 4

        show(Interface)
        count = judge(Interface)

        if count == len(target):
            print('恭喜您,通关了')
            return

    while True:
        keyboard.hook(tui)
        keyboard.wait()


# 判断是否通关
def judge(Interface):
    count = 0  # 计数 如果都到达目的地 退出循环
    for i in range(len(Interface)):
        for j in range(len(Interface[i])):
            if Interface[i][j] == 3:
                count += 1
    return count


def main():
    show(Interface)
    get_input(Interface)


if __name__ == '__main__':
    main()





##




###

结语

和原来的差别,自动读取键盘,增加推出按键!

参考文献:

python推箱子:https://blog.csdn.net/weixin_43512511/article/details/91960530

以上是关于python实现推箱子的主要内容,如果未能解决你的问题,请参考以下文章

JAVA 实现《推箱子升级版》游戏

c语言推箱子小游戏

网易笔试题:推箱子

C语言实现推箱子游戏!(超简单详细)代码思路+源码分享

loj-1055-Going Together-三个棋子推箱子走到目的地--讲预判的bfs

华为机试真题 Python 实现箱子之字形摆放2022.11 Q4 新题