当前课程知识点:Python 交互式程序设计导论 > 第8周 > 本周项目:守卫家园 > 编程步骤
返回《Python 交互式程序设计导论》慕课在线视频课程列表
我们已经为该小项目提供了一个基本模板,请仔细阅读模板提供的代码,读懂这些代码有助于你顺利完成本项目。
建议“守卫家园”游戏的编码步骤为:
1、编写计算两点距离的辅助函数distance(p,q),参数p、q为平面坐标点,该函数将用于检测两个对象是否发生碰撞。
2、编写游戏初始化辅助函数init(),在该函数中对全局变量进行初始化,应当通过Soldier类创建一个战士对象、通过Sprite类创建4个城堡对象并存储到castle_group集合中,还应当开启背景音乐。
3、完善class Soldier(战士类),该类的set_angle(self, angle)方法、get_pos(self)方法、set_shooting(self,is_shooting)方法、set_vel(self, new_vel)均非常直观。
shoot (self)方法的功能是发射弓箭,首先应当计算弓箭的初始位置坐标,然后计算弓箭的速度,接着通过Sprite类创建一个弓箭对象并将其存储到arrow_group集合中。
draw(self, canvas)将调用draw_image 并以恰当的私有属性为参数在画布绘制战士,应当根据shooting属性绘制平铺图片中的不同图像来实现射箭的动画效果。
update(self) 方法将用self.vel更新self.pos,如果战士的位置移出画布,应当在画布对面出现。
而collide(self, other)则根据self.move_direction的取值计算是否和另一个静止的棋子发生碰撞,如果发生碰撞或到达棋盘边界则返回True,否则返回False。
4、完善class Sprite(精灵类),该类的get_radius(self)方法、get_pos(self)方法均非常直观。
collide(self, other)用来计算是否和另一个对象发生碰撞,如果发生碰撞则返回True,否则返回False。
draw(self, canvas)将调用draw_image 并以恰当的私有属性为参数在画布绘制精灵,应当根据animated属性绘制平铺图片中的不同图像来实现动画效果。
update(self) 方法将用self.vel更新self.pos,同时要判断age(年龄)是否小于lifespan(寿命),如果小于则返回True,否则返回False。其它函数将更加该方法的返回值决定是否要销毁对象。
5、编写时间事件处理函数enemy_spawner()用来定期产生敌人,请注意在事件处理函数注册部分我们有timer = timer = gui.create_timer(1000, enemy_spawner)语句,这表明游戏程序每1秒会调用enemy_spawner ()函数1次,即每1秒会产生一个敌人。如果game_over和game_success的值为False,首先随机生成敌人的垂直位置,新产生敌人的水平位置总是画布的最右侧,然后随机生成敌人的水平移动速度,接着将敌人的角度设置为0(表示图片不旋转),最后通过Sprite类创建一个敌人对象并将其存储到enemy_group集合中。
6、编写辅助函数process_sprite_group(sprites,canvas)来处理一组精灵,用for循环遍历sprites的一个副本并调用每个精灵的draw方法完成对sprites集合所有精灵的绘制,根据游戏的状态(game_over、game_success)决定是否调用每个精灵的update方法更新精灵,并更加update方法方法返回的值决定是否销毁该精灵。
7、编写辅助函数enemy_escape_check()来检查越过左边界敌人,用for循环遍历enemy_group的一个副本并调用判断每个敌人是否越过左边界,如果越过,增加全局变量enemy_escaped的值以记录逃脱敌人的总数。
8、编写辅助函数group_collide(group,other_object) 检测一组对象和另一个对象是否发生碰撞,用for循环遍历group的一个副本并调用每个对象collide(other_object)方法完成对集合所有对象的检测,如果发生碰撞,通过Sprite类创建一个爆炸对象并将其存储到explosion_group集合并销毁发生碰撞的对象。
9、编写辅助函数group_group_collide(group1, group2) 来检测一组对象和另一个对象发生碰撞的情况,用for循环遍历group1的一个副本并group_collide函数完成两组对象的碰撞检测,如果发生碰撞,累计发生碰撞的次数,通过Sprite类创建一个爆炸对象并将其存储到explosion_group集合并销毁发生碰撞的对象,函数返回碰撞次数。
10、编写屏幕刷新事件处理函数(主后绘制函数)draw(canvas),该函数应进行一下操作:
(1)绘制游戏背景
(2)绘制战士
(3)更新战士
(4)批量绘制和更新所有城堡
(5)批量绘制和更新所有敌人
(6)批量绘制和更新所有箭
(7)检查逃脱的敌人
(8)检查所有敌人和所有箭的碰撞情况
(9)检查所有敌人和所有城堡的碰撞情况
(10)更新控制面板标签的显示内容
(11)判断游戏的输赢结果并绘制对应的画面
11、编写鼠标点击事件的处理函数mouse_handler(pos),如果game_over和game_success的值为False,首先计算鼠标落点和战士之间形成的角度,调用战士的set_angle方法来调整其朝向,然后将战士的shooting属性设置为True,最后调用战士的shoot()方法来发射一枚弓箭。
12、编写按键事件处理函数key_down(key),使得玩家按w、a、s、d键时战士可以向上、左、下、右移动。
13、编写键盘事件处理函数key_up(key),使得玩家释放w、a、s、d中的某个按键时战士停止移动。
-课程简介
--课程简介
-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周--小测验
-本周项目:守卫家园
--游戏说明
--程序说明
--编程步骤
--评分标准
--项目模板