BasicGames Python 源码解析 02 Amazing

简介: BasicGames Python 源码解析 02 Amazing

这个游戏会接收用户输入的长和宽,动态生成一个迷宫

改进自 Frank Palazzolo 的版本。



导入

import random
import os
from time import sleep



常量

# 定义移动方向常量
GO_LEFT, GO_UP, GO_RIGHT, GO_DOWN = [0, 1, 2, 3]
# 定义连通方向常量
CONN_DOWN = 1
CONN_RIGHT = 2



get_width_length()

# 从用户输入获取迷宫的长和宽
def get_width_length():
    while True:
        try:
            width, length = input('What are your width and length?').split(',')
            width = int(width)
            length = int(length)
            if width != 1 and length != 1:
                return (width, length)
            print('Meaningless dimensions. Try again.')
        except ValueError:
            print('Meaningless dimensions. Try again.')



get_possible_dirs()

# 返回从一个格子的可移动方向
def get_possible_dirs(row, col, width, length, used):
    possible_dirs = [GO_LEFT,GO_UP,GO_RIGHT,GO_DOWN]
    # 如果不是最左边,并且左面一格没有访问
    # 那左边就是可以访问的,以此类推
    if col==0 or used[row][col-1]!=0:
        possible_dirs.remove(GO_LEFT)
    if row==0 or used[row-1][col]!=0:
        possible_dirs.remove(GO_UP)
    if col==width-1 or used[row][col+1]!=0: 
        possible_dirs.remove(GO_RIGHT)
    if row==length-1 or used[row+1][col]!=0:
        possible_dirs.remove(GO_DOWN)   
    return possible_dirs



get_next_used()

# 获取某个位置的下一个已访问格子
def get_next_used(row, col, used):
    length, width  = len(used), len(used[0])
    while True:
        if col != width - 1:
            col += 1
        elif row != length - 1:
            row, col = row + 1, 0
        else:
            row, col = 0, 0
        if used[row][col] != 0:
            break
    return row, col


print_maze()

# 打印迷宫
def print_maze(walls, used, enter_col):
    # 每次打印之前先清屏
    os.system('cls')
    length, width = len(walls), len(walls[0])
    # 打印最上方的墙壁
    for col in range(width):
        # 如果是入口,就把它打开
        if col==enter_col:
            print('*  ',end='')
        else:
            print('*--',end='')
    print('*')
    for row in range(length):
        # 打印格子
        print('|',end='')
        for col in range(width):
            # 区分已访问和未访问
            cell_ch = '  ' if used[row][col] != 0 else '><'
            # 区分格子右边是否有墙壁
            if walls[row][col] | CONN_RIGHT == walls[row][col]:
                print(cell_ch + ' ',end='')
            else:
                print(cell_ch + '|',end='')
        print()
        # 打印格子下方的墙壁
        for col in range(width):
            # 区分格子下方是否有墙壁
            if walls[row][col] | CONN_DOWN == walls[row][col]:
                print('*  ',end='')
            else:
                print('*--',end='')
        print('*')
    # 短暂停留避免一闪而过
    sleep(0.1)



main()

# 程序的主要逻辑
def main():
    print(' '*28+'AMAZING PROGRAM')
    print(' '*15+'CREATIVE COMPUTING  MORRISTOWN, NEW JERSEY')
    print()
    print()
    print()
    # 获取用户输入的长和宽
    width, length = get_width_length()
    # used 数组保存格子是否访问过
    # 0 表示未访问,其它数字表示该格子是第几个访问的
    used = [[0]*width for _ in range(length)]
    # wall 保存右边和下边是不是连通的
    # 0:不连通,1:下侧连通,2:右侧连通,3:右侧和下侧连通
    walls = [[0]*width for _ in range(length)]
    # 随机选取入口
    enter_col=random.randint(0,width-1)
    # 将起始位置定义为入口
    row,col=0,enter_col
    # 定义已访问格子数量
    count=1
    # 设置入口已访问
    used[row][col]=count
    # 每次格式发生变化都会打印迷宫,下同
    print_maze(walls, used, enter_col)
    # 在所有格子都已访问之前执行循环
    while count!=width*length:
        # 获取当然位置的可移动方向
        possible_dirs = get_possible_dirs(row, col, width, length, used)
        if len(possible_dirs)!=0:
            # 如果可以移动,那么随机选一个方向来移动
            # 并且把墙拆掉
            direction=random.choice(possible_dirs) 
            if direction==GO_LEFT:
                col=col-1
                walls[row][col] |= CONN_RIGHT
            elif direction==GO_UP:
                row=row-1 
                walls[row][col] |= CONN_DOWN
            elif direction==GO_RIGHT:
                walls[row][col] |= CONN_RIGHT    
                col=col+1
            elif direction==GO_DOWN:
                walls[row][col] |= CONN_DOWN
                row=row+1
            # 更新计数,设置已访问
            count=count+1
            used[row][col]=count
            print_maze(walls, used, enter_col)
        else:
            # 否则,选取下一个已访问的格子重复这个步骤
            # 因为外面已经检查了是否可移动,
            # 这里只检查已访问就可以了
            row, col = get_next_used(row, col, used)
    # 最后,随机选择出口
    col=random.randint(0,width-1)
    row=length-1
    walls[row][col]=walls[row][col]+1
    print_maze(walls, used, enter_col)
if __name__ == '__main__': main()
相关文章
|
4月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
1069 0
|
4月前
|
人工智能 数据安全/隐私保护 异构计算
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
509 8
桌面版exe安装和Python命令行安装2种方法详细讲解图片去水印AI源码私有化部署Lama-Cleaner安装使用方法-优雅草卓伊凡
|
3月前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
236 0
|
4月前
|
存储 大数据 Unix
Python生成器 vs 迭代器:从内存到代码的深度解析
在Python中,处理大数据或无限序列时,迭代器与生成器可避免内存溢出。迭代器通过`__iter__`和`__next__`手动实现,控制灵活;生成器用`yield`自动实现,代码简洁、内存高效。生成器适合大文件读取、惰性计算等场景,是性能优化的关键工具。
270 2
|
4月前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
1101 0
|
3月前
|
数据采集 存储 JavaScript
解析Python爬虫中的Cookies和Session管理
Cookies与Session是Python爬虫中实现状态保持的核心。Cookies由服务器发送、客户端存储,用于标识用户;Session则通过唯一ID在服务端记录会话信息。二者协同实现登录模拟与数据持久化。
|
4月前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
|
4月前
|
小程序 PHP 图形学
热门小游戏源码(Python+PHP)下载-微信小程序游戏源码Unity发实战指南​
本文详解如何结合Python、PHP与Unity开发并部署小游戏至微信小程序。涵盖技术选型、Pygame实战、PHP后端对接、Unity转换适配及性能优化,提供从原型到发布的完整指南,助力开发者快速上手并发布游戏。
|
10月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
978 29
|
10月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
428 4

推荐镜像

更多