相关文件

相关游戏素材(图片和音频等)源于网络,侵歉删。

需要源代码的小伙伴私信小编,或者关注小编的公众号【Python日志】

开发工具

Python版本:3.7.4
相关模块:
pygame模块;
以及一些python自带的模块。

环境搭建

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

原理简介

首先,我们打开原版游戏的开始界面,发现是这样的:

具体而言,我们的思路是先定义一个按钮类,来模拟原始游戏中的“开始游戏”,“游戏说明”和“离开游戏”这三个按键的功能:

'''按钮类'''
class Button(pygame.sprite.Sprite):def __init__(self, text, fontpath, fontsize, position, color_selected=(255, 0, 0), color_default=(255, 255, 255)):pygame.sprite.Sprite.__init__(self)self.text = textself.color_selected = color_selectedself.color_default = color_defaultself.font = pygame.font.Font(fontpath, fontsize)self.font_render = self.font.render(text, True, color_default)self.rect = self.font_render.get_rect()self.rect.center = position'''更新函数: 不断地更新检测鼠标是否在按钮上'''def update(self):mouse_pos = pygame.mouse.get_pos()if self.rect.collidepoint(mouse_pos):self.font_render = self.font.render(self.text, True, self.color_selected)else:self.font_render = self.font.render(self.text, True, self.color_default)'''绑定到屏幕上'''def draw(self, screen):screen.blit(self.font_render, self.rect)

主要的原理就是不断检测鼠标是否在对应的按钮区域,如果在,则对按钮的颜色做出改变(这里是变成红色),否则按钮使用默认的颜色(这里是白色),以此来向玩家表明这是可点击的按钮。

然后,我们来实例化它三次来添加这三个按钮到游戏的开始界面中:

