牛逼了!Python 开发植物大战僵尸游戏
文章图片
1.引入需要的模块 , 配置图片路径 , 设置界面宽高背景颜色 , 创建游戏主入口 。
#1引入需要的模块importpygameimportrandom#1配置图片地址IMAGE_PATH='imgs/'#1设置页面宽高scrrr_width=800scrrr_height=560#1创建控制游戏结束的状态GAMEOVER=False#1主程序classMainGame():#1加载游戏窗口definit_window(self):#1调用显示模块的初始化pygame.display.init()#1创建窗口MainGame.window=pygame.display.set_mode([scrrr_width,scrrr_height])##1开始游戏defstart_game(self):#1初始化窗口self.init_window()#1只要游戏没结束 , 就一直循环whilenotGAMEOVER:#1渲染白色背景MainGame.window.fill((255,255,255))#1实时更新pygame.display.update()#1启动主程序if__name__=='__main__':game=MainGame()game.start_game()
2.文本绘制 , 创建要动态改变的属性 , 渲染的位置
#2创建关数 , 得分 , 剩余分数 , 钱数shaoguan=1score=0remnant_score=100money=200#2文本绘制defdraw_text(self,content,size,color):pygame.font.init()font=pygame.font.SysFont('kaiti',size)text=font.render(content,True,color)returntext#2加载帮助提示defload_help_text(self):text1=self.draw_text('1.按左键创建向日葵2.按右键创建豌豆射手',26,(255,0,0))MainGame.window.blit(text1,(5,5))#2渲染的文字和坐标位置MainGame.window.blit(self.draw_text('当前钱数$:{}'.format(MainGame.money),26,(255,0,0)),(500,40))MainGame.window.blit(self.draw_text('当前关数{} , 得分{},距离下关还差{}分'.format(MainGame.shaoguan,MainGame.score,MainGame.remnant_score),26,(255,0,0)),(5,40))self.load_help_text()
3.创建地图类 , 初始化地图和坐标
#3创建地图类classMap():#3存储两张不同颜色的图片名称map_names_list=[IMAGE_PATH+'map1.png',IMAGE_PATH+'map2.png']#3初始化地图def__init__(self,x,y,img_index):self.image=pygame.image.load(Map.map_names_list[img_index])self.position=(x,y)#是否能够种植self.can_grow=True#3加载地图defload_map(self):MainGame.window.blit(self.image,self.position)#3存储所有地图坐标点map_points_list=[]#3存储所有的地图块map_list=[]#3初始化坐标点definit_plant_points(self):foryinrange(1,7):points=[]forxinrange(10):point=(x,y)points.append(point)MainGame.map_points_list.append(points)print(''MainGame.map_points_list'',MainGame.map_points_list)#3初始化地图definit_map(self):forpointsinMainGame.map_points_list:temp_map_list=list()forpointinpoints:#map=Noneif(point[0]+point[1])%2==0:map=Map(point[0]*80,point[1]*80,0)else:map=Map(point[0]*80,point[1]*80,1)#将地图块加入到窗口中temp_map_list.append(map)print(''temp_map_list'',temp_map_list)MainGame.map_list.append(temp_map_list)print(''MainGame.map_list'',MainGame.map_list)#3将地图加载到窗口中defload_map(self):fortemp_map_listinMainGame.map_list:formapintemp_map_list:map.load_map()#3初始化坐标和地图self.init_plant_points()self.init_map()#3需要反复加载地图self.load_map()
4.创建植物类 , 图片加载报错处理 , 加载植物方法
#4图片加载报错处理LOG='文件:{}中的方法:{}出错'.format(__file__,__name__)#4植物类classPlant(pygame.sprite.Sprite):def__init__(self):super(Plant,self).__init__()self.live=True#加载图片defload_image(self):ifhasattr(self,'image')andhasattr(self,'rect'):MainGame.window.blit(self.image,self.rect)else:print(LOG)#4存储所有植物的列表plants_list=[]
5.创建向日葵类
【牛逼了!Python 开发植物大战僵尸游戏】#5向日葵类classSunflower(Plant):def__init__(self,x,y):super(Sunflower,self).__init__()self.image=pygame.image.load('imgs/sunflower.png')self.rect=self.image.get_rect()self.rect.x=xself.rect.y=yself.price=50self.hp=100#5时间计数器self.time_count=0#5功能:生成阳光(生产钱)defproduce_money(self):self.time_count+=1ifself.time_count==25:MainGame.money+=5self.time_count=0#5向日葵加入到窗口中defdisplay_sunflower(self):MainGame.window.blit(self.image,self.rect)
6.创建豌豆射手类
#6豌豆射手类classPeaShooter(Plant):def__init__(self,x,y):super(PeaShooter,self).__init__()#self.image为一个surfaceself.image=pygame.image.load('imgs/peashooter.png')self.rect=self.image.get_rect()self.rect.x=xself.rect.y=yself.price=50self.hp=200#6发射计数器self.shot_count=0#6增加射击方法defshot(self):#6记录是否应该射击should_fire=FalseforzombieinMainGame.zombie_list:ifzombie.rect.y==self.rect.yandzombie.rect.x<800andzombie.rect.x>self.rect.x:should_fire=True#6如果活着ifself.liveandshould_fire:self.shot_count+=1#计数器到25发射一次ifself.shot_count==25:#6基于当前豌豆射手的位置 , 创建子弹peabullet=PeaBullet(self)#6将子弹存储到子弹列表中MainGame.peabullet_list.append(peabullet)self.shot_count=0#6将豌豆射手加入到窗口中的方法defdisplay_peashooter(self):MainGame.window.blit(self.image,self.rect)#6增加豌豆射手发射处理defload_plants(self):forplantinMainGame.plants_list:#6优化加载植物的处理逻辑ifplant.live:ifisinstance(plant,Sunflower):plant.display_sunflower()plant.produce_money()elifisinstance(plant,PeaShooter):plant.display_peashooter()plant.shot()else:MainGame.plants_list.remove(plant)#6调用加载植物的方法self.load_plants()
7.创建子弹类
#7豌豆子弹类classPeaBullet(pygame.sprite.Sprite):def__init__(self,peashooter):self.live=Trueself.image=pygame.image.load('imgs/peabullet.png')self.damage=50self.speed=10self.rect=self.image.get_rect()self.rect.x=peashooter.rect.x+60self.rect.y=peashooter.rect.y+15defmove_bullet(self):#7在屏幕范围内 , 实现往右移动ifself.rect.x<scrrr_width:self.rect.x+=self.speedelse:self.live=False#7新增 , 子弹与僵尸的碰撞defhit_zombie(self):forzombieinMainGame.zombie_list:ifpygame.sprite.collide_rect(self,zombie):#打中僵尸之后 , 修改子弹的状态 , self.live=False#僵尸掉血zombie.hp-=self.damageifzombie.hp<=0:zombie.live=Falseself.nextLevel()#7闯关方法defnextLevel(self):MainGame.score+=20MainGame.remnant_score-=20foriinrange(1,100):ifMainGame.score==100*iandMainGame.remnant_score==0:MainGame.remnant_score=100*iMainGame.shaoguan+=1MainGame.produce_zombie+=50defdisplay_peabullet(self):MainGame.window.blit(self.image,self.rect)#7存储所有豌豆子弹的列表peabullet_list=[]#7加载所有子弹的方法defload_peabullets(self):forbinMainGame.peabullet_list:ifb.live:b.display_peabullet()b.move_bullet()#7调用子弹是否打中僵尸的方法b.hit_zombie()else:MainGame.peabullet_list.remove(b)#7调用加载所有子弹的方法self.load_peabullets()
8.事件处理
#8事件处理defdeal_events(self):#8获取所有事件eventList=pygame.event.get()#8遍历事件列表 , 判断foreineventList:ife.type==pygame.QUIT:self.gameOver()elife.type==pygame.MOUSEBUTTONDOWN:#print('按下鼠标按键')print(e.pos)#print(e.button)#左键1按下滚轮2上转滚轮为4下转滚轮为5右键3x=e.pos[0]//80y=e.pos[1]//80print(x,y)map=MainGame.map_list[y-1][x]print(map.position)#8增加创建时候的地图装填判断以及金钱判断ife.button==1:ifmap.can_growandMainGame.money>=50:sunflower=Sunflower(map.position[0],map.position[1])MainGame.plants_list.append(sunflower)print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))map.can_grow=FalseMainGame.money-=50elife.button==3:ifmap.can_growandMainGame.money>=50:peashooter=PeaShooter(map.position[0],map.position[1])MainGame.plants_list.append(peashooter)print('当前植物列表长度:{}'.format(len(MainGame.plants_list)))map.can_grow=FalseMainGame.money-=50#8调用事件处理的方法self.deal_events()
9.创建僵尸类
#9僵尸类classZombie(pygame.sprite.Sprite):def__init__(self,x,y):super(Zombie,self).__init__()self.image=pygame.image.load('imgs/zombie.png')self.rect=self.image.get_rect()self.rect.x=xself.rect.y=yself.hp=1000self.damage=2self.speed=1self.live=Trueself.stop=False#9僵尸的移动defmove_zombie(self):ifself.liveandnotself.stop:self.rect.x-=self.speedifself.rect.x<-80:#8调用游戏结束方法MainGame().gameOver()#9判断僵尸是否碰撞到植物 , 如果碰撞 , 调用攻击植物的方法defhit_plant(self):forplantinMainGame.plants_list:ifpygame.sprite.collide_rect(self,plant):#8僵尸移动状态的修改self.stop=Trueself.eat_plant(plant)#9僵尸攻击植物defeat_plant(self,plant):#9植物生命值减少plant.hp-=self.damage#9植物死亡后的状态修改 , 以及地图状态的修改ifplant.hp<=0:a=plant.rect.y//80-1b=plant.rect.x//80map=MainGame.map_list[a][b]map.can_grow=Trueplant.live=False#8修改僵尸的移动状态self.stop=False#9将僵尸加载到地图中defdisplay_zombie(self):MainGame.window.blit(self.image,self.rect)#9新增存储所有僵尸的列表zombie_list=[]count_zombie=0produce_zombie=100#9新增初始化僵尸的方法definit_zombies(self):foriinrange(1,7):dis=random.randint(1,5)*200zombie=Zombie(800+dis,i*80)MainGame.zombie_list.append(zombie)#9将所有僵尸加载到地图中defload_zombies(self):forzombieinMainGame.zombie_list:ifzombie.live:zombie.display_zombie()zombie.move_zombie()#v2.0调用是否碰撞到植物的方法zombie.hit_plant()else:MainGame.zombie_list.remove(zombie)#9调用初始化僵尸的方法self.init_zombies()#9调用展示僵尸的方法self.load_zombies()#9计数器增长 , 每数到100 , 调用初始化僵尸的方法MainGame.count_zombie+=1ifMainGame.count_zombie==MainGame.produce_zombie:self.init_zombies()MainGame.count_zombie=0#9pygame自己的休眠pygame.time.wait(10)
10.游戏结束方法
#10程序结束方法defgameOver(self):MainGame.window.blit(self.draw_text('游戏结束',50,(255,0,0)),(300,200))pygame.time.wait(400)globalGAMEOVERGAMEOVER=True
推荐阅读
- 又被机构抢先了!这个板块已有20多只个股股价翻倍
- 颠覆未来战场?美军成功测试新武器,但中国早用来砍树了
- LOL:粉丝急了!GRF三人结束合约,Tarzan却不在名单内
- Knight要扣工资了,Cryin发信息给他:WE买了Tarzan又卖给LNG
- RNG新上单暴露了?绿毛小明聊天记录曝光:记得照顾好我们的兄弟
- LOL:RNG官推剪影到底暗示着什么?这个细节暴露了
- 控卫不能盖帽?保罗131个,库里156个,威少太强了
- 西塞回忆在利物浦时的重伤:骨头断了很多根,差点被截肢
- 独家对话宋亚东:一龙与马保国做了坏表率,大众误以为他们是高手
- 阿圭罗直播连线梅西:你玩UNO的时候欺骗儿子马特奥,太坏了