python--笨方法学python 习题52
笨方法学python是一本不错的python入门书籍。
书的最后一节是一个web版的游戏程序,以下是程序代码:
1.项目的目录结构如下所示:
skeleton\
app.py
map.py
templates\
layout.html
show_room.html
you_died.html
2.游戏地图结构 map.py
其中Room类是游戏场景,包括场景名称 name,描述 description,通往下一场景的可能路径集合 paths。
定义了游戏中设计到的7个场景。
# -*- coding:utf-8 -*-
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",
"""
#25外星战机入侵了你的飞船,并且摧毁了你的部队。你是最后一个幸存者,你的最终任务是从武器室拿到炸弹,将炸弹放在驾驶舱,跳进分离仓之后,炸掉飞船。
你现在正在往武器室跑去,这时,一个外星人跳了出来,可怕的红色皮肤,暗淡肮脏的牙齿,丑陋的服装围绕着他那充满憎恶的身体。他正在关闭通往武器室的大门,并且掏
出武器对准了你。
"""
) laser_weapon_armory=Room("Laser Weapon Armory",
"""
幸运的是你知道外星人是由意念组成的。
你讲了一个你知道的外星笑话。
&$%@#$#%#@*&^$%$@#^&@%~$@%%!@~^^@#
外星人停止了动作,试着不发出笑声,最终禁不住大笑起来,并且停不下来。
当他笑的时候,你跑上前去,一枪命中他的眉心,将他放倒。然后跳进武器室。
你一个前空翻进入武器室,仔细地检查武器室是否藏有更多的外星人。死一般的寂静,太安静了。
你站起来,跑向武器室的角落,在盒子里找到了炸弹。盒子上有一个键盘,你需要输入密码才能将炸弹取出来。如果你输错10次,炸弹将永远被锁住无法取出。密码是4位数>字。
"""
) the_bridge=Room("The Bridge",
"""
盒子咔哒一声打开了,密封破裂,毒气逸出。
你一把抓起炸弹,尽可能快递跑向驾驶舱,你必须把炸弹安置在合适的地点。
你闯入驾驶舱,手臂下夹着炸弹,惊奇地发现有5个外星人正在试图控制飞船。他们中的每一个都比上一个拥有更加丑陋的服装。他们没有拿出武器,因为他们看见了你手臂>下的炸弹,并且不希望引爆它。
"""
) escape_pod=Room("Escape Pod",
"""
你拉出手臂下炸弹的导火线,外星人们举起手来,开始流汗。
你缓慢地退向门口,打开门,然后小心翼翼地把炸弹放在地上,拉出导火线。然后跳出驾驶舱,按下关闭按钮,门锁住了,外星人们无法逃出去。
现在炸弹已经安放好了,你跑向逃生通道。
你不顾一切地冲过飞船,以确保在整个飞船爆炸之前到达分离仓。看起来没有外星人在船上了,所以几乎没有遇到任何阻碍。你成功到达分离仓,然后你需要选择一个。他们
中的一些已经被摧毁了,但是你没有时间去检查。总共有5个分离仓,你将选择哪一个呢?
"""
) the_end_winner=Room("The End",
"""
你跳进了2号分离舱 ,按下发动按钮。分离舱很容易地向下方的地球滑去。当它飞向地球时,你往回看,发现你的飞船像一颗明亮的星星一样炸开了,同时炸掉了恶灵的飞船
。你赢了!
"""
) the_end_loser=Room("The End",
"""
你随便跳进一个分离舱,按下发动按钮。分离舱逃向未知的空间,然后因为外壳破裂而爆炸,把你的身体压成肉酱。
"""
)
escape_pod.add_paths({
'':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({
'':the_bridge,
'*':generic_death
}) central_corridor.add_paths({
'shoot!':generic_death,
'dodge!':generic_death,
'tell a joke':laser_weapon_armory
}) START=central_corridor
3.游戏引擎设计
游戏引擎,也就是我们的web应用程序入口,定义了起始场景。将场景作为参数传递给场景信息显示模板show_room.html,显示当前场景描述信息。玩家输入动作指令,提交表单后,根据当前场景以及输入的指令,确定下一场景并显示。因为Http协议的无状态性,当前场景可以通过两种方式传递:(1)通过web.py框架的session机制 (2)通过<input type="hidden" value="">隐藏域的方式。这里我们选择第一种方式。
import web
from map import *
import pdb
urls=(
'/game','GameEngine',
'/','Index',
) app=web.application(urls,globals()) if web.config.get('_session') is None:
store = web.session.DiskStore('sessions')
session = web.session.Session(app,store,initializer={'room':None,'count':0})
web.config._session = session
else:
session = web.config._session
render = web.template.render('templates/',base="layout") class Index(object):
def GET(self):
session.room = START
#输入错误密码次数初始化
session.count = 0
web.seeother("/game") class GameEngine(object):
def GET(self):
if session.room:
return render.show_room(room=session.room)
else:
#场景为None,则跳转到death界面
return render.you_died() def POST(self):
form = web.input(action=None)
if session.room and form.action:
result = session.room.go(form.action)
# pdb.set_trace()
#如果你输错10次,炸弹将永远被锁住无法取出
if session.room.name=='Laser Weapon Armory' and (result==None or result.name=='death') and session.count<10:
#输入错误密码次数累计
session.count=session.count+1
else:
session.room = result
web.seeother("/game") if __name__=="__main__":
app.run()
4.接着创建模板页,模板放在templates文件夹下.
mkdir templates
首先创建一个基础模板页 layout.html
$def with (content)
<html>
<head>
<title>Gothons From Planet Percal #25</title>
</head>
<body>
$:content
</body>
</html>
场景信息显示页面 show_room.html
$def with (room)
<h1>$room.name</h1>
<pre>
$room.description
</pre>
$if room.name=="death":
<p><a href="/">Play Again?</a></p>
$else:
<p>
<form action="/game" method="POST">
-<input type="text" name="action">
<input type="SUBMIT">
</form>
</p>
场景为None失败,提示界面 you_died.html
<h1>You Died!</h1>
<p>Looks like you bit the dust</p>
<p><a href="/">Play Again</a></p>
5.运行:python app.py
6.结果:
python--笨方法学python 习题52的更多相关文章
- "笨方法学python"
<笨方法学python>.感觉里面的方法还可以.新手可以看看... 本书可以:教会你编程新手三种最重要的技能:读和写.注重细节.发现不同.
- 笨方法学python 22,前期知识点总结
对笨方法学python,前22讲自己的模糊的单词.函数进行梳理总结如下: 单词.函数 含义 print() 打印内容到屏幕 IDLE 是一个纯Python下自带的简洁的集成开发环境 variable ...
- [笨方法学python]习题51自动化测试笔记
习题51 本节自动化测试部分看不大懂,自己每步都打印出来,帮助理解.(代码标红部分为自己加入调试为打印变量值所用) tests/tools.py from nose.tools import * im ...
- 《笨方法学Python》加分题28
#!usr/bin/python # -*-coding:utf-8-*- True and True print ("True") False and True print (& ...
- 《笨方法学Python》加分题16
基础部分 # 载入 sys.argv 模块,以获取脚本运行参数. from sys import argv # 将 argv 解包,并将脚本名赋值给变量 script :将参数赋值给变量 filena ...
- LPTHW 笨方法学python 19章
本章节,我只是把所有的输出加上了自己的注释. #!/usr/bin/env python # -*- coding:utf-8 -*- def cheese_and_crakers(cheese_co ...
- 笨方法学python 33课
今天Eiffel看到了第33章,任务是把一个while循环改成一个函数. 我在把while循环改成函数上很顺利,但是不知道怎么写python的主函数,在参数的调用上也出现了问题. 通过查资料,发现py ...
- 《笨方法学Python》加分题32
注意一下 range 的用法.查一下 range 函数并理解它在第 22 行(我的答案),你可以直接将 elements 赋值为 range(0, 6) ,而无需使用 for 循环?在 python ...
- 《笨方法学Python》加分题33
while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...
- 《笨方法学Python》加分题20
加分练习通读脚本,在每一行之前加注解,以理解脚本里发生的事情.每次 print_a_line 运行时,你都传递了一个叫 current_line 的变量,在每次调用时,打印出 current_line ...
随机推荐
- 初始建库SGA该设多大、PGA该设多大的建议
1.背景情况 非常多新业务系统上线,大部分DBA也不懂业务.就闷着头建库,SGA值设多大,PGA设多大,随便指定一个值就得了,执行一段时间后,或许就由于这个值是随便指定的.比如SGA+PGA大于总物理 ...
- Kafka流处理平台
1. Kafka简介 Kafka是最初由Linkedin公司开发,是一个分布式.支持分区的(partition).多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性 ...
- Rot13加密算法
Rot13是一种非常简单的替换加密算法,只能加密26个英语字母.方法是:把每个字母用其后第13个字母代替. 因为有26个字母,取其一半13. s = "xrlvf23xfqwsxsqf&qu ...
- 入门程序,hello world
RabbitMQ是消息代理.从本质上说,它接受来自生产者的信息,并将它们传递给消费者.在两者之间,它可以根据你给它的路由,缓冲规则进行传递消息. 一.专业术语 1. 生产者: 在现实生活中就好比制造商 ...
- magento登陆
magento判断用户登录 Magento 登陆之后返回登录之前的页面 magento 在登陆后一般会自动跳转到 My Account 页面 但是经常会有需求 就是登陆自动跳转到 之前的页面里面 工具 ...
- 【MyBatis】MyBatis之别名typeAliases标签的使用
<configuration> <typeAliases> <typeAlias alias="Dept" type="cn.xdl.ent ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- 安卓7.0遇到 android.os.FileUriExposedException: file:///storage/emulated.. exposed beyond app through Intent.getData()
1.在AndroidManifest.xml中添加如下代码 <?xml version="1.0" encoding="utf-8"?> <m ...
- 由苹果的低级Bug想到的
2014年2月22日,在这个“这么二”的日子里,苹果公司推送了 iOS 7.0.6(版本号11B651)修复了 SSL 连接验证的一个 bug.官方网页在这里:http://support.apple ...
- sqlserver使用存储过程发送http请求
本文主要向大家介绍了SQLServer数据库访问发送Http请求,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. -- 通用读取获取数据存储过程 --开启Sql Serve ...