怎么用Python脚本实现魔塔小游戏
发表于:2025-11-10 作者:千家信息网编辑
千家信息网最后更新 2025年11月10日,这篇文章主要介绍"怎么用Python脚本实现魔塔小游戏"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么用Python脚本实现魔塔小游戏"文章能帮助大家解决问
千家信息网最后更新 2025年11月10日怎么用Python脚本实现魔塔小游戏
这篇文章主要介绍"怎么用Python脚本实现魔塔小游戏"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"怎么用Python脚本实现魔塔小游戏"文章能帮助大家解决问题。
开发工具
Python版本: 3.7.4
相关模块:
cpgames模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
本期我们实现一些之前还没实现的功能,以及做一些功能优化(部分内容为了测试方便,我会把人物设置成无敌状态)。首先,是拾取物品等游戏事件的提示效果,核心代码如下:
'''游戏事件提示'''def showinfo(self, screen): if self.obtain_tips is None: return self.show_obtain_tips_count += 1 if self.show_obtain_tips_count > self.max_obtain_tips_count: self.show_obtain_tips_count = 0 self.obtain_tips = None # 画框 left, top = self.cfg.BLOCKSIZE // 2, 100 width, height = self.cfg.SCREENSIZE[0] // self.cfg.BLOCKSIZE - 1, 2 pygame.draw.rect(screen, (199, 97, 20), (left - 4, top - 4, self.cfg.BLOCKSIZE * width + 8, self.cfg.BLOCKSIZE * height + 8), 7) for col in range(width): for row in range(height): image = self.resource_loader.images['mapelements']['0'][0] image = pygame.transform.scale(image, (self.cfg.BLOCKSIZE, self.cfg.BLOCKSIZE)) screen.blit(image, (left + col * self.cfg.BLOCKSIZE, top + row * self.cfg.BLOCKSIZE)) # 文字 if isinstance(self.obtain_tips, list): assert len(self.obtain_tips) == 2 font = pygame.font.Font(self.fontpath, 30) font_render1 = font.render(self.obtain_tips[0], True, (255, 255, 255)) font_render2 = font.render(self.obtain_tips[1], True, (255, 255, 255)) rect1 = font_render1.get_rect() rect2 = font_render2.get_rect() rect1.midtop = left + width * self.cfg.BLOCKSIZE // 2, top + 10 rect2.midtop = left + width * self.cfg.BLOCKSIZE // 2, top + 10 + self.blocksize screen.blit(font_render1, rect1) screen.blit(font_render2, rect2) else: font = pygame.font.Font(self.fontpath, 40) font_render = font.render(self.obtain_tips, True, (255, 255, 255)) rect = font_render.get_rect() rect.midtop = left + width * self.cfg.BLOCKSIZE // 2, top + height * self.cfg.BLOCKSIZE // 2 - 20 screen.blit(font_render, rect)
效果:
'''显示商店'''def showbuyinterface(self, screen, scenes, shop_type): # 购买函数 def buy(hero, coins_cost=0, experience_cost=0, add_life_value=0, add_attack_power=0, add_defense_power=0, add_level=0, add_yellow_keys=0, add_purple_keys=0, add_red_keys=0): if hero.num_coins < coins_cost: return if hero.experience < experience_cost: return if add_yellow_keys < 0 and hero.num_yellow_keys < 1: return if add_purple_keys < 0 and hero.num_purple_keys < 1: return if add_red_keys < 0 and hero.num_red_keys < 1: return hero.num_coins -= coins_cost hero.experience -= experience_cost hero.life_value += add_life_value + 1000 * add_level hero.attack_power += add_attack_power + 7 * add_level hero.defense_power += add_defense_power + 7 * add_level hero.level += add_level hero.num_yellow_keys += add_yellow_keys hero.num_purple_keys += add_purple_keys hero.num_red_keys += add_red_keys # 选项定义 # --第三层商店 if self.map_level_pointer == 3 and shop_type == 'buy_from_shop': choices_dict = { '增加 800 点生命(25 金币)': lambda: buy(self.hero, coins_cost=25, add_life_value=800), '增加 4 点攻击(25 金币)': lambda: buy(self.hero, coins_cost=25, add_attack_power=4), '增加 4 点防御(25 金币)': lambda: buy(self.hero, coins_cost=25, add_defense_power=4), '离开商店': lambda: buy(self.hero), } id_image = self.resource_loader.images['mapelements']['22'][0] # --第十一层商店 elif self.map_level_pointer == 11 and shop_type == 'buy_from_shop': choices_dict = { '增加 4000 点生命(100 金币)': lambda: buy(self.hero, coins_cost=100, add_life_value=4000), '增加 20 点攻击(100 金币)': lambda: buy(self.hero, coins_cost=100, add_attack_power=20), '增加 20 点防御(100 金币)': lambda: buy(self.hero, coins_cost=100, add_defense_power=20), '离开商店': lambda: buy(self.hero), } id_image = self.resource_loader.images['mapelements']['22'][0] # --第五层神秘老人 elif self.map_level_pointer == 5 and shop_type == 'buy_from_oldman': choices_dict = { '提升一级(100 经验)': lambda: buy(self.hero, experience_cost=100, add_level=1), '增加 5 点攻击(30 经验)': lambda: buy(self.hero, experience_cost=30, add_attack_power=5), '增加 5 点防御(30 经验)': lambda: buy(self.hero, experience_cost=30, add_defense_power=5), '离开商店': lambda: buy(self.hero), } id_image = self.resource_loader.images['mapelements']['26'][0] # --第十三层神秘老人 elif self.map_level_pointer == 13 and shop_type == 'buy_from_oldman': choices_dict = { '提升三级(270 经验)': lambda: buy(self.hero, experience_cost=270, add_level=1), '增加 17 点攻击(95 经验)': lambda: buy(self.hero, experience_cost=95, add_attack_power=17), '增加 17 点防御(95 经验)': lambda: buy(self.hero, experience_cost=95, add_defense_power=17), '离开商店': lambda: buy(self.hero), } id_image = self.resource_loader.images['mapelements']['26'][0] # --第五层商人 elif self.map_level_pointer == 5 and shop_type == 'buy_from_businessman': choices_dict = { '购买 1 把黄钥匙(10 金币)': lambda: buy(self.hero, coins_cost=10, add_yellow_keys=1), '购买 1 把蓝钥匙(50 金币)': lambda: buy(self.hero, coins_cost=50, add_purple_keys=1), '购买 1 把红钥匙(100 金币)': lambda: buy(self.hero, coins_cost=100, add_red_keys=1), '离开商店': lambda: buy(self.hero), } id_image = self.resource_loader.images['mapelements']['27'][0] # --第十二层商人 elif self.map_level_pointer == 12 and shop_type == 'buy_from_businessman': choices_dict = { '卖出 1 把黄钥匙(7 金币)': lambda: buy(self.hero, coins_cost=-7, add_yellow_keys=-1), '卖出 1 把蓝钥匙(35 金币)': lambda: buy(self.hero, coins_cost=-35, add_purple_keys=-1), '卖出 1 把红钥匙(70 金币)': lambda: buy(self.hero, coins_cost=-70, add_red_keys=-1), '离开商店': lambda: buy(self.hero), } id_image = self.resource_loader.images['mapelements']['27'][0] id_image = pygame.transform.scale(id_image, (self.cfg.BLOCKSIZE, self.cfg.BLOCKSIZE)) # 主循环 clock, selected_idx = pygame.time.Clock(), 1 font = pygame.font.Font(self.cfg.FONT_PATHS_NOPRELOAD_DICT['font_cn'], 20) 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: QuitGame() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: list(choices_dict.values())[selected_idx-1]() if selected_idx == 4: return elif event.key == pygame.K_w or event.key == pygame.K_UP: selected_idx = max(selected_idx - 1, 1) elif event.key == pygame.K_s or event.key == pygame.K_DOWN: selected_idx = min(selected_idx + 1, 4) # --对话框 # ----底色 width, height = 8, 3 left, bottom = self.hero.rect.left + self.hero.rect.width // 2 - width // 2 * self.cfg.BLOCKSIZE, self.hero.rect.bottom for col in range(width): for row in range(height): image = self.resource_loader.images['mapelements']['0'][0] image = pygame.transform.scale(image, (self.cfg.BLOCKSIZE, self.cfg.BLOCKSIZE)) screen.blit(image, (left + col * self.cfg.BLOCKSIZE, bottom + row * self.cfg.BLOCKSIZE)) # ----边框 pygame.draw.rect(screen, (199, 97, 20), (left - 4, bottom - 4, self.cfg.BLOCKSIZE * width + 8, self.cfg.BLOCKSIZE * height + 8), 7) # ----展示选项 for idx, choice in enumerate(['请选择:'] + list(choices_dict.keys())): if selected_idx == idx and idx > 0: choice = '➤' + choice font_render = font.render(choice, True, (255, 0, 0)) elif idx > 0: choice = ' ' + choice font_render = font.render(choice, True, (255, 255, 255)) else: font_render = font.render(choice, True, (255, 255, 255)) rect = font_render.get_rect() rect.left, rect.top = left + self.cfg.BLOCKSIZE + 20, bottom + 10 + idx * 30 screen.blit(font_render, rect) # ----展示头像 screen.blit(id_image, (left + 10, bottom + 10)) # --刷新 pygame.display.flip() clock.tick(self.cfg.FPS)即,商店主要包括三种类型:一种的明面上的商店,用金币进行交易,可以获得生命值、攻击力和防御力的提升;一种是商人,用金币进行交易,可以获得/出售不同颜色的钥匙;还有一种是神秘老人,用经验值进行交易,可以获得等级、攻击力和防御力的提示。效果如下
接着,我们来实现一下地图中可以捡到的一些宝物的特效,主要包括风之罗盘、圣光徽、星光神榔和幸运十字架。
其中,风之罗盘用于在已经走过的楼层间进行跳跃,代码实现如下:
'''显示关卡跳转'''def showjumplevel(self, screen, scenes): # 主循环 clock, selected_level = pygame.time.Clock(), 1 font = pygame.font.Font(self.cfg.FONT_PATHS_NOPRELOAD_DICT['font_cn'], 20) 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: QuitGame() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: return selected_level elif event.key == pygame.K_w or event.key == pygame.K_UP: selected_level = max(selected_level - 1, 0) elif event.key == pygame.K_s or event.key == pygame.K_DOWN: selected_level = min(selected_level + 1, self.max_map_level_pointer) # --对话框 # ----底色 width, height = 11, 4 left, top = self.cfg.SCREENSIZE[0] // 2 - width // 2 * self.cfg.BLOCKSIZE, self.cfg.SCREENSIZE[1] // 2 - height * self.cfg.BLOCKSIZE for col in range(width): for row in range(height): image = self.resource_loader.images['mapelements']['0'][0] image = pygame.transform.scale(image, (self.cfg.BLOCKSIZE, self.cfg.BLOCKSIZE)) screen.blit(image, (left + col * self.cfg.BLOCKSIZE, top + row * self.cfg.BLOCKSIZE)) # ----边框 pygame.draw.rect(screen, (199, 97, 20), (left - 4, top - 4, self.cfg.BLOCKSIZE * width + 8, self.cfg.BLOCKSIZE * height + 8), 7) # ----展示选项 for idx in list(range(self.max_map_level_pointer+1)): if selected_level == idx: text = f'➤第 {idx} 层' font_render = font.render(text, True, (255, 0, 0)) else: text = f' 第 {idx} 层' font_render = font.render(text, True, (255, 255, 255)) rect = font_render.get_rect() rect.left, rect.top = left + 20 + idx // 6 * self.cfg.BLOCKSIZE * 2, top + 20 + (idx % 6) * 30 screen.blit(font_render, rect) # --刷新 pygame.display.flip() clock.tick(self.cfg.FPS)效果:
然后是圣光徽,用于查看怪物的基本情况,代码实现如下:
'''显示关卡怪物信息'''def showforecastlevel(self, screen, scenes): # 主循环 clock = pygame.time.Clock() font = pygame.font.Font(self.cfg.FONT_PATHS_NOPRELOAD_DICT['font_cn'], 20) monsters = self.map_parser.getallmonsters() if len(monsters) < 1: return monsters_show_pointer, max_monsters_show_pointer = 1, round(len(monsters) / 4) show_tip_text, show_tip_text_count, max_show_tip_text_count = True, 1, 15 return_flag = False 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: QuitGame() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_l: return_flag = True elif event.key == pygame.K_SPACE: monsters_show_pointer = monsters_show_pointer + 1 if monsters_show_pointer > max_monsters_show_pointer: monsters_show_pointer = 1 elif event.type == pygame.KEYUP: if event.key == pygame.K_l and return_flag: return # --对话框 # ----底色 width, height = 14, 5 left, top = self.cfg.SCREENSIZE[0] // 2 - width // 2 * self.cfg.BLOCKSIZE, self.cfg.SCREENSIZE[1] // 2 - height * self.cfg.BLOCKSIZE for col in range(width): for row in range(height): image = self.resource_loader.images['mapelements']['0'][0] image = pygame.transform.scale(image, (self.cfg.BLOCKSIZE, self.cfg.BLOCKSIZE)) screen.blit(image, (left + col * self.cfg.BLOCKSIZE, top + row * self.cfg.BLOCKSIZE)) # ----边框 pygame.draw.rect(screen, (199, 97, 20), (left - 4, top - 4, self.cfg.BLOCKSIZE * width + 8, self.cfg.BLOCKSIZE * height + 8), 7) # ----展示选项 for idx, monster in enumerate(monsters[(monsters_show_pointer-1)*4: monsters_show_pointer*4]): id_image = self.resource_loader.images['mapelements'][monster[6]][0] id_image = pygame.transform.scale(id_image, (self.cfg.BLOCKSIZE - 10, self.cfg.BLOCKSIZE - 10)) screen.blit(id_image, (left + 10, top + 20 + idx * self.cfg.BLOCKSIZE)) text = f'名称: {monster[0]} 生命: {monster[1]} 攻击: {monster[2]} 防御: {monster[3]} 金币: {monster[4]} 经验: {monster[5]} 损失: {self.hero.winmonster(monster)[1]}' font_render = font.render(text, True, (255, 255, 255)) rect = font_render.get_rect() rect.left, rect.top = left + 15 + self.cfg.BLOCKSIZE, top + 30 + idx * self.cfg.BLOCKSIZE screen.blit(font_render, rect) # ----操作提示 show_tip_text_count += 1 if show_tip_text_count == max_show_tip_text_count: show_tip_text_count = 1 show_tip_text = not show_tip_text if show_tip_text: tip_text = '空格键' font_render = font.render(tip_text, True, (255, 255, 255)) rect.left, rect.bottom = self.cfg.BLOCKSIZE * width + 30, self.cfg.BLOCKSIZE * (height + 1) + 10 screen.blit(font_render, rect) # --刷新 pygame.display.flip() clock.tick(self.cfg.FPS)效果:
然后我们来实现一下幸运十字架,把它交给序章中的仙子,可以将自身的所有能力提升一些(攻击防御和生命值)。
# 定义所有对话if self.hero.has_cross: conversations = [ ['仙子, 我已经将那个十字架找到了.'], ['你做得很好. 那么现在我就开始', '授予你更强的力量! 咪啦哆咪哔...', '好了, 我已经将你现在的能力提升了!', '记住: 如果你没有足够的实力的话,', '不要去第二十一层. 在那一层里,', '你所有宝物的法力都会失去作用.'] ] self.hero.has_cross = False self.hero.life_value = int(self.hero.life_value * 4 / 3) self.hero.attack_power = int(self.hero.attack_power * 4 / 3) self.hero.defense_power = int(self.hero.defense_power * 4 / 3)
关于"怎么用Python脚本实现魔塔小游戏"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。
效果
模块
提示
攻击
防御
小游戏
脚本
代码
十字
十字架
商店
生命
知识
金币
交易
对话
不同
幸运
事件
仙子
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
2000年网络安全事件
宿迁百川网络技术
软件开发职位的简历
rust进服务器
南京晟之嘉网络技术服务中心
如何加强网络安全预警机制
勘察测绘研究院软件开发人员
网络安全舆情管理措施
Date必须用单引号数据库
软件开发码农
网络技术人员招聘条件
单位网络安全责任制总结
前端简单还是网络安全简单
教育系统网络安全意见
网络安全设备台账模板
航电系统软件开发
区划代码数据库
学软件开发要多长时间
大学什么专业毕业学软件开发
新飞飞一直显示连接服务器
网络安全最基本技术是
为什么总会出现数据库出错
江阴艾康软件开发公司
杭州长牛网络技术有限公司
安阳软件开发分类
欧洲卡车模拟2自建服务器
突然断电会导致服务器卡吗
交换机与多网卡服务器配置
数据库和vs连接外键
属于数据库属性的窗口选项是