笨办法学Python3 ex52 习题52_generic death-程序员宅基地

技术标签: 笨办法学Python3  

学习第52课有一个星期了, 这一课有点绕, 不过还是通过大量的print来分析程序如果动作的, 一行一行的分析后, 渐渐明白了工作原理,特别是.globals(). 

下面是planisphere.py代码

class Room(object):

	def __init__(self, name, description):
		self.name = name
		self.description = description
		self.paths = {}

	def go(self, direction):
		return self.paths.get(direction, None)

	def add_paths(self, paths):
		self.paths.update(paths)



central_corridor = Room("Central Corridor",
"""
The Gothons of Planet Percal #25 have invaded your ship and destroyed
your entire crew. You are the last surviving member and your last mission
is to get the neutron destruct bomb from the Weapons Armory, put it in the 
bridge, and blow the ship up after getting into an escape pod.

You're running down the central corridor to the Weapons Armory when a Gothon
jumps out, red scaly skin, dark grimy teeth, and evil clown costume
flowing around his hate filled body. He's blocking the door to the Armory and about
to pull a weapon to blast you.
""")

laser_weapon_armory = Room("Laser Weapon Armory",
""" 
Lucky for you they made you learn Gothon insults in the academy. You tell the one Gothon 
joke you know: lbhe zbgure vf fb sng, jura fur fvgf nebhaq qur ubsjf, fuia sjf elj  lsjf owejf lsfjl.
The Gothon stops, tries not to laugh, the busts out laughing and can't move. While he's laughing
you run up and shoot him square in the head putting him down , then jump through the Weapon
Armory door.

You do a dive roll into the Weapon Armory, crouch and scan the room for more Gothons that
might be hiding. It's dead quiet, too quiet. You stand up and run to the far side of the room and
find the neutron bomb in its container. There's a keypad lock on the box and you need the code to 
get the bomb out. If you get the code wrong 10 times then the lock closes forever and you can't
get the bomb. The code is 3 digits.
""")

the_bridge = Room("The Bridge",
"""
The container clicks open and the seal breaks, letting gas out. You grab the neutron bomb and run 
as fast as you can to the bridge where you must place it in the right spot.

You burst onto the Bridge with the netron destruct bomb under your arm and surprise 5Gothons who 
are trying to take control of the ship. Each of them has an even uglier clown costume than the last. They 
haven't pulled their weapons out yet, as they see the active bomb under your arm and don't want to set it off.
""")

escape_pod = Room("Escape Pod",
"""
You point your blaster at the bomb under your arm and the Gothons put their hands up and start to sweat.
You inch backward to the door, open it, and then carefully place the bomb on the floor, pointing your
blaster at it. You then jump back through the door, punch the close button and blast the lock so the Gothons 
can't get out. Now that the bomb is placed you run to the eacape pod to get off this tin can.

You rush through the ship desperately trying to make it to the escape pod before the whole ship explodes.
It seems like hardly any Gothons are on the ship, so your run is clear of interference. You get to the chamber
with the escape pods, and now need to pick one to take. Some of them could be damaged but you don't have 
time to look. There's 5 pods, which one do you take?
""")

the_end_winner = Room("The End",
"""
You jump into pod 2 and hit the eject button. The pod easily slides out into space heading to the planet below. 
As if flies to the planet, you look back and see your ship implode then explode like a bright star, taking
out the Gothon ship at the same time. You win!
""")

the_end_loser = Room("The End",
"""
You jump into a random pod and hit the eject button. The pod escapes out into the void of space, then 
implodes as the hull ruptures, crushing your body into jam jelly.
""")

shoot_death = Room("The End",
"""
you shoot your self!
""")

dodge_death = Room("The End",
"""
you dodge to wrong side, get hit by a machine!
""")

number_death = Room("The End",
"""
please, call your mother then fall down into a hole!
""")

escape_pod.add_paths({
    '2': the_end_winner,
    '*': the_end_loser
})

generic_death = Room("death", "You died.")

