当前课程知识点:Python 交互式程序设计导论 > 第7周 > 本周项目:决战三字经 > 编程步骤
返回《Python 交互式程序设计导论》慕课在线视频课程列表
第一步,首先编写read_from_file(filename)函数,参数filename为《三字经》文本文件的URL(Uniform Resource Locator,统一资源定位符,是对互联网资源的位置和访问方法的一种简洁表示),我们已经为你准备了该文件,下载:三字经。你应当观察一下该文件的内容和格式,请使用urllib.request.urlopen()方法打开该文件,逐行处理(readlines()可以逐行读入文件,假设读入的内容保存在变量line中,可以用str(line.decode("utf8")).split()将一行分解为句子列表),每三个汉字为一个元素存入列表,处理完所有行之后,关闭文件,函数应当返回一个列表,可以用以下调用测试该函数是否满足要求:
print(read_from_file ('http://vquiz.xjau.edu.cn/ProjectResource/other/szj.txt ')[0])
输出应当为:人之初
print(read_from_file (' http://vquiz.xjau.edu.cn/ProjectResource/other/szj.txt ')[491])
输出应当为:宜勉力
text_list = read_from_file (' http://vquiz.xjau.edu.cn/ProjectResource/other/szj.txt')
for text in text_list:
print(text)
输出应当为492句诗文,1行1句
第二步,编写text_shuffle(text)函数,该函数以字符串text为参数,功能为返回以次序随机的新字符串,当然新字符串中的字符或汉字必须与text参数相同,可以用以下调用测试该函数是否满足要求:
print(text_shuffle ('人之初'))
输出可能为:人之初、人初之、之初人、之人初、初之人、初人之
第三步,编写generate_current_section_list()函数,每次调用该函数时将从prime_sentence_list列表中取出4句诗词文本并把它们添加到一个新的列表中,同时将这4句诗词文本从prime_sentence_list列表中删除。为了实现一段诗歌中的4句诗词随机从画布底部飞出,我们要用random.shuffle函数对新产生的列表进行混洗处理,请在每句诗词前面加上表示其正确位置的数字代码(0、1、2、3),函数应当返回一个包含4个元素的列表。请用以下调用测试该函数是否满足要求:
prime_sentence_list = read_from_file(' http://vquiz.xjau.edu.cn/ProjectResource/other/szj.txt ')
print(generate_current_section_list())
print(generate_current_section_list())
print(generate_current_section_list())
输出可能为:
['2性相近', '3习相远', '1性本善', '0人之初']
['3贵以专', '2教之道', '1性乃迁', '0苟不教']
['2子不学', '1择邻处', '0昔孟母', '3断机杼']
请注意0、1、2或3代表一句诗文在一段中的正确位置。每调用一次该函数,诗文下移一段,一段中四句的位置随机变化。
第四步,完善Box类,该类是三字一句文字块的抽象,我们已经提供了该类的属性(私有变量)及其访问方法(getter、setter),你的任务为:
1、完善shuffle_sentence (self)方法,该方法实现文字的混洗功能,可以调用text_shuffle。
2、完善collide(self,moving_object)方法,该方法实现检查该文字块是否和上升的文字块发生碰撞。如果发生碰撞返回True,否则返回False。
3、完善draw(self, canvas) 方法,该方法实现在画布中绘制(显示)文字块的功能,canvas.draw_polygon方法可以会矩形,canvas.draw_text方法可以绘制文本。请注意用不同颜色组合来提示玩家块内文字次序是否正确,也要用颜色区别块间次序是否正确。
4、完善update(self) 方法,利用rising_speed变量对正在上升的文字块显示的位置(self.pos[1])进行更新。
请用以下调用测试Box类是否满足要求:
test_box = Box([120,100], box_width, box_height, '人之初', '之人初', 0)
print(test_box.get_pos())
print(test_box.get_sentence())
print(test_box.get_correct_sentence())
print(test_box.get_order())
print(test_box.get_processed())
test_box.shuffle_sentence()
print(test_box.get_sentence())
输出应当为:
[120, 100]
人之初
之人初
0
False
之初人
第五步,编写draw_all_stopped_box(stopped_box,canvas)函数,stopped_box参数为保存所有已经停止的文字块的集合,请用for循环遍历每个元素,调用它的draw方法完成绘制功能。
第六步,编写check_collision(group, moving_box)函数,group代表所有已经停止的文字块,而moving_box代表正在上升的文字块,请用for循环遍历group集合每个元素, 调用它的collide方法检测是否和moving_box发生碰撞,只要有一个元素和moving_box发生碰撞就返回True,否则返回False。
第七步,完善stop_box(group, moving_box)函数,该函数是游戏逻辑实现的重要函数。
如果moving_box到达顶部或与其它停止的文字块发生碰撞,首先将moving_box的rising属性设置为False,将has_rising_box全局变量设置为False。
检查文字顺序,如果正确,游戏得分增加5分。
将该文字块添加到代表静止块的stopped_box集合中。
如果是四句中的最后一句,检查一行四句的位置,如果正确,游戏得分增加20分,并且从stopped_box删除最后4个文字块完成一行的消解。
如果该块停止使得停止的行数超过10行,设置game_over为True。
第八步,编写draw_game_over_msg(canvas, msg)函数,游戏结束时会调用该函数,在画布的正中间用红色48号字体显示msg代表的信息。
第九步,编写box_spawner()函数,调用该函数会创建一个上升的文字块,请注意事件处理函数注册部分我们有timer = simplegui.create_timer(1000.0, box_spawner)语句,这表明游戏程序每1秒会调用box_spawner()函数1次。
任何时候游戏界面中最多只有一个上升的文字块,因此首先要判断全局变量has_rising_box值,如果为True,表明游戏中有一个正在上升的文字块,因此该函数无需再做什么,否则:
若current_section_list空,调用generate_current_section_list()为其赋值,从current_section_list弹出一个,计算随机位置,调用Box类的构造方法创建一个新的文字块并赋值到全局变量rising_box,最后别忘了正确设置has_rising_box的值。
第十步,编写draw(canvas) 函数,该函数负责屏幕刷新,如果game_over为True,请用draw_game_over_msg函数显示游戏结束画面,否则:
依次调用rising_box的draw方法和update方法实现对上升文字块绘制和位置更新。
然后调用draw_all_stopped_box绘制所有的静止文字块。
最后调用stop_box对发生接触或到达顶部的上升文字块进行处理并更新游戏得分。
第十一步,编写keydown(key)函数,当玩家按下左箭头键时,rising_box的位置左移一个文字块距离,当玩家按下右箭头键时,rising_box的位置右移一个文字块距离,当玩家按下空格键时,rising_box的文字次序随机变换一次。
第十二步,完善start_game()函数,为游戏开始或重新开始初始化全局变量。
一切都搞定后,提交项目之前请注释掉你添加的所有测试代码,保存并运行确认后再提交你的代码。
-课程简介
--课程简介
-A 课程视频(算数操作符及表达式)
--绪论
-B 课程视频(变量及赋值)
--变量
--项目提交
-C 辅助视频(计算机结构、Python开发环境安装)
-D 辅助视频(如何提交项目)
--项目提交
-第0周--小测验
-本周项目:"我喜欢Python"
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
--项目提交
-A 课程视频(函数)
--函数
--其它操作符
--随机函数
-B 课程视频(逻辑及表达式)
--逻辑值和比较
--条件
--编程技巧
-第1周--小测验
-本周项目:“老虎杠子鸡虫”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(Python交互式应用)
--事件驱动编程
--按钮
-B 课程视频(输入框、全局变量)
--输入框
--编程技巧
-第2周--小测验A
-第2周--小测验B
-本周项目:猫咪藏在哪个房间
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(画布绘图)
--画布和图形绘制
--字符串处理
--图片和音效
-B 课程视频(计时器)
--计时器
--交互式绘图
--“神奇时钟”游戏
--编程技巧
-第3周--小测验A
-第3周--小测验B
-本周项目:“神奇时钟”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(列表)
--列表
--键盘输入
--碰撞和反射
-B 课程视频(键盘控制)
--速度控制
--运动
--编程技巧
--“桌上冰球”游戏
-第4周--小测验A
-第4周--小测验B
-本周项目:“桌上冰球”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(鼠标输入、列表进阶)
--鼠标输入
--Video
--Video
--Video
-B 课程视频(字典和图片)
--Video
--Video
--Video
--Video
-第5周--小测验A
-第5周--小测验B
-本周项目:“世界杯八强连连看”
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类)
--华容道中的类
-B 课程视频(平铺图片)
--平铺图片
--理解对象
--编程技巧
--“华容道”游戏
-第6周--小测验A
-第6周--小测验B
-本周项目:“华容道”游戏
--游戏说明
--程序说明
--编码步骤
--评分标准
--项目模板
-A 课程视频(类进阶及文件操作)
--集合
--文件操作
--文字块类
--处理停止的文字块
-B 课程视频(游戏状态控制)
--游戏记分规则
--编程技巧
-第7周--小测验A
-第7周--小测验B
-本周项目:决战三字经
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板
-A、课程视屏(精灵集合)
--Video
--精灵类
--战士类
--编程技巧
-B、课程视屏(动画)
--精灵碰撞
--精灵动画
--编程技巧
--保卫家园游戏
-第8周--小测验
-本周项目:守卫家园
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板