前言

这一期我们会带大家进一步复现我们的魔塔小游戏,主要内容为进一步完成和其他更为复杂的地图元素接触时可以触发的事件。

废话不多说,让我们愉快地开始吧~

开发工具

Python版本: 3.7.4

相关模块:

pygame模块;

以及一些python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

原理简介

上一期,我们实现了一些简单的勇士和地图元素接触时会触发的事件,就像下图这样:

显然,这个效果图是不完美的,比如左侧面板的时间显示和当前层的显示没有添加,这里我们可以先写几行代码添加一下:

# --左侧面板栏
font = pygame.font.Font(self.cfg.FONTPATH_CN, 20)
font_renders = [self.hero.font.render(str(self.map_level_pointer), True, (255, 255, 255)),font.render('游戏时间: ' + str(pygame.time.get_ticks() // 60000) + ' 分 ' + str(pygame.time.get_ticks() // 1000 % 60) + ' 秒', True, (255, 255, 255)),
]
rects = [fr.get_rect() for fr in font_renders]
rects[0].topleft = (150, 530)
rects[1].topleft = (75, 630)
for fr, rect in zip(font_renders, rects):screen.blit(fr, rect)

添加了这部分代码之后的效果是这样子的:

接着,就是上一期我们说的,在原版的游戏中,勇士和这个仙女碰撞的时候,会出现对话框,类似这样:

这部分内容该如何实现呢?首先,可以肯定的是对话框是由四个部分组成的,即矩形、矩形内填充的底色、左上角的人物图标以及文字内容。他们的实现思路分别应该是:

矩形: 调用pygame画矩形的函数pygame.draw.rect;
底色填充: 导入背景图中黑色的地砖来填充对话框;
左上角人物图标: pygame.image.load导入后画到对应的位置即可;
文字: 主要调用pygame.font.Font实现.最后,如果你的时间不是很紧张,并且又想快速的提高,最重要的是不怕吃苦,建议你可以联系维:762459510 ,那个真的很不错,很多人进步都很快,需要你不怕吃苦哦!大家可以去添加上看一下~

具体而言,我们的代码实现如下:

'''仙女和勇士对话'''
def showconversationheroandfairy(self, screen, scenes):# 对话框指针conversation_pointer = 0# 定义所有对话conversations = [['......'], ['你醒了!'], ['......', '你是谁? 我在哪里?'],['我是这里的仙子, 刚才你被这里的', '小怪打晕了.'],['......', '剑, 剑, 我的剑呢?'],['你的剑被他们抢走了, 我只来得及', '将你救出来.'],['那, 公主呢? 我是来救公主的.'],['公主还在里面, 你这样进去是打不', '过里面的小怪的.'],['那我怎么办, 我答应了国王一定要', '把公主救出来的,那我现在应该怎', '么办呢?'],['放心吧, 我把我的力量借给你, 你', '就可以打赢那些小怪了. 不过, 你', '得先去帮我去找一样东西,找到', '了再来这里找我.'],['找东西? 找什么东西?'],['是一个十字架, 中间有一颗红色的', '宝石.'],['那个东西有什么用吗?'],['我本是这座塔守护者, 可不久前, ', '从北方来了一批恶魔, 他们占领了', '这座塔,并将我的魔力封在了这', '个十字架里面, 如果你能将它带出', '塔来, 那我的魔力便会慢慢地恢复, ', '到那时我便可以把力量借给你去', '救公主了. 要记住, 只有用我的魔力', '才可以打开二十一层的门.'],['......', '好吧,我试试看'],['刚才我去看过了, 你的剑被放在三', '楼, 你的盾在五楼上, 而那个十字', '架被放在七楼. 要到七楼, 你得', '先取回你的剑和盾. 另外在塔里的', '其他楼层上, 还有一些存放了好几百', '年的宝剑和宝物,如果得到它们,', '对于你对付这里面的怪物将有很大', '的帮助.'],['可是, 我怎么进去呢?'],['我这里有三把钥匙, 你先拿去, 在', '塔里面还有很多这样的钥匙, 你一', '定要珍惜使用. 勇敢的去吧,勇士!']]# 主循环clock = pygame.time.Clock()while True:screen.fill((0, 0, 0))screen.blit(self.background_images['gamebg'], (0, 0))self.map_parser.draw(screen)for scene in scenes:screen.blit(scene[0], scene[1])self.hero.draw(screen)# --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE:conversation_pointer += 1if conversation_pointer >= len(conversations): return# --画对话框conversation = conversations[conversation_pointer]font = pygame.font.Font(self.cfg.FONTPATH_CN, 20)# ----勇士if conversation_pointer % 2 == 0:left, top, width, height = 510, 430, 7, 2pygame.draw.rect(screen, (199, 97, 20), (left - 4, top - 4, self.cfg.BLOCKSIZE * width + 8, self.cfg.BLOCKSIZE * height + 8), 7)id_image = self.hero.images['down']# ----仙子else:left, top, width, height = 300, 250, 7, 2if len(conversation) > 3: height = 3if len(conversation) > 5: height = 4if len(conversation) > 7: height = 5pygame.draw.rect(screen, (199, 97, 20), (left - 4, top - 4, self.cfg.BLOCKSIZE * width + 8, self.cfg.BLOCKSIZE * height + 8), 7)id_image = pygame.image.load(self.cfg.MAPELEMENTSPATHS['24'][0])# ----底色filepath = self.cfg.MAPELEMENTSPATHS['0'][0]for col in range(width):for row in range(height):image = pygame.image.load(filepath)image = pygame.transform.scale(image, (self.cfg.BLOCKSIZE, self.cfg.BLOCKSIZE))screen.blit(image, (left + col * self.cfg.BLOCKSIZE, top + row * self.cfg.BLOCKSIZE))# ----左上角图标screen.blit(id_image, (left + 10, top + 10))# ----对话框中的文字for idx, text in enumerate(conversation):font_render = font.render(text, True, (255, 255, 255))rect = font_render.get_rect()rect.left, rect.top = left + self.cfg.BLOCKSIZE + 20, top + 10 + idx * 30screen.blit(font_render, rect)# --刷新pygame.display.flip()clock.tick(self.cfg.FPS)

具体的效果图如下:

接下来,我们需要实现的就是和怪物战斗的场景啦。按照原版游戏的设定,当勇士接触到地图上的怪物时,如果勇士可以击败该怪物,则自动触发战斗模式:

要实现这个功能,我们需要先定义地图上所有怪物的生命值,攻击力和防御力数值。具体而言,代码定义如下:

# 地图上所有怪物的属性: 名字, 生命值, 攻击力, 防御力
self.monsters_dict = {'40': ('绿头怪', 50, 20, 1),'41': ('红头怪', 70, 15, 2),'42': ('小蝙蝠', 100, 20, 5),'43': ('青头怪', 200, 35, 10),'44': ('骷髅人', 110, 25, 5),'45': ('骷髅士兵', 150, 40, 20),'46': ('兽面人', 300, 75, 45),'47': ('初级卫兵', 450, 150, 90),'48': ('大蝙蝠', 150, 65, 30),'49': ('红蝙蝠', 550, 160, 90),'50': ('白衣武士', 1300, 300, 150),'51': ('怪王', 700, 250, 125),'52': ('红衣法师', 500, 400, 260),'53': ('红衣魔王', 15000, 1000, 1000),'54': ('金甲卫士', 850, 350, 200),'55': ('金甲队长', 900, 750, 650),'56': ('骷髅队长', 400, 90, 50),'57': ('灵法师', 1500, 830, 730),'58': ('灵武士', 1200, 980, 900),'59': ('冥灵魔王', 30000, 1700, 1500),'60': ('麻衣法师', 250, 120, 70),'61': ('冥战士', 2000, 680, 590),'62': ('冥队长', 2500, 900, 850),'63': ('初级法师', 125, 50, 25),'64': ('高级法师', 100, 200, 110),'65': ('石头怪人', 500, 115, 65),'66': ('兽面战士', 900, 450, 330),'67': ('双手剑士', 1200, 620, 520),'68': ('冥卫兵', 1250, 500, 400),'69': ('高级卫兵', 1500, 560, 460),'70': ('影子战士', 3100, 1150, 1050),'188': ('血影', 99999, 5000, 4000),'198': ('魔龙', 99999, 9999, 5000),
}

其中,字典的键值和第一期童年经典回忆 | 从零开始带大家撸一个魔塔小游戏呀(1)中定义地图的地图文件里的数字对应的地图元素的含义是一致的。接下来,为了实现和原版一样的功能,我们需要写个函数判断一下勇士当前的状态是否可以击败怪物:

'''判断勇士是否可以打赢怪物'''
def winmonster(self, monster):# 如果攻击力低于怪物防御力, monster: [名字, 生命值, 攻击力, 防御力]if self.attack_power <= monster[3]: return False# 如果防御力高于怪物攻击力if self.defense_power >= monster[2]: return True# 我方打怪物一次扣多少血diff_our = self.attack_power - monster[3]# 怪物打我方一次扣多少血diff_monster = monster[2] - self.defense_power# 计算谁可以winif round(monster[1] / diff_our) <= round(self.life_value / diff_monster):return Truereturn False

如果可以,则触发战斗场景。具体而言,我们已经做好了战斗的基础面板,每次只需要把对应的怪物、勇士以及他们各自的状态画上去即可,原理类似下图:

主要的代码实现如下:

'''战斗画面'''
def battle(self, monster, monster_image, map_parser, screen):monster = list(monster).copy()# 我方打怪物一次扣多少血diff_our = self.attack_power - monster[3]# 怪物打我方一次扣多少血diff_monster = monster[2] - self.defense_power# 更新战斗面板的频率update_count, update_interval, update_hero = 0, 10, False# 主循环clock = pygame.time.Clock()font = pygame.font.Font(self.cfg.FONTPATH_CN, 40)while True:screen.fill((0, 0, 0))screen.blit(self.background_images['gamebg'], (0, 0))map_parser.draw(screen)for scene in self.cur_scenes:screen.blit(scene[0], scene[1])self.draw(screen)# --按键检测for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# --更新战斗面板update_count += 1if update_count > update_interval:update_count = 0if update_hero:self.life_value = self.life_value - (monster[2] - self.defense_power)else:monster[1] = max(monster[1] - (self.attack_power - monster[3]), 0)update_hero = not update_heroif monster[1] <= 0: returnscreen.blit(self.background_images['battlebg'], (20, 40))screen.blit(monster_image, (90, 140))font_renders = [font.render(str(monster[1]), True, (255, 255, 255)),font.render(str(monster[2]), True, (255, 255, 255)),font.render(str(monster[3]), True, (255, 255, 255)),font.render(str(self.life_value), True, (255, 255, 255)),font.render(str(self.attack_power), True, (255, 255, 255)),font.render(str(self.defense_power), True, (255, 255, 255)),]rects = [fr.get_rect() for fr in font_renders]for idx in range(3):rects[idx].top, rects[idx].left = 78 + idx * 95, 320for idx in range(3, 6):rects[idx].top, rects[idx].right = 78 + (idx - 3) * 95, 655for fr, rect in zip(font_renders, rects):screen.blit(fr, rect)# --刷新pygame.display.flip()clock.tick(self.cfg.FPS)

原理其实很简单,由我方的勇士先发起一次攻击,然后再由怪物发起一次攻击,以此类推,该过程中战斗面板实时更新当前勇士和怪物的状态。最终的效果如下图所示:

本期完整源代码详情个人主页简介获取~
python福利教程领取方式:
1、点赞+评论(勾选“同时转发”)
2、关注小编。并私信回复关键字【19】
(一定要私信哦~点击我的头像就能看到私信按钮了)

Python爬虫实战,requests模块,Python实现抓取某站美女壁纸相关推荐

  1. Python爬虫实战(4):抓取淘宝MM照片

    Python爬虫入门(1):综述 Python爬虫入门(2):爬虫基础了解 Python爬虫入门(3):Urllib库的基本使用 Python爬虫入门(4):Urllib库的高级用法 Python爬虫 ...

  2. Python爬虫实战八之利用Selenium抓取淘宝匿名旺旺

    其实本文的初衷是为了获取淘宝的非匿名旺旺,在淘宝详情页的最下方有相关评论,含有非匿名旺旺号,快一年了淘宝都没有修复这个. 很多人学习python,不知道从何学起. 很多人学习python,掌握了基本语 ...

  3. Python爬虫实战(二):抓取京东苹果手机评价

    目录 1. 网站分析 2. 示例代码 3. 注意事项 1. 网站分析 本文实现的爬虫是抓取京东商城指定苹果手机的评论信息.使用 requests 抓取手机评论 API 信息,然后通过 json 模块的 ...

  4. Python爬虫实战(1):抓取毒舌电影最新推送

    ​ update:6/11/2017 由于毒舌电影公众号被关闭账号,源码已失效,可参考并调整相关参数以适配网站上其他公众号文章的抓取,望周知. ~~~~~~~~~~~ 作为一个电影爱好者," ...

  5. Python爬虫实战:手机APP数据抓取分析!谁说不能爬取app数据的?

    大多数手机APP里面返回的是json格式数据,或者一堆加密过的数据 .这里以超级课程表APP为例,使用python抓取超级课程表里用户发的话题.主要是练习python爬取app的一些方式和技巧. 1. ...

  6. python爬取app播放的视频,Python爬虫工程师必学——App数据抓取实战视频教程

    爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统数据抓取.本课程主要为同学讲解如何用python实现App数据抓取,课程从开发环境搭建,App爬虫必备利器详解,项目实战,到最后的多App ...

  7. Python爬虫 | 斗图网表情包抓取

    Python爬虫 | 斗图网表情包抓取 1.数据来源分析 2.制作div_list 3.发起请求 4.保存图片 5.批量获取 6.完整代码 声明 1.数据来源分析   打开斗图吧的主页,发现网址非常有 ...

  8. Python爬虫学习基础——5分钟学会爬取B站视频日播放量排行

    Python爬虫学习基础--5分钟学会爬取B站视频日播放量排行 基础包含 requests pyquery 进入正题 基础包含 这也是我当初第一次学习爬虫时做的练习,感觉给初学者练笔挺不错的.运用的知 ...

  9. python爬虫之requests模块2

    python网络爬虫之requests模块 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 一 获取验证码 步骤: ​ 1 注册云大码 http://www. ...

最新文章

  1. Spring Cloud 2020.0.3 发布!
  2. JUC系列(九)| ThreadPool 线程池
  3. SpringMVC+RestFul详细示例实战教程
  4. 黑龙江科技大学计算机考研复试科目,2020年黑龙江科技大学计算机应用技术考研经验分享...
  5. 前端学习(2409):vs code自定义代码块
  6. 数据结构排序2-希尔,快速,归并排序
  7. oracle rac 启动失败has,oracle11.2.0.4 rac asm启动故障
  8. CODE ---代码助手 (保存代码、搜代码、生成网页、自由界面)
  9. GHOSTXPSP3电脑爱好者V9.9美化修正版
  10. 数组索引越界异常和空指针异常
  11. 大航海时代4+伙伴加入条件和港口一览
  12. token什么意思中文在C语言中,token是什么意思?
  13. 贝茜放慢脚步(寒假每日一题 14)
  14. 22年QQ号被盗,好友协助验证却申诉无效
  15. 什么是Cutoff Scores/Marks?
  16. OpenCV变脸大法--‘让妖怪现原形‘(附源码)
  17. 一名大学生选择军哥的乾颐堂是如何顺利通过华为HCIE的,又如何应对HCIE面试呢?...
  18. 计算机bq,用BQ24700构成的笔记本电脑电池充电电路
  19. Maven学习笔记,动力节点maven教程随堂笔记(史上最全)
  20. star ccm 报java错误_在 Linux VM 上运行 STAR-CCM+ 与 HPC Pack - Azure Virtual Machines | Microsoft Docs...

热门文章

  1. 记录火狐浏览器的一些开发使用总结
  2. Linux使用Tomcat部署虚拟主机
  3. 利用GEE来下载landsat-TIRES数据
  4. h5底部留白,适配iphoneX安全区域
  5. 软件定义网络SDN--概念的理解
  6. 某鱼监控(有想学习的同学可以咨询我)
  7. LomoX界面库-高仿QQ2011、QQ音乐盒等
  8. 年月日三级联动六级联动
  9. 【数据处理】合取子句进化算法(CCEA)和析取范式进化算法(DNFEA)(Matlab代码实现)
  10. 【Unity】音效播放