BasicGames Python 源码解析 02 Amazing
: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相关推荐
- BasicGames Python 源码解析 01 AceyDucey
:apachecn/python-code-anal 导入 import random cards # 定义卡牌面值和名称的映射 cards = {1: "1",2: " ...
- Python源码解析:内存管理(DEBUG模式)的几个理解点
写了这多贴子,顺带写点自己的感想吧!其实很多贴子在写的时候很踌躇,比如这次打算写的python内存管理,因为内存管理都比较琐碎,在软件架构里,也是很容易出问题的地方,涉及的细节内容非常多,要写好写明白 ...
- Python源码解析-整数与引用计数器
文章目录 简介 PyLongObject 大小整数 大小整数的区分 小整数池初始化 整数对象的创建 计数回收机制 本文基于Python3.10.4. 简介 在Python源码中,整数这个概念是通过Py ...
- python 源码解析 object 定义的介绍
在python的世界中一切皆对象,所有的子类都是继承自同一个父类,object 那object 到底是什么呢? 来看源码定义 typedef struct _object {_PyObject_HEA ...
- android输入法01:SoftKeyboard源码解析02
转载自:http://www.apkbus.com/forum.php?mod=viewthread&tid=52413 本篇为SoftKeyboard源代码注释. 1.LatinKeyboa ...
- python 源码解析
http://blog.donews.com/lemur/archive/category/cpython%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/ 转载于:https ...
- Attention is all you need pytorch实现 源码解析01 - 数据预处理、词表的构建
我们今天开始分析著名的attention is all you need 论文的pytorch实现的源码解析. 由于项目很大,所以我们会分开几讲来进行讲解. 先上源码:https://github.c ...
- python处理回显_Python中getpass模块无回显输入源码解析
本文主要讨论了python中getpass模块的相关内容,具体如下. getpass模块 昨天跟学弟吹牛b安利Python标准库官方文档的时候偶然发现了这个模块.仔细一看内容挺少的,只有两个主要api ...
- python flask源码解析_用尽洪荒之力学习Flask源码
[TOC] 一直想做源码阅读这件事,总感觉难度太高时间太少,可望不可见.最近正好时间充裕,决定试试做一下,并记录一下学习心得. 首先说明一下,本文研究的Flask版本是0.12. 首先做个小示例,在p ...
最新文章
- 戴尔服务器重装系统优盘启动不了怎么办,U盘重装系统,开机按F12选择USB启动项无法进入PE系统怎么办?...
- 面了一把Java P6 岗,一个问题就干趴下了!
- 在Win7上安装WINDRIVER.TORNADO.V2.2.FOR.PENTIUM与运行HelloWorld
- hibernate hbm2ddl.auto 问题
- HDU 1814 Peaceful Commission
- android模拟器EditText 不能用物理键盘输入,也不能用电脑键盘输入
- 【Tiny4412】 Tiny4412开发环境搭建
- java web 树形管理_java web 后台树形菜单排序
- swift date 计算差_[Swift 设计模式] 适配器
- PAT 乙级1016	部分A+B(C语言)
- mysql怎么用sb文件_初识mysql数据库
- web开发 DIV+CSS规范命名集合
- 转:深度解析Java8 – AbstractQueuedSynchronizer的实现分析(上)
- EasyRecovery如何恢复javascript文件
- npm常用命令及参数详解
- 专业Excel组件Spire.XLS 教程:在Excel中合并单元格
- springBoot集成Activiti6
- 7.8 W 字总结!Java 8—Java 10 特性详解
- TCP的四次挥手为什么需要2MSL ?
- 解决阿里云域名解析失败的问题 - 总结篇