the_bridge.add_paths({
    'throw the bomb': generic_death,
    'slowly place the bomb': escape_pod
})

laser_weapon_armory.add_paths({
    '0132': the_bridge,
    'i don`t know': number_death
})

central_corridor.add_paths({
    'shoot!': shoot_death,
    'dodge!': dodge_death,
    'tell a joke': laser_weapon_armory
})




START = 'central_corridor'

def load_room(name):  #  globals().get(name)返回了一个类, 还有参数  central_corridor = Room("Central Corridor",'XXXXXXXXXX')
	                                         #其实retrun就是返回了这个实例对象   central_corridor, 不是字符串


	"""
	There is a potential security problem here.
	Who gets to set name? Can that expose a variable?
	"""
	return globals().get(name)  # global() 就是把这个.py文件里所有变量都以字典形式拿到,包含生成的实例,实例对象如下面这样
                                # {'laser_weapon_armory' : <__main__.Room object at 0x00000292DE7A29A0>}
def name_room(room):
	"""
	Sam possible security problem. Can you trust room?
	What`s a better solution than this globals lookup?
	"""
	for key ,valure in globals().items():  # item()就是把每个字典转成了小元组,方便key,value来取出
		if valure == room:
			# print (key)
			return key


# print(name_room(laser_weapon_armory))   #'laser_weapon_armory', <__main__.Room object at 0x00000292DE7A29A0>
# print(globals())
# print(load_room(name_room(central_corridor)))
# load_room(name_room(central_corridor))
# print(load_room(name_room(central_corridor)).go('tell a joke')())
# print(globals())

下面是app.py

from flask import Flask, render_template, session, redirect, url_for, request
from gothonweb import planisphere

app = Flask(__name__)

@app.route('/')
def index():
	# this is used to "setup" the session with starting values
	session['room_name'] = planisphere.START
	# print(session)    #查看session到底是什么, 原来是一个字典<SecureCookieSession {'room_name': 'central_corridor'}>
	return redirect(url_for('game'))   #url_for('game')  返回 game 函数上面路由括号里面参数 '/game',相当于redirect('/game')
#  redirect()就是重新导向  '/game'  也就是127.0.0.1:5000/game, 简单来说打开127.0.0.1:5000,实际打开的是127.0.0.0:5000/game

@app.route('/game', methods=['GET', 'POST'])
def game():
	# print(session.get('room_name'))  #查看sesstion中 key 为room_name的 value 是什么: central_corridor
	# print(type(session.get('room_name')))   #    <class 'str'>
	room_name = session.get('room_name')   # central_corridor
	print("room name A:", room_name)

	if request.method == 'GET':   # 第一次打开页面,从上面的路由'/', 定向到'/game',一定会走GET
		print('走的GET')          #  每一次提交完页面刷新后,先走一次GET, 提交完走POST,再走一次GET,
		if room_name:

			room = planisphere.load_room(room_name)   # central_corridor = Room("Central Corridor",'adfasdfasd')3
			print(type(room))
			return render_template("show_room.html", room=room)

		else:
			return render_template('you_died.html')    # 走不到这里

	else:
		print('走的POST')
		action = request.form.get('action')  # requst.form.get('action')能拿到网页端input name='action'的输入信息
		# print(action)   form.get拿到tell a joke
		if room_name and action:

			# print('Post room_name :',room_name)
			room = planisphere.load_room(room_name)   # central_corridor
			next_room = room.go(action) # next_room 拿到网页端input name='action'的输入信息去planisphere.py
			print(next_room)
			# 里面查找, 因为对应各room名字早已经添加了一些字典 例如:  central_corridor.add_paths({
																#     'shoot!': generic_death,
																#     'dodge!': generic_death,
																#     'tell a joke': laser_weapon_armory
																# })
																#如果输入是tell a joke, go函数会返回对应的房间
			if not next_room:
				session['room_name'] = planisphere.name_room(room)

			
			else:
				session['room_name'] = planisphere.name_room(next_room)    #{'next_room' : 'laser_weapon_armory '}

			print("session['room_name']:::", session ,'rome name B:',room_name)
		return redirect(url_for('game'))  #room=next_room返回给网页刚拿到新房间名


