笨方法学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的更多相关文章

  1. "笨方法学python"

    <笨方法学python>.感觉里面的方法还可以.新手可以看看... 本书可以:教会你编程新手三种最重要的技能:读和写.注重细节.发现不同.

  2. 笨方法学python 22,前期知识点总结

    对笨方法学python,前22讲自己的模糊的单词.函数进行梳理总结如下: 单词.函数 含义 print() 打印内容到屏幕 IDLE 是一个纯Python下自带的简洁的集成开发环境 variable ...

  3. [笨方法学python]习题51自动化测试笔记

    习题51 本节自动化测试部分看不大懂,自己每步都打印出来,帮助理解.(代码标红部分为自己加入调试为打印变量值所用) tests/tools.py from nose.tools import * im ...

  4. 《笨方法学Python》加分题28

    #!usr/bin/python # -*-coding:utf-8-*- True and True print ("True") False and True print (& ...

  5. 《笨方法学Python》加分题16

    基础部分 # 载入 sys.argv 模块,以获取脚本运行参数. from sys import argv # 将 argv 解包,并将脚本名赋值给变量 script :将参数赋值给变量 filena ...

  6. LPTHW 笨方法学python 19章

    本章节,我只是把所有的输出加上了自己的注释. #!/usr/bin/env python # -*- coding:utf-8 -*- def cheese_and_crakers(cheese_co ...

  7. 笨方法学python 33课

    今天Eiffel看到了第33章,任务是把一个while循环改成一个函数. 我在把while循环改成函数上很顺利,但是不知道怎么写python的主函数,在参数的调用上也出现了问题. 通过查资料,发现py ...

  8. 《笨方法学Python》加分题32

    注意一下 range 的用法.查一下 range 函数并理解它在第 22 行(我的答案),你可以直接将 elements 赋值为 range(0, 6) ,而无需使用 for 循环?在 python ...

  9. 《笨方法学Python》加分题33

    while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...

  10. 《笨方法学Python》加分题20

    加分练习通读脚本,在每一行之前加注解,以理解脚本里发生的事情.每次 print_a_line 运行时,你都传递了一个叫 current_line 的变量,在每次调用时,打印出 current_line ...

随机推荐

  1. TabLayout基本属性全解

    代码地址如下:http://www.demodashi.com/demo/14659.html 前言 之前讲过一篇TabLayout实现顶部导航的文章,这篇文章,来详细介绍下TabLayout的一些基 ...

  2. JS正则替换掉小括号及内容

    正則表達式:\ ( [ ^ \ ) ] * \ ) JS代码: var str="hello(world)"; var nstr = str.replace(/\([^\)]*\) ...

  3. HTML5 Audio标签方法和函数API介绍

    问说网 > 文章教程 > 网页制作 > HTML5 Audio标签方法和函数API介绍 Audio APIHTML5HTML5 Audio预加载 HTML5 Audio标签方法和函数 ...

  4. ios中uiview 转场动画

    //转场动画1--头尾 -(void)TransitionAnimation1{ [UIView beginAnimations:nil context:nil]; [UIView setAnimat ...

  5. iOS设置圆角的四种方法

    小小圆角问题,正常情况下,我们不需要过多关心,但当屏幕内比较多的时候,还是有必要了解下性能问题的 一.设置CALayer的cornerRadius 这是最常用的,也是最简单的. cornerRadiu ...

  6. 我的第一个Raspberry PI装置

    好吧,我先承认是这是从书上学习的第一个示例. 我入手的是Raspberry红版,版本2,看到这么小巧的卡片电脑可以做这么多事情,真是让人惊喜! 安装系统等都很顺利,启动.安装程序.远程桌面.SSH登录 ...

  7. JavaScript Cookies,创建,获取cookies value

    什么是cookie? cookie 是存储于访问者的计算机中的变量.每当同一台计算机通过浏览器请求某个页面时,就会发送这个 cookie.你可以使用 JavaScript 来创建和取回 cookie ...

  8. 浅析iOS中的触摸事件

    一.什么是响应者对象? 在 iOS中不是任何对象都能处理事件,只有继承了UIResponder的对象才能接收并处理事件.我们称之为“响应者对象”.UIApplication.UIViewControl ...

  9. 修改的select

    慢慢修改: #include <winsock.h> #include <stdio.h> #include <string> #define PORT 5010 ...

  10. inotify-tools命令使用讲解

    inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件. inotify-tools是用 ...