:apachecn/python-code-anal

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

改进自 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 += 1elif row != length - 1:row, col = row + 1, 0else:row, col = 0, 0if used[row][col] != 0:breakreturn 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-1walls[row][col] |= CONN_RIGHTelif direction==GO_UP:row=row-1 walls[row][col] |= CONN_DOWNelif direction==GO_RIGHT:walls[row][col] |= CONN_RIGHT    col=col+1elif direction==GO_DOWN:walls[row][col] |= CONN_DOWNrow=row+1# 更新计数,设置已访问count=count+1used[row][col]=countprint_maze(walls, used, enter_col)else:# 否则,选取下一个已访问的格子重复这个步骤# 因为外面已经检查了是否可移动,# 这里只检查已访问就可以了row, col = get_next_used(row, col, used)# 最后,随机选择出口col=random.randint(0,width-1)row=length-1walls[row][col]=walls[row][col]+1print_maze(walls, used, enter_col)if __name__ == '__main__': main()

BasicGames Python 源码解析 02 Amazing相关推荐

  1. BasicGames Python 源码解析 01 AceyDucey

    :apachecn/python-code-anal 导入 import random cards # 定义卡牌面值和名称的映射 cards = {1: "1",2: " ...

  2. Python源码解析:内存管理(DEBUG模式)的几个理解点

    写了这多贴子,顺带写点自己的感想吧!其实很多贴子在写的时候很踌躇,比如这次打算写的python内存管理,因为内存管理都比较琐碎,在软件架构里,也是很容易出问题的地方,涉及的细节内容非常多,要写好写明白 ...

  3. Python源码解析-整数与引用计数器

    文章目录 简介 PyLongObject 大小整数 大小整数的区分 小整数池初始化 整数对象的创建 计数回收机制 本文基于Python3.10.4. 简介 在Python源码中,整数这个概念是通过Py ...

  4. python 源码解析 object 定义的介绍

    在python的世界中一切皆对象,所有的子类都是继承自同一个父类,object 那object 到底是什么呢? 来看源码定义 typedef struct _object {_PyObject_HEA ...

  5. android输入法01:SoftKeyboard源码解析02

    转载自:http://www.apkbus.com/forum.php?mod=viewthread&tid=52413 本篇为SoftKeyboard源代码注释. 1.LatinKeyboa ...

  6. python 源码解析

    http://blog.donews.com/lemur/archive/category/cpython%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/ 转载于:https ...

  7. Attention is all you need pytorch实现 源码解析01 - 数据预处理、词表的构建

    我们今天开始分析著名的attention is all you need 论文的pytorch实现的源码解析. 由于项目很大,所以我们会分开几讲来进行讲解. 先上源码:https://github.c ...

  8. python处理回显_Python中getpass模块无回显输入源码解析

    本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api ...

  9. python flask源码解析_用尽洪荒之力学习Flask源码

    [TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...

最新文章

  1. 戴尔服务器重装系统优盘启动不了怎么办,U盘重装系统,开机按F12选择USB启动项无法进入PE系统怎么办?...
  2. 面了一把Java P6 岗,一个问题就干趴下了!
  3. 在Win7上安装WINDRIVER.TORNADO.V2.2.FOR.PENTIUM与运行HelloWorld
  4. hibernate hbm2ddl.auto 问题
  5. HDU 1814 Peaceful Commission
  6. android模拟器EditText 不能用物理键盘输入,也不能用电脑键盘输入
  7. 【Tiny4412】 Tiny4412开发环境搭建
  8. java web 树形管理_java web 后台树形菜单排序
  9. swift date 计算差_[Swift 设计模式] 适配器
  10. PAT 乙级1016 部分A+B(C语言)
  11. mysql怎么用sb文件_初识mysql数据库
  12. web开发 DIV+CSS规范命名集合
  13. 转:深度解析Java8 – AbstractQueuedSynchronizer的实现分析(上)
  14. EasyRecovery如何恢复javascript文件
  15. npm常用命令及参数详解
  16. 专业Excel组件Spire.XLS 教程:在Excel中合并单元格
  17. springBoot集成Activiti6
  18. 7.8 W 字总结!Java 8—Java 10 特性详解
  19. TCP的四次挥手为什么需要2MSL ?
  20. 解决阿里云域名解析失败的问题 - 总结篇

热门文章

  1. 基于ZYNQ FPGA实现8路ADC数据采集存储(AD7606)
  2. 有源蜂鸣器的驱动设计
  3. 12006.eeprom之M24C02
  4. 【C语言】运算符与操作符的用法全面汇总(非常有用)
  5. Anaconda下安装tensorflow-gpu踩坑日记
  6. 分布式Session的几种实现方式
  7. MyBatis-Plus工具快速入门使用
  8. logstash 使用glusterfs网络存储偶发性文件解析异常的问题
  9. WordPress文章阅读量统计和显示(非插件, 刷新页面不累加)
  10. 麦步手表编程纪实(1)