app.secret_key = 'asdfasdf21654asdgf156a6dsg'

if __name__ == "__main__":
	app.run()

 下面是show_room.html

{% extends "layout.html" %}

{% block content %}

<h1>{
   { room.name }}</h1>

<pre>
{
   { room.description }}
</pre>

{%  if room.name in ['death', 'The End'] %}
    <p><a href="/">Play Again</a></p>

{% else %}
    <p>
    <form action="/game" method="POST">
        - <input type="text" name="action"> <input type="submit">
    </form>
    </p>
{% endif %}

{% endblock %}

 下面是layout.html

<html>
    <head>

        <title>Gothons From Planet percal #25 From layou.html</title>
    </head>
    <body>


    {% block content %}

    {% endblock %}
    </body>
</html>

 下面是you_died.html , 因为session['room_name']永远都能拿到数据, 所以room_name不为空, 也就永远无法走到这里,除非 planisphere.py里面的START里面赋值为空,这样开始的页面就死掉了,没意义了.

{% extends 'layout.html' %}

{% block content %}
<h2> 我是you_died.html {
   { room.name }} </h2>

    <pre>
    {
   { room.description }}
    </pre>
{% endblock %}

ZED在书中说要用generic death写一个函数把所有死法写里面, 不太明白如何折腾,有人知道的可以回复.

 

 下面是app.py

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wggglggg/article/details/115505432

智能推荐

海康威视网络摄像头开发流程(五)------- 直播页面测试_ezuikit 测试的url-程序员宅基地

文章浏览阅读3.8k次。1、将下载好的萤石js插件,添加到SoringBoot项目中。位置可参考下图所示。(容易出错的地方,在将js插件在html页面引入时,发生路径错误的问题)所以如果对页面中引入js的路径不清楚,可参考下图所示存放路径。2、将ezuikit.js引入到demo-live.html中。(可直接将如下代码复制到你创建的html页面中)<!DOCTYPE html><html lan..._ezuikit 测试的url

如何确定组态王与多动能RTU的通信方式_组态王ua-程序员宅基地

文章浏览阅读322次。第二步,在弹出的对话框选择,设备驱动—>PLC—>莫迪康—>ModbusRTU—>COM,根据配置软件选择的协议选期期,这里以此为例,然后点击“下一步”。第四步,把使用虚拟串口打勾(GPRS设备),根据需要选择要生成虚拟口,这里以选择KVCOM1为例,然后点击“下一步”设备ID即Modbus地址(1-255) 使用DTU时,为下485接口上的设备地址。第六步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“第五步,Modbus的从机地址,与配置软件相同,这里以1为例,点击“下一步“_组态王ua

npm超详细安装(包括配置环境变量)!!!npm安装教程(node.js安装教程)_npm安装配置-程序员宅基地

文章浏览阅读9.4k次,点赞22次,收藏19次。安装npm相当于安装node.js,Node.js已自带npm,安装Node.js时会一起安装,npm的作用就是对Node.js依赖的包进行管理,也可以理解为用来安装/卸载Node.js需要装的东西_npm安装配置

火车头采集器AI伪原创【php源码】-程序员宅基地

文章浏览阅读748次,点赞21次,收藏26次。大家好,小编来为大家解答以下问题,python基础训练100题,python入门100例题,现在让我们一起来看看吧!宝子们还在新手村练级的时候,不单要吸入基础知识,夯实自己的理论基础,还要去实际操作练练手啊!由于文章篇幅限制,不可能将100道题全部呈现在此除了这些,下面还有我整理好的基础入门学习资料,视频和讲解文案都很齐全,用来入门绝对靠谱,需要的自提。保证100%免费这不,贴心的我爆肝给大家整理了这份今天给大家分享100道Python练习题。大家一定要给我三连啊~

Linux Ubuntu 安装 Sublime Text (无法使用 wget 命令,使用安装包下载)_ubuntu 安装sumlime text打不开-程序员宅基地

