|
文章目录效果图项目结构实现思路源代码效果图项目结构实现思路下面是代码的实现思路:导入必要的库和模块:首先,我们导入了Python的os、time库以及pygame库,还有植物大战僵尸游戏中用到的各个植物和僵尸的类。初始化游戏和加载资源:接下来,我们初始化了Pygame库,并设置了游戏的背景尺寸。然后,我们加载了游戏所需的各种图像资源,包括背景、植物、僵尸等。定义游戏元素和变量:我们定义了几个全局变量,包括阳光值、植物组、子弹组、僵尸组和阳光组。还定义了一些特殊事件,用于在游戏中生成新的植物、子弹、僵尸和阳光等。编写游戏主循环:游戏的主循环在main()函数中。在主循环中,我们首先更新了植物、子弹和僵尸的位置和状态,然后在屏幕上绘制了这些元素。接下来,我们响应了用户的鼠标和键盘事件,包括选择植物、放置植物、收集阳光等。最后,我们更新了游戏界面并检查了游戏是否结束。处理游戏事件:在主循环中,我们使用pygame.event.get()函数获取当前的游戏事件,并根据事件类型进行相应的处理。例如,当用户点击鼠标时,我们会判断用户是否点击了植物种子的图标,如果是,则将选择的植物类型设置为相应的值;如果用户点击了游戏区域,则根据选择的植物类型放置植物。更新游戏状态和界面:在主循环中,我们还更新了游戏的状态,如减少阳光值、增加僵尸数量等。同时,我们也更新了游戏界面,如重新绘制阳光值、植物、僵尸等。检查游戏结束条件:在主循环中,我们还检查了游戏是否结束。如果僵尸到达了终点,则游戏失败;如果僵尸数量大于一定值,则游戏胜利。启动游戏:最后,我们在if__name__=='__main__':代码块中调用了main()函数,启动游戏。玩家可以选择不同的植物来抵御僵尸的进攻,并收集阳光来购买更多的植物。游戏通过不断生成新的僵尸和植物,以及响应用户的操作,来保持游戏的进行,直到游戏结束。源代码完整代码地址:https://gitcode.com/stormsha1/games/overviewpvz/main.pyimportosimporttimeimportpygamefrompvz.plant.PeashooterimportPeashooterfrompvz.plant.SunFlowerimportSunFlowerfrompvz.plant.WallNutimportWallNutfrompvz.plant.SunimportSunfrompvz.plant.Sun2importSun2frompvz.plant.JXCimportJXCfrompvz.plant.BulletimportBulletfrompvz.plant.BulletJXCimportBulletJXCfrompvz.zombie.ZombieimportZombiefrompvz.zombie.ZombieLzimportZombieLz#初始化pygame库pygame.init()#设置游戏背景尺寸,所有的资源图片都是基于这个尺寸制作的,不建议修改background_size=(820,560)#创建游戏窗口并设置screen=pygame.display.set_mode(background_size)pygame.display.set_caption("植物大战僵尸")#获取当前工作目录base_path=os.getcwd()#加载背景图片bg_img_obj=pygame.image.load(os.path.join(base_path,'images/a3.png')).convert_alpha()#加载植物图片sunFlowerImg=pygame.image.load(os.path.join(base_path,'images/SunFlower/SunFlower_00.png')).convert_alpha()wallNutImg=pygame.image.load(os.path.join(base_path,'images/WallNut/wall_nut_00.png')).convert_alpha()peaShooterImg=pygame.image.load(os.path.join(base_path,'images/Peashooter/Peashooter00.png')).convert_alpha()jxcImg=pygame.image.load(os.path.join(base_path,'images/jxc/JXC00.png')).convert_alpha()#加载阳光储蓄罐和种子图片sun_back_img=pygame.image.load(os.path.join(base_path,'images/SeedBank01.png')).convert_alpha()sunflower_seed=pygame.image.load(os.path.join(base_path,'images/SunFlower_kp.png'))wall_nut_seed=pygame.image.load(os.path.join(base_path,'images/Wallnut_kp.png'))peashooter_seed=pygame.image.load(os.path.join(base_path,'images/Peashooter_kp.png'))jxc_seed=pygame.image.load(os.path.join(base_path,'images/jxc_kp.png'))#初始化阳光值为100text="1000"#设置阳光值字体和颜色sun_font=pygame.font.SysFont("黑体",25)sun_num_surface=sun_font.render(str(text),True,(0,0,0))#创建植物组、子弹组、僵尸组和阳光组spriteGroup=pygame.sprite.Group()bulletGroup=pygame.sprite.Group()zombieGroup=pygame.sprite.Group()sun_sprite=pygame.sprite.Group()#定义游戏时钟和特殊事件clock=pygame.time.Clock()GEN_SUN_EVENT=pygame.USEREVENT+1#生成阳光事件pygame.time.set_timer(GEN_SUN_EVENT,2000)#每2秒生成一次阳光GEN_BULLET_EVENT=pygame.USEREVENT+2#生成子弹事件pygame.time.set_timer(GEN_BULLET_EVENT,2000)#每2秒生成一次子弹GEN_ZOMBIE_EVENT=pygame.USEREVENT+3#生成僵尸事件pygame.time.set_timer(GEN_ZOMBIE_EVENT,10000)#每10秒生成一次僵尸GEN_SUN2_EVENT=pygame.USEREVENT+4#生成双倍阳光事件pygame.time.set_timer(GEN_SUN2_EVENT,20000)#每20秒生成一次双倍阳光#初始化选择的植物类型和僵尸数量choose=0zombie_num=0defmain():"""游戏主函数,包含游戏主循环"""globalzombie_num#僵尸数量全局变量globalchoose#选择的植物类型全局变量globaltext#阳光值全局变量globalsun_num_surface#阳光值显示表面全局变量running=True#游戏是否运行标志index=0#用于植物、子弹和僵尸的更新和绘制的索引whilerunning:#控制游戏帧率clock.tick(20)#检查子弹和僵尸的碰撞,如果碰撞则减少僵尸的能量并移除子弹forbulletinbulletGroup:forzombieinzombieGroup:ifpygame.sprite.collide_mask(bullet,zombie):ifisinstance(bullet,BulletJXC):#如果是坚果的子弹,则减少2点能量zombie.energy-=2bulletGroup.remove(bullet)else:#否则减少1点能量zombie.energy-=1bulletGroup.remove(bullet)#检查植物和僵尸的碰撞,如果碰撞则设置僵尸的GO标志为True,并将僵尸添加到植物的zombies列表中forspriteinspriteGroup:forzombieinzombieGroup:ifpygame.sprite.collide_mask(sprite,zombie):zombie.GO=Truesprite.zombies.add(zombie)#如果植物是坚果,则检查僵尸是否在攻击范围内,如果是则设置植物的攻击标志为True,并生成子弹ifisinstance(sprite,JXC):ifabs(zombie.rect.top-sprite.rect[1])7:zombieGroup.add(zombie_lz)#处理生成阳光事件ifevent.type==GEN_SUN_EVENT:forspriteinspriteGroup:ifisinstance(sprite,SunFlower):now=time.time()ifnow-sprite.last_time>=10:#如果距离上次生成阳光的时间大于等于10秒,则生成阳光sun=Sun(sprite.rect)sun_sprite.add(sun)sprite.last_time=now#处理生成子弹事件ifevent.type==GEN_BULLET_EVENT:forspriteinspriteGroup:forzombieinzombieGroup:ifisinstance(sprite,Peashooter)\and0=50:choose=1elif121=100:choose=2elif162=50:choose=3elif203=100:choose=4#如果点击了游戏区域,则根据选择的植物类型放置植物elif3620:#如果僵尸数量大于20,则游戏胜利print("胜利")running=False#更新游戏界面pygame.display.update()if__name__=='__main__':main()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291完整代码地址:https://gitcode.com/stormsha1/games/overviewPython开心消消乐:https://stormsha.blog.csdn.net/article/details/139220748Python植物大战僵尸:https://stormsha.blog.csdn.net/article/details/138405944
|
|