'''游戏开始界面'''
class StartGameInterface():def __init__(self, cfg):self.cfg = cfgself.play_btn = Button('开始游戏', cfg.FONTPATH_CN, 50, (cfg.SCREENSIZE[0]//2, cfg.SCREENSIZE[1] - 400))self.intro_btn = Button('游戏说明', cfg.FONTPATH_CN, 50, (cfg.SCREENSIZE[0]//2, cfg.SCREENSIZE[1] - 300))self.quit_btn = Button('离开游戏', cfg.FONTPATH_CN, 50, (cfg.SCREENSIZE[0]//2, cfg.SCREENSIZE[1] - 200))'''外部调用'''def run(self, screen):# 魔塔font = pygame.font.Font(self.cfg.FONTPATH_CN, 80)font_render_cn = font.render('魔塔', True, (255, 255, 255))rect_cn = font_render_cn.get_rect()rect_cn.center = self.cfg.SCREENSIZE[0] // 2, 200# Magic Towerfont = pygame.font.Font(self.cfg.FONTPATH_EN, 80)font_render_en = font.render('Magic Tower', True, (255, 255, 255))rect_en = font_render_en.get_rect()rect_en.center = self.cfg.SCREENSIZE[0] // 2, 350# (Ver 1.12)font = pygame.font.Font(self.cfg.FONTPATH_CN, 40)font_render_version = font.render('(Ver 1.12)', True, (255, 255, 255))rect_ver = font_render_version.get_rect()rect_ver.center = self.cfg.SCREENSIZE[0] // 2, 400clock = pygame.time.Clock()while True:screen.fill((0, 0, 0))for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit(0)elif event.type == pygame.MOUSEBUTTONDOWN:if event.button == 1:mouse_pos = pygame.mouse.get_pos()if self.play_btn.rect.collidepoint(mouse_pos):return Trueelif self.quit_btn.rect.collidepoint(mouse_pos):pygame.quit()sys.exit(0)elif self.intro_btn.rect.collidepoint(mouse_pos):self.showgameintro(screen)for btn in [self.intro_btn, self.play_btn, self.quit_btn]:btn.update()btn.draw(screen)for fr, rect in zip([font_render_cn, font_render_en, font_render_version], [rect_cn, rect_en, rect_ver]):screen.blit(fr, rect)pygame.display.flip()clock.tick(self.cfg.FPS)'''显示游戏简介'''def showgameintro(self, screen):font = pygame.font.Font(self.cfg.FONTPATH_CN, 20)font_renders = [font.render('魔塔小游戏.', True, (255, 255, 255)),font.render('游戏素材来自: http://www.4399.com/flash/1749_1.htm.', True, (255, 255, 255)),font.render('游戏背景故事为公主被大魔王抓走, 需要勇士前往魔塔将其救出.', True, (255, 255, 255)),    font.render('版权所有, 请勿随意删除转载.', True, (255, 255, 255)),]rects = [fr.get_rect() for fr in font_renders]for idx, rect in enumerate(rects):rect.center = self.cfg.SCREENSIZE[0] // 2, 50 * idx + 100clock = pygame.time.Clock()while True:screen.fill((0, 0, 0))for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit(0)elif event.type == pygame.MOUSEBUTTONDOWN:if event.button == 1:mouse_pos = pygame.mouse.get_pos()if self.play_btn.rect.collidepoint(mouse_pos):return Trueelif self.quit_btn.rect.collidepoint(mouse_pos):pygame.quit()sys.exit(0)elif self.intro_btn.rect.collidepoint(mouse_pos):returnfor btn in [self.intro_btn, self.play_btn, self.quit_btn]:btn.update()btn.draw(screen)for fr, rect in zip(font_renders, rects):screen.blit(fr, rect)pygame.display.flip()clock.tick(self.cfg.FPS)

其他额外的代码主要是显示游戏的标题等信息,都很简单,就不详细讨论了,会pygame的小伙伴肯定都能写出来,最后实现的效果如下:


接下来,我们来看下游戏开始之后的界面是长什么样子的,我们可以发现一般都是以下这个样子的(为什么我会说一般呢? 因为为了写这个游戏,我去重玩了一波,发现一时半会我还过不了所有关。有攻略或者随便通关的小伙伴看到我复现有不对的地方可以给我留言并附上对应的截图,可能我玩游戏比较菜图片):

具体而言,我们可以先在文本文件里定义游戏地图的样子,类似下图所示这样子,其中每个数字代表一种游戏元素:

游戏中的图片素材我也已经收集到了(这个是网上找到的别人整理好的游戏素材,不是我自己扣的T_T):

于是,我们可以写一个游戏地图文件的解析类,就像这样:

'''游戏地图解析类'''
class MapParser():def __init__(self, blocksize, filepath, element_images, offset=(0, 0), **kwargs):self.count = 0self.switch_times = 15self.image_pointer = 0self.offset = offsetself.blocksize = blocksizeself.element_images = element_imagesself.map_matrix = self.parse(filepath)'''解析'''def parse(self, filepath):map_matrix = []with open(filepath, 'r') as fp:for line in fp.readlines():line = line.strip()if not line: continuemap_matrix.append([c.strip() for c in line.split(',')])return map_matrix'''将游戏地图画到屏幕上'''def draw(self, screen):self.count += 1if self.count == self.switch_times:self.count = 0self.image_pointer = int(not self.image_pointer)for row_idx, row in enumerate(self.map_matrix):for col_idx, elem in enumerate(row):position = col_idx * self.blocksize + self.offset[0], row_idx * self.blocksize + self.offset[1]if elem+'.png' in self.element_images:image = self.element_images[elem+'.png'][self.image_pointer]image = pygame.transform.scale(image, (self.blocksize, self.blocksize))screen.blit(image, position)

其中parse函数其实就是读取存放游戏地图信息的文本文件,然后draw函数其实就是根据读取的地图信息,将对应的游戏元素图片绑定到地图上进行显示。另外,image_pointer,switch_times,count这三个变量是为了实现原版地图中场景元素闪烁的效果,就像这样:

据这个原理,我们可以轻松地画出魔塔所有层中的原始地图,定义的游戏地图文件如下图所示

效果如下图所示:


ok,总结一下,就是这期主要实现了魔塔游戏中每一层的初始画面,本期完整源代码可以在这里获取到:QQ群:773162165

需要源代码的小伙伴私信小编,或者关注小编的公众号【Python日志】

明天我会带大家进一步复现魔塔这款小游戏,感兴趣的小伙伴可以多多关注一下~

童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(1)相关推荐

  1. 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(2)

    导语 上一期我们带大家完成了魔塔游戏每一层的初始化画面的制作: 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(1) 这一期我们会带大家进一步复现我们的魔塔小游戏,主要内容包括英雄类 ...

  2. 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(3)

    导语 上一期我们主要带大家写了勇士类,以及勇士与一些简单的地图元素接触时所触发的事件: 童年经典回忆 | 从零开始带大家用Python撸一个魔塔小游戏呀(2) 这一期我们会带大家进一步复现我们的魔塔小 ...

  3. 玩过八音符游戏吗?今天教大家用python做一个八音符游戏

    先来看一下效果图: 需要用到的东西 Python3.6 cocos2d模块 pyaudio模块 以及一些Python自带的模块 cocos2d模块用于搭建游戏框架 pyaudio模块用于获得麦克风的声 ...

  4. 今天带大家用Python制作一个FlappyBird(飞翔的小鸟)的小游戏

    相关文件 源码分享,问题解答!! 关注小编,私信小编领取哟! 当然别忘了一件三连哟~~ 对了大家可以关注小编的公众号哟~~ 有很多资源可以领取的哟!! 大家也可以去b站看我的一些教学视频哟!! 更多P ...

  5. python自动填写小程序表单_新年好!教大家用Python写一个自动回复拜年信息的小程序!...

    原标题:新年好!教大家用Python写一个自动回复拜年信息的小程序! 过年期间,想必大家都收到很多拜年信息吧!有没有也被拜年短信(大部分是群发)搞得很焦虑?不回复似乎显得很没有礼貌,一一回复又累心劳神 ...

  6. python制作阴阳师脚本_利用python制作一个阴阳师小游戏

    利用python制作一个阴阳师小游戏 发布时间:2020-11-27 13:59:49 来源:亿速云 阅读:84 这期内容当中小编将会给大家带来有关利用python制作一个阴阳师小游戏,文章内容丰富且 ...

  7. Python游戏开发,Pygame模块,Python从零开始带大家实现一个魔塔小游戏

    开发工具 Python版本: 3.7.4 相关模块: pygame模块: 以及一些python自带的模块. 环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可. 原理简介 首先, ...

  8. python连连看小游戏_利用Python制作一个连连看小游戏,边学边玩!

    导语 今天我们将制作一个连连看小游戏,让我们愉快地开始吧~ 开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块 环境搭建 安装Python并添加到环 ...

  9. 请用python编写一个斗地主小游戏,并给出完整代码

    很高兴为您服务!这是一个使用Python编写的斗地主小游戏的完整代码:# 导入必备模块 import random# 定义一副牌 poker = ['A', 2, 3, 4, 5, 6, 7, 8, ...

最新文章

  1. android视频录制(调用系统视频录制)
  2. WINCE5.0+S3C2443系统每隔几分钟会自动关闭LCD显示
  3. Loj#2769-「ROI 2017 Day 1」前往大都会【最短路树,斜率优化】
  4. 什么是Apache Spark?这篇文章带你从零基础学起
  5. 嘉年华回顾丨 杨长老带你解密 Oracle 19c 和 20c 的新特性
  6. 几种无线充电解决方案特点及原理图
  7. 我发现每一个生意做得不错的人都很会说话
  8. 深度学习开源项目学习
  9. 亲测好用的全能视频播放器:OmniPlayer Pro Mac中文版
  10. java 添加文本框_java 添加了文本框的窗口
  11. 数据库系统(DBS)组成
  12. wb在计算机知识里是什么意思,计算机二级考试内容是什么?
  13. 根据生日定时发送生日祝福邮件
  14. 卷积核——Roberts、Prewitt、Sobel、Lapacian、DoG、LoG算子
  15. 数据库原理与设计P163习题9答案
  16. 深信服上网行为管理开启snmp_华为路由器、深信服NGAF防火墙的SNMP配置
  17. 二十二.jmeter在linux下运行
  18. Visual Studio工具集相关(MSBuild)
  19. 用shutdown命令实现局域网内远程重启或关闭电脑
  20. 整理了我开始分享学习笔记到现在超过250篇优质文章,涵盖数据分析、爬虫、机器学习等方面,别再说不知道该从哪开始,实战哪里找了...

热门文章

  1. android view绘制中调用的函数,Android开发实践:自定义带动画的View
  2. 欢迎使用CSDN-markdown编辑器推荐一个好用的论文助手工具,不仅可以免费论文查重,还可以规范参考文献和一键规范论文格式,方便好用还免费。地址:www.bigan.net
  3. Kotlin中的委托
  4. DS18B20使用注意事项
  5. 基于JSP的校园论坛BBS网站的设计与实现
  6. 51单片机+ESP8266+Android APP实现局域网内控制LED灯
  7. 利用php的mcrypt模块加密解密(AES、DES等等)
  8. 前端react基础基础学习 (一)
  9. 血的教训,都是卡巴斯基范的错
  10. Oracle数据库中的方差、标准差与协方差