文章浏览阅读1k次。 为了在 Linux ( Ubuntu) 上安装sublime,一般大家都会选择常见的教程或是 sublime 官网教程,然而在国内这种方法可能失效。为此,需要用安装包安装。以下就是使用官网安装包安装的教程。打开 sublime 官网后,点击右上角 download, 或是直接访问点击打开链接,即可看到各个平台上的安装包。选择 Linux 64 位版并下载。下载后,打开终端,进入安装..._ubuntu 安装sumlime text打不开

CrossOver for Mac 2024无需安装 Windows 即可以在 Mac 上运行游戏 Mac运行exe程序和游戏 CrossOver虚拟机 crossover运行免安装游戏包-程序员宅基地

文章浏览阅读563次,点赞13次,收藏6次。CrossOver24是一款类虚拟机软件,专为macOS和Linux用户设计。它的核心技术是Wine,这是一种在Linux和macOS等非Windows操作系统上运行Windows应用程序的开源软件。通过CrossOver24,用户可以在不购买Windows授权或使用传统虚拟机的情况下,直接在Mac或Linux系统上运行Windows软件和游戏。该软件还提供了丰富的功能,如自动配置、无缝集成和实时传输等,以实现高效的跨平台操作体验。

随便推点

一个用聊天的方式让ChatGPT写的线程安全的环形List_为什么gpt一写list就卡-程序员宅基地

文章浏览阅读1.7k次。一个用聊天的方式让ChatGPT帮我写的线程安全的环形List_为什么gpt一写list就卡

Tomcat自带的设置编码Filter-程序员宅基地

文章浏览阅读336次。我们在前面的文章里曾写过Web应用中乱码产生的原因和处理方式,旧文回顾:深度揭秘乱码问题背后的原因及解决方式其中我们提到可以通过Filter的方式来设置请求和响应的encoding,来解..._filterconfig selectencoding

javascript中encodeURI和decodeURI方法使用介绍_js encodeur decodeurl-程序员宅基地

文章浏览阅读651次。转自:http://www.jb51.net/article/36480.htmencodeURI和decodeURI是成对来使用的,因为浏览器的地址栏有中文字符的话,可以会出现不可预期的错误,所以可以encodeURI把非英文字符转化为英文编码,decodeURI可以用来把字符还原回来_js encodeur decodeurl

Android开发——打包apk遇到The destination folder does not exist or is not writeable-程序员宅基地

文章浏览阅读1.9w次,点赞6次,收藏3次。前言在日常的Android开发当中,我们肯定要打包apk。但是今天我打包的时候遇到一个很奇怪的问题Android The destination folder does not exist or is not writeable,大意是目标文件夹不存在或不可写。出现问题的原因以及解决办法上面有说报错的中文大意是:目标文件夹不存在或不可写。其实问题就在我们的打包界面当中图中标红的Desti..._the destination folder does not exist or is not writeable

Eclipse配置高大上环境-程序员宅基地

文章浏览阅读94次。一、配置代码编辑区的样式 <1>打开Eclipse,Help —> Install NewSoftware,界面如下: <2>点击add...,按下图所示操作: name:随意填写,Location:http://eclipse-color-th..._ecplise高大上设置

Linux安装MySQL-5.6.24-1.linux_glibc2.5.x86_64.rpm-bundle.tar_linux mysql 安装 mysql-5.6.24-1.linux_glibc2.5.x86_6-程序员宅基地

文章浏览阅读2.8k次。一,下载mysql:http://dev.mysql.com/downloads/mysql/; 打开页面之后,在Select Platform:下选择linux Generic,如果没有出现Linux的选项,请换一个浏览器试试。我用的谷歌版本不可以,换一个别的浏览器就行了,如果还是不行,需要换一个翻墙的浏览器。 二,下载完后解压缩并放到安装文件夹下: 1、MySQL-client-5.6.2_linux mysql 安装 mysql-5.6.24-1.linux_glibc2.5.x86_64.rpm-bundle