程序员如何使用Python编程来创建网页游戏。完成此案例即可轻松上手。
分类:网校动态日期:2024-09-04 09:08:17人气:
今天我将教大家如何使用Python编程语言创建网页游戏。如果你能完成它,你就可以算是一个具有相当能力的Python初学者了。虽然还需要多看书、多写程序,但你已经具备了进一步学习的基础。接下来的学习只是时间、动力和资源的问题。
在本练习中,我们不会创建完整的游戏。相反,我们将为练习42 中的游戏创建一个“引擎”,以便游戏可以在浏览器中运行。这将涉及重构练习42 中的游戏,混合练习47 中的结构,添加自动化测试代码,最后创建一个可以运行游戏的Web 引擎。
这是一个巨大的练习。预计需要一周到一个月的时间才能完成。最好的方法是一点一点地做,每晚完成一点,并确保上一步已正确完成,然后再进行下一步。
重构习题43中的游戏
您已在两个练习中修改了Gothonweb 项目,您将在本练习中再次修改它。您学习的修改技术称为“重构”,或者我喜欢称之为“修复”。重构是一个编程术语,指清理旧代码或向旧代码添加新功能的过程。您以前实际上做过类似的事情,只是不知道术语。重构是软件开发中最常见的事情。
在本练习中,您将要做的是将练习47 中的可测试房间地图和练习43 中的游戏结合起来,创建一个新的游戏结构。游戏的内容不会改变,但我们会“重构”它,使其拥有更好的结构。
注意
从现在开始,我将不会显示运行测试的输出,我假设您将返回并运行这些测试并知道哪些输出是正确的。
首先要做的是使用Room 类构建地图的基本结构。
1. 我们必须将房间描述预先放置在每个房间的if-else 结构部分中。这样房间的顺序就不会被打乱,这对我们的游戏来说是一件好事。这是您稍后将修改的内容。
2.在原版游戏中,我们使用了特殊的代码来生成一些内容,比如炸弹激活键码、船舱选择等,这次我们在制作游戏时会使用默认值,但在后面的附加练习中,我会要求你将这些功能添加到游戏中。
3我为游戏中所有错误决策的失败结局写了一个generic_death,你需要完成这个功能。您需要添加原始游戏的所有结局并确保代码正确运行。
4.我添加了一种新的转换模式,用“*”标记,以在游戏引擎中实现“捕获所有操作”功能。
上面的代码基本写完了,接下来就是必须继续写的自动测试tests/map_test.py了。
地图测试.py
1 from noose.tools import *2 from gothonweb.map import *3 4 def test_room():5 gold=Room('GoldRoom', 6 '''这个房间里有金子,你可以抢。北边有a7门。 ''')8 assert_equal(gold.name, 'GoldRoom')9 assert_equal(gold.paths, {})10 11 def test_room_paths():12 center=Room('Center', '测试室位于中心。')13 North=Room('North', '北边的测试室。')14 South=Room('South', '南边的测试室。')15 16 center.add_paths({'north': North, '南边': 南})17 assert_equal(center.go('北'), 北)18 assert_equal(center.go('南'), 南)19 20 def test_map():21 start=Room('开始', '你可以向西走,进入一个洞。')22 west=Room('Trees', '这里有树,你可以向东走。')23 down=Room('Dungeon', '这里很黑,你可以走向上。')24 25 start.add_paths({'west': west, 'down': down})26 west.add_paths({'east': start})27 down.add_paths({'up': start}) 28 29assert_equal(start.go('west'), west)30assert_equal(start.go('west').go('east'),start)31assert_equal(start.go('down').go( '向上'),开始)32 33 def test_gothon_game_map():34 assert_equal(START.go('射击!'),generic_death)35 assert_equal(START.go('闪避!'),generic_death)36 37 room=START.go ('讲一个笑话')38 assert_equal(room, Laser_weapon_armory) 您在本练习中的任务是完成地图并允许自动化测试全面检查整个地图。这包括将所有generic_death 对象修复为游戏中实际失败的结局。让您的代码成功运行并使您的测试尽可能全面。稍后我们将对地图进行一些修改,这些测试将用于确保修改后的代码仍然可以正常工作。
会话和用户跟踪
在运行的Web 应用程序中的某个位置,您需要跟踪一些信息并将其与用户的浏览器关联起来。在HTTP协议的框架中,Web环境是“无状态的”,这意味着你的每个请求都是独立于其他请求的。如果您请求页面A,输入一些数据,然后单击页面B 的链接,则您发送到页面A 的所有数据都将消失。
此问题的解决方案是为Web 应用程序设置一个小型数据存储,并为每个浏览器进程提供一个唯一的编号,以跟踪浏览器正在执行的操作。这种存储通常使用数据库或存储在磁盘上的文件来实现。在lpthw.web这个小框架中实现这样的功能是非常容易的。这是一个例子。
会话.sample.py
1 导入web2 3 web.config.debug=False4 5 urls=(6 '/count', 'count',7 '/reset', 'reset'8 )9 app=web.application(urls, locals())10 store=web.session.DiskStore('sessions')11 session=web.session.Session(app, store, 初始化=['count': 0])12 13 类count:14 def GET(self):15 session.count +=116 return str(session.count)17 18 class reset:19 def GET(self):20 session.kill()21 return ''22 23 if __name__=='__main__':24 app.run()为了实现这个功能,你需要创建一个sessions/文件夹作为程序的session存储位置。创建完成后,运行该程序,然后检查/count 页面并刷新该页面以查看计数是否累加。关闭浏览器后,程序会“忘记”之前的位置,这正是我们游戏所需要的。有一种方法可以让浏览器永远记住一些信息,但这使得测试和开发变得更加困难。如果您返回到/reset 页面,然后访问/count 页面,您可以看到您的计数器已重置,因为您已经关闭了会话。
您需要花一些时间来理解这段代码。请注意会话启动时计数值如何设置为0。另外查看sessions/下的文件是否可以打开。以下是我打开Python 会话并解码的方法:
导入pickle导入base64 base64.b64decode(open('sessions/XXXXX').read())'(dp1\nS'count'\np2\nI1\nsS'ip'\np3\nV127.0.0.1\np4\nsS 'session_id'\np5\nS'XXXX'\np6\ns.' x=base64.b64decode(open('sessions/XXXXX').read()) pickle.loads(x){'count': 1, 'ip ': u'127.0.0.1', 'session_id': 'XXXXX'}所以,会话实际上是使用pickle和base64等库写入磁盘的字典,存储和管理会话的方法有很多种,大概有多种。 Python的web框架有很多,所以了解它们的工作原理并不是很重要,当然,如果你需要调试或清除会话,了解一点还是有用的。
创建引擎
您应该已经编写了游戏地图及其单元测试代码。现在,您被要求制作一个简单的游戏引擎来运行游戏中的各个房间,收集玩家的输入并记住玩家的位置。我们将使用您刚刚学到的对话来制作一个简单的引擎:
1、针对新用户推出新游戏;
2.向用户展示房间;
3接收用户输入;
4.处理游戏中的用户输入;
5. 显示游戏结果并继续游戏直至玩家角色死亡。
为了创建这个引擎,您需要移动bin/app.py 并创建一个功能齐全的基于会话的游戏引擎。这里最困难的部分是,我将首先使用基本HTML 文件创建一个非常简单的版本,然后由您来完成它。基本引擎如下所示:
应用程序.py
1 import web2 from gothonweb import map3 4 urls=(5 '/game', 'GameEngine',6 '/', 'Index',7 )8 9 app=web.application(urls, globals())10 11 # 小如果web.config.get('_session') 为None:13 store=web.session.DiskStore('sessions')14 session=web.session.Session(app, store,15initializer=[ '房间': 无])16 web.config._session=session17 else:18 session=web.config._session19 20 render=web.template.render('templates/', base='layout')21 22 23 class Index(object ):24 def GET(self):25 # 用于以起始值“设置”会话26 session.room=map.START27 web.seeother('/game')28 29 30 class GameEngine(object):31 32 def GET( self):33 if session.room:34 return render.show_room(room=session.room)35 else:36 # 为什么在这里?你需要它吗?37 return render.you_died()38 39 def POST(self):40 form=web. input(action=None)41 42 # 这里有一个错误,你能修复它吗?43 if session.room and form.action:44 session.room=session.room.go(form.action)45 46 web.seeother(' /game')47 48 if __name__=='__main__':49 app.run() 你可以在这个脚本中看到更多新东西,但很棒的是整个基于网页的游戏引擎只需要一个小文件。这是可以做到的。该脚本中最具技术性的部分是恢复会话的行。这对于在调试模式下重新加载代码是必需的。否则,每次刷新网页时,会话就会消失,游戏将无法继续。
在运行bin/app.py 之前,需要修改PYTHONPATH 环境变量。不知道什么是环境变量?要运行一个基本的Python程序,你必须学习环境变量。使用Python的人是这样的:
在终端中输入以下内容:
导出PYTHONPATH=$PYTHONPATH:如果您使用的是Windows,请在PowerShell 中输入以下内容:
$env:PYTHONPATH='$env:PYTHONPATH;'你只需要为每个shell 会话输入一次,但是如果你在运行Python 代码时看到导入错误,你需要执行上面的命令,或者因为你上次执行错误导致了导入错误。
接下来,您需要删除templates/hello_form.html 和templates/index.html,然后重新创建上面代码中提到的两个模板。下面是一个非常简单的templates/show_room.html 供您参考。
show_room.html
$def with (room)h1 $room.name /h1pre$room.description/pre$if room.name=='death': pa href='/'再玩一次?/a/p$else: p form action=' /game' method='POST' - input type='text' name='action' input type='SUBMIT' /form /p这个用于显示游戏中房间的模板。接下来,需要使用一个模板,当用户跑到地图边缘时告诉用户其角色的死亡信息,即templates/you_died.html 模板。
你_死了.html
h1你死了!/h1p看起来你已经死了。/ppa href='/'再玩一次/a/p准备好这些文件后,你可以做以下事情。
1. 再次运行测试代码tests/app_tests.py,即可测试游戏。由于会话的存在,您可能无法实现多次点击,但您应该能够进行一些基本测试。
2、删除sessions/*下的文件,再次运行游戏,确认游戏从头开始运行。
3运行python bin/app.py 脚本来尝试您的游戏。
您需要像往常一样刷新和修改游戏,慢慢修改游戏的HTML 文件和引擎,直到实现游戏所需的所有功能。
期末考试
有没有感觉我一下子给了你很多信息?是的,我希望你在学习技能的同时能有一些可以修改的东西。为了完成这个练习,我将为您提供最后一组练习,您需要自己完成。你会发现你到目前为止写的游戏并不是很好。这只是您的代码的第一个版本。你当前的任务是让游戏更加完善,实现以下功能。
1.修复代码中我提到的和没有提到的所有bug。如果您发现新的错误,可以告诉我。
2. 改进所有自动化测试以测试更多内容,直到无需浏览器即可测试所有内容。
3使HTML页面看起来更加美观。
4. 研究网页登录系统,为程序创建一个登录界面,以便人们可以登录游戏并保存游戏高分。
5. 完善游戏地图,使游戏尽可能大并具备所有功能。
6. 为用户提供一个“帮助系统”,以便他们可以查询每个房间中有哪些命令可用。
7. 向游戏添加新功能,添加您想到的任何功能。
8. 创建多张地图并允许用户选择他们想要玩的一张。您的bin/app.py 应该能够运行提供给它的任何地图,因此您的引擎可以支持多种不同的游戏。
9. 最后,使用您在练习48 和49 中学到的知识来创建更好的输入处理器。您手头上已经有了大部分必要的代码,您只需要改进语法并将其连接到您的输入表单和游戏引擎即可。
祝你好运!
常见问题回答
我在游戏中用了会话(`session)`,不能用nosetests测试。
您需要阅读并理解带有重新加载器的会话:http://webpy.org/cookbook/session_with_reloader。
我看到了ImportError。
路径错误、Python 版本错误、PYTHONPATH 设置不正确、缺少__init__.py 文件、拼写错误,全部检查。
下一篇:网页游戏的开发流程
用户评论
哇,Python居然还能用来做网页游戏?学起来好兴奋!案例完成之后应该能轻松掌握吧。
有7位网友表示赞同!
这个案例太实用了!我是新手,想学Python做游戏,不知道能不能跟着案例轻松入门。
有6位网友表示赞同!
网页游戏开发一直是我心中的梦想,这个案例让我看到了希望,希望能顺利上手。
有7位网友表示赞同!
Python真是个强大的语言,这个案例对于初学者来说是不是有点难度呢?
有16位网友表示赞同!
案例完成之后,是不是就能轻松制作出酷炫的网页游戏了?期待学习效果。
有7位网友表示赞同!
网页游戏开发一直是我的爱好,这个Python案例让我看到了新的可能,太棒了!
有15位网友表示赞同!
这个案例对于Python新手来说,是不是有点复杂?希望能有更详细的解释。
有20位网友表示赞同!
Python做网页游戏听起来就很有趣,案例完成之后,我也要试试自己动手做一款游戏。
有20位网友表示赞同!
这个案例好像没有提到如何优化游戏性能,这对于游戏开发来说很重要吧。
有13位网友表示赞同!
学Python做网页游戏是个不错的方向,案例完成之后,我打算尝试开发自己的小游戏。
有19位网友表示赞同!
这个案例对于有经验的程序员来说,可能不够挑战性。但新手来说应该挺有帮助的。
有10位网友表示赞同!
Python做网页游戏听起来很有趣,但我担心自己没有足够的美术功底,怎么办呢?
有16位网友表示赞同!
这个案例让我对Python有了新的认识,原来Python也能做网页游戏,太神奇了!
有10位网友表示赞同!
案例中的步骤是不是可以再详细一些?我是个编程小白,希望能看懂。
有20位网友表示赞同!
网页游戏开发一直是我的梦想,这个Python案例让我看到了实现的可能,太激动了!
有20位网友表示赞同!
Python做网页游戏是个很有前景的方向,案例完成之后,我要努力提升自己的技能。
有9位网友表示赞同!
这个案例让我对Python有了新的认识,原来编程也可以这么有趣,我要努力学下去。
有17位网友表示赞同!
网页游戏开发是个热门领域,这个Python案例让我看到了入行的机会,太感谢了!
有19位网友表示赞同!