面向对象学习之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张图片。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。