面向对象学习之pygame坦克大战
经过一天多的奋战,查阅文献,参考别人的代码等等,完成了第一个面向对象的小项目,也深深体会到面向对象编程思想在游戏编程中所扮演的角色。
附上代码,参考了别人的代码,以及对他们代码的完善,又加上了自己的一些东西,收获颇深。
importpygame importsys importtime frompygame.localsimport* fromrandomimportrandint MOVE_SLEEP=0.01 classMyTank: width=600 heights=500 speed=10 screen=0 myshells=[] enemylist=[] enemyshells=[] grade=0 life=3 cnt=0 defstartgame(self): pygame.init() self.screen=pygame.display.set_mode((self.width,self.heights),0,32) pygame.display.set_caption("bittank") self.tank=Tank(self.screen,275,450) foriinrange(6): self.enemylist.append(EnmeyTank(self.screen)) whileTrue: key=pygame.key.get_pressed() self.screen.fill((0,0,0)) ifkey[K_LEFT]: self.tank.move('L') elifkey[K_RIGHT]: self.tank.move('R') elifkey[K_UP]: self.tank.move('U') elifkey[K_DOWN]: self.tank.move('D') self.get_event() forshellinself.myshells: ifshell.move()==True: self.myshells.remove(shell) shell.display() a=shell.hitTank() #子弹碰撞 ifa==True: ifself.life>0: self.myshells.remove(shell) self.grade+=1 #mytank碰撞 ifself.tank.live==True: ifself.tank.hitTank(): self.life-=1 ifself.life<=0: self.tank.live=False else:self.tank=Tank(self.screen,275,450) #mytanke碰撞子弹 ifself.tank.live==True: ifself.tank.hitShell(): self.life-=1 ifself.life<=0: self.tank.live=False else:self.tank=Tank(self.screen,275,450) #敌方子弹击中我方坦克 #游戏结束 ifself.life<=0: self.gotGamePrint() forenemyinself.enemylist: enemy.move() print('move') enemy.display() #添加敌方子弹 self.cnt+=1 ifself.cnt%100==0: forenemyinself.enemylist: self.enemyshells.append(enemy.fire()) #判断敌方子弹碰撞 forenemyshellinself.enemyshells: f=enemyshell.move() enemyshell.display() iff: self.enemyshells.remove(enemyshell) iflen(self.enemylist)<6: self.enemylist.append(EnmeyTank(self.screen)) self.screen.blit(self.getGrade(),(5,5)) self.tank.display() pygame.display.update() time.sleep(0.02) defget_event(self): foreventinpygame.event.get(): ifevent.type==KEYDOWN: ifevent.key==K_SPACE: self.myshells.append(self.tank.fire()) ifevent.key==K_ESCAPE: pass defgetGrade(self): text=pygame.font.Font('./font/msyhbd.ttc',20).render("分数:{}生命:{}".format(self.grade,self.life),True,(0,255,0)) returntext defgotGamePrint(self): text=pygame.font.Font('./font/msyh.ttc',70).render('gameover!',True,(0,255,0)) self.screen.blit(text,(100,200)) classShell: width=48 height=48 live=True speed=3 def__init__(self,screen,tank): self.screen=screen self.image=pygame.image.load('./images/3.png') self.direction=tank.direction self.rect=self.image.get_rect() self.rect.left=tank.rect.left+(tank.width-self.width)/2.0+18 #print(tank.rect.left,tank.width,self.width) self.rect.top=tank.rect.top+(tank.height-self.height)/2.0 self.live=True defmove(self): tag=self.isObstacle() ifself.live==True: ifself.direction=='L'andself.directionnotintag: self.rect.left-=self.speed elifself.direction=='R'andself.directionnotintag: self.rect.left+=self.speed elifself.direction=='U'andself.directionnotintag: self.rect.top-=self.speed elifself.direction=='D'andself.directionnotintag: self.rect.top+=self.speed else: pass ifself.directionintag: returnTrue else: returnFalse else: pass defdisplay(self): #print(self.rect.left,self.rect.top) ifself.live==True: self.screen.blit(self.image,self.rect) defisObstacle(self): tag=[] ifself.rect.left<=0:tag.append('L') ifself.rect.left+self.width>=MyTank.width:tag.append('R') ifself.rect.top<=0:tag.append('U') ifself.rect.top+self.height>=MyTank.heights:tag.append('D') returntag defhitTank(self): hitList=pygame.sprite.spritecollide(self,MyTank.enemylist,False) foreinhitList: e.live=False MyTank.enemylist.remove(e) self.live=False returnTrue returnFalse defhitMytank(self): hitList=pygame.sprite.spritecollide(self,MyTank.tank,False) foreinhitList: e.live=False MyTank.life-=1 returnTrue classBaseTank: width=50 height=50 direction='U' live=True time=0 images={} def__init__(self,screen,left,top): self.screen=screen self.images['L']=pygame.image.load("images/04.jpg") self.images['R']=pygame.image.load("images/02.jpg") self.images['U']=pygame.image.load("images/01.jpg") self.images['D']=pygame.image.load("images/03.jpg") self.image=self.images[self.direction] self.rect=self.image.get_rect() self.rect.left=left self.rect.top=top self.live=True#坦克是否被消灭 defisObstacle(self): tag=[] ifself.rect.left<=0:tag.append('L') ifself.rect.left+self.width>=MyTank.width:tag.append('R') ifself.rect.top<=0:tag.append('U') ifself.rect.top+self.height>=MyTank.heights:tag.append('D') returntag defdisplay(self): ifself.live==True: self.image=self.images[self.direction] self.screen.blit(self.image,self.rect) deffire(self): m=Shell(self.screen,self) returnm classTank(BaseTank): images={} def__init__(self,screen,left,top): super().__init__(screen,275,450) self.screen=screen self.speed=2 self.images['L']=pygame.image.load('./images/4.jpg') self.images['R']=pygame.image.load('./images/2.jpg') self.images['U']=pygame.image.load('./images/1.jpg') self.images['D']=pygame.image.load('./images/3.jpg') self.image=self.images[self.direction] self.rect=self.image.get_rect() self.rect.top=top self.rect.left=left defmove(self,direction): ifself.live==True: tag=self.isObstacle() ifdirection==self.direction: ifself.direction=='L'andself.directionnotintag: self.rect.left-=self.speed elifself.direction=='R'andself.directionnotintag: self.rect.left+=self.speed elifself.direction=='U'andself.directionnotintag: self.rect.top-=self.speed elifself.direction=='D'andself.directionnotintag: self.rect.top+=self.speed else: pass else: self.direction=direction defhitTank(self): hitList=pygame.sprite.spritecollide(self,MyTank.enemylist,False) foreinhitList: self.live=False returnTrue returnFalse defhitShell(self): hitlist=pygame.sprite.spritecollide(self,MyTank.enemyshells,False) foreinhitlist: self.live=False returnTrue returnFalse classEnmeyTank(BaseTank): speed=1 def__init__(self,screen): super().__init__(screen,randint(1,5)*100,0) self.getdirection() self.step=0 defgetdirection(self): self.direction=['L','R','U','D'][randint(0,3)] defmove(self): ifself.live==True: ifself.step==0or(self.directioninself.isObstacle()): self.getdirection() self.step=randint(0,200) else: tag=self.isObstacle() ifself.direction=='L'andself.directionnotintag: self.rect.left-=self.speed elifself.direction=='R'andself.directionnotintag: self.rect.left+=self.speed elifself.direction=='U'andself.directionnotintag: self.rect.top-=self.speed elifself.direction=='D'andself.directionnotintag: self.rect.top+=self.speed else: pass self.step-=1 if__name__=='__main__': main=MyTank() main.startgame()
文件主要有10张图片和2个字体文件,主坦克的四个形态,敌方坦克的四个形态,以及子弹等,10张图片。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。