怎么用Python脚本实现魔塔小游戏
怎么用Python脚本实现魔塔小游戏
这篇文章主要介绍“怎么用Python脚本实现魔塔小游戏”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么用Python脚本实现魔塔小游戏”文章能帮助大家解决问题。
开发工具
Python版本:3.7.4
相关模块:
cpgames模块;
以及一些python自带的模块。
环境搭建
安装Python并添加到环境变量,pip安装需要的相关模块即可。
原理简介
本期我们实现一些之前还没实现的功能,以及做一些功能优化(部分内容为了测试方便,我会把人物设置成无敌状态)。首先,是拾取物品等游戏事件的提示效果,核心代码如下:
'''游戏事件提示'''defshowinfo(self,screen):ifself.obtain_tipsisNone:returnself.show_obtain_tips_count+=1ifself.show_obtain_tips_count>self.max_obtain_tips_count:self.show_obtain_tips_count=0self.obtain_tips=None#画框left,top=self.cfg.BLOCKSIZE//2,100width,height=self.cfg.SCREENSIZE[0]//self.cfg.BLOCKSIZE-1,2pygame.draw.rect(screen,(199,97,20),(left-4,top-4,self.cfg.BLOCKSIZE*width+8,self.cfg.BLOCKSIZE*height+8),7)forcolinrange(width):forrowinrange(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))#文字ifisinstance(self.obtain_tips,list):assertlen(self.obtain_tips)==2font=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+10rect2.midtop=left+width*self.cfg.BLOCKSIZE//2,top+10+self.blocksizescreen.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-20screen.blit(font_render,rect)
效果:
'''显示商店'''defshowbuyinterface(self,screen,scenes,shop_type):#购买函数defbuy(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):ifhero.num_coins<coins_cost:returnifhero.experience<experience_cost:returnifadd_yellow_keys<0andhero.num_yellow_keys<1:returnifadd_purple_keys<0andhero.num_purple_keys<1:returnifadd_red_keys<0andhero.num_red_keys<1:returnhero.num_coins-=coins_costhero.experience-=experience_costhero.life_value+=add_life_value+1000*add_levelhero.attack_power+=add_attack_power+7*add_levelhero.defense_power+=add_defense_power+7*add_levelhero.level+=add_levelhero.num_yellow_keys+=add_yellow_keyshero.num_purple_keys+=add_purple_keyshero.num_red_keys+=add_red_keys#选项定义#--第三层商店ifself.map_level_pointer==3andshop_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]#--第十一层商店elifself.map_level_pointer==11andshop_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]#--第五层神秘老人elifself.map_level_pointer==5andshop_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]#--第十三层神秘老人elifself.map_level_pointer==13andshop_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]#--第五层商人elifself.map_level_pointer==5andshop_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]#--第十二层商人elifself.map_level_pointer==12andshop_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(),1font=pygame.font.Font(self.cfg.FONT_PATHS_NOPRELOAD_DICT['font_cn'],20)whileTrue:screen.fill((0,0,0))screen.blit(self.background_images['gamebg'],(0,0))self.map_parser.draw(screen)forsceneinscenes:screen.blit(scene[0],scene[1])self.hero.draw(screen)#--按键检测foreventinpygame.event.get():ifevent.type==pygame.QUIT:QuitGame()elifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_SPACE:list(choices_dict.values())[selected_idx-1]()ifselected_idx==4:returnelifevent.key==pygame.K_worevent.key==pygame.K_UP:selected_idx=max(selected_idx-1,1)elifevent.key==pygame.K_sorevent.key==pygame.K_DOWN:selected_idx=min(selected_idx+1,4)#--对话框#----底色width,height=8,3left,bottom=self.hero.rect.left+self.hero.rect.width//2-width//2*self.cfg.BLOCKSIZE,self.hero.rect.bottomforcolinrange(width):forrowinrange(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)#----展示选项foridx,choiceinenumerate(['请选择:']+list(choices_dict.keys())):ifselected_idx==idxandidx>0:choice='➤'+choicefont_render=font.render(choice,True,(255,0,0))elifidx>0:choice=''+choicefont_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*30screen.blit(font_render,rect)#----展示头像screen.blit(id_image,(left+10,bottom+10))#--刷新pygame.display.flip()clock.tick(self.cfg.FPS)
即,商店主要包括三种类型:一种的明面上的商店,用金币进行交易,可以获得生命值、攻击力和防御力的提升;一种是商人,用金币进行交易,可以获得/出售不同颜色的钥匙;还有一种是神秘老人,用经验值进行交易,可以获得等级、攻击力和防御力的提示。效果如下
接着,我们来实现一下地图中可以捡到的一些宝物的特效,主要包括风之罗盘、圣光徽、星光神榔和幸运十字架。
其中,风之罗盘用于在已经走过的楼层间进行跳跃,代码实现如下:
'''显示关卡跳转'''defshowjumplevel(self,screen,scenes):#主循环clock,selected_level=pygame.time.Clock(),1font=pygame.font.Font(self.cfg.FONT_PATHS_NOPRELOAD_DICT['font_cn'],20)whileTrue:screen.fill((0,0,0))screen.blit(self.background_images['gamebg'],(0,0))self.map_parser.draw(screen)forsceneinscenes:screen.blit(scene[0],scene[1])self.hero.draw(screen)#--按键检测foreventinpygame.event.get():ifevent.type==pygame.QUIT:QuitGame()elifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_SPACE:returnselected_levelelifevent.key==pygame.K_worevent.key==pygame.K_UP:selected_level=max(selected_level-1,0)elifevent.key==pygame.K_sorevent.key==pygame.K_DOWN:selected_level=min(selected_level+1,self.max_map_level_pointer)#--对话框#----底色width,height=11,4left,top=self.cfg.SCREENSIZE[0]//2-width//2*self.cfg.BLOCKSIZE,self.cfg.SCREENSIZE[1]//2-height*self.cfg.BLOCKSIZEforcolinrange(width):forrowinrange(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)#----展示选项foridxinlist(range(self.max_map_level_pointer+1)):ifselected_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)*30screen.blit(font_render,rect)#--刷新pygame.display.flip()clock.tick(self.cfg.FPS)
效果:
然后是圣光徽,用于查看怪物的基本情况,代码实现如下:
'''显示关卡怪物信息'''defshowforecastlevel(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()iflen(monsters)<1:returnmonsters_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,15return_flag=FalsewhileTrue:screen.fill((0,0,0))screen.blit(self.background_images['gamebg'],(0,0))self.map_parser.draw(screen)forsceneinscenes:screen.blit(scene[0],scene[1])self.hero.draw(screen)#--按键检测foreventinpygame.event.get():ifevent.type==pygame.QUIT:QuitGame()elifevent.type==pygame.KEYDOWN:ifevent.key==pygame.K_l:return_flag=Trueelifevent.key==pygame.K_SPACE:monsters_show_pointer=monsters_show_pointer+1ifmonsters_show_pointer>max_monsters_show_pointer:monsters_show_pointer=1elifevent.type==pygame.KEYUP:ifevent.key==pygame.K_landreturn_flag:return#--对话框#----底色width,height=14,5left,top=self.cfg.SCREENSIZE[0]//2-width//2*self.cfg.BLOCKSIZE,self.cfg.SCREENSIZE[1]//2-height*self.cfg.BLOCKSIZEforcolinrange(width):forrowinrange(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)#----展示选项foridx,monsterinenumerate(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.BLOCKSIZEscreen.blit(font_render,rect)#----操作提示show_tip_text_count+=1ifshow_tip_text_count==max_show_tip_text_count:show_tip_text_count=1show_tip_text=notshow_tip_textifshow_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)+10screen.blit(font_render,rect)#--刷新pygame.display.flip()clock.tick(self.cfg.FPS)
效果:
然后我们来实现一下幸运十字架,把它交给序章中的仙子,可以将自身的所有能力提升一些(攻击防御和生命值)。
#定义所有对话ifself.hero.has_cross:conversations=[['仙子,我已经将那个十字架找到了.'],['你做得很好.那么现在我就开始','授予你更强的力量!咪啦哆咪哔...','好了,我已经将你现在的能力提升了!','记住:如果你没有足够的实力的话,','不要去第二十一层.在那一层里,','你所有宝物的法力都会失去作用.']]self.hero.has_cross=Falseself.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脚本实现魔塔小游戏”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注恰卡编程网行业资讯频道,小编每天都会为大家更新不同的知识点。
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...