python飞机大战代码 pygame
这是我最近学习python学到的一些知识,与大家进行一个分享,发现有部分刚开始学习python的朋友还是会遇到很多问题,我将代码整理好了,保证能够运行。
代码分为主程序和子程序,主要是面对对象编程。但是还是有很多细节没有写完。不过不影响参考和学习。
主要实现的功能有左右移动和空格发射子弹。
#子程序
import pygame
import pygame.locals as lc
import random
import math
def key_control(Her_obj):
'''
键盘控制对象的函数
:param Her_obj: 需要控制的对象
:return:
'''
eventlist = pygame.event.get()
for event in eventlist:
if event.type == lc.QUIT:
print('quit!')
exit()
pass
elif event.type == lc.KEYDOWN:
if event.key == lc.K_LEFT or event.key == lc.K_a:
# print('left!')
Her_obj.moveLeft()
elif event.key == lc.K_RIGHT or event.key == lc.K_d:
# print('right!')
Her_obj.moveRight()
elif event.key == lc.K_SPACE:
# print('shoot!')
Her_obj.shootBullet()
elif event.key == lc.K_ESCAPE:
print('quit!')
exit()
class HeroPlane:
def __init__(self,screen, x=0, y=450, loadRoute='hero.png'):
'''
飞机初始化
:param screen:
:param x:
:param y:
'''
self.screen = screen
self.x = x
self.y = y
self.image = pygame.image.load(loadRoute)
self.bulletList = []
self.disbulet = 0
pass
def moveLeft(self):
'''飞机左移'''
if self.x >= 10:
self.x -= 10
pass
def moveRight(self):
'''飞机右移'''
if self.x <= 320:
self.x += 10
pass
def display(self, bulet_rate=30):
'''飞机显示'''
self.screen.blit(self.image, (self.x, self.y))
if self.disbulet == bulet_rate:
for num, item in enumerate(self.bulletList):
if item.delete(upOrDown=True):
del self.bulletList[num]
for bullet in self.bulletList:
bullet.display()
bullet.moveAhead(upOrDown=True)
self.disbulet = 0
else:
for bullet in self.bulletList:
bullet.display()
self.disbulet += 1
pass
def shootBullet(self):
'''发射子弹'''
newBullet = bullet(self.screen, self.x, self.y,loadRoute='bullet.png')
self.bulletList.append(newBullet)
class bullet:
def __init__(self,screen, x, y, loadRoute='bullet.png'):
self.x = x + 13
self.y = y - 20
self.screen = screen
self.image = pygame.image.load(loadRoute)
pass
def display(self):
self.screen.blit(self.image,(self.x, self.y))
pass
def moveAhead(self, upOrDown=True):
if upOrDown == True:
self.y -= 1
else:
self.y += 1
pass
def delete(self, upOrDown=True):
if upOrDown == True:
if self.y < 0:
return True
else:
return False
else:
if self.y > 500:
return True
else:
return False
class enemyPlane:
def __init__(self, screen, x=0, y=0, loadRoute='enemy0.png'):
'''
敌方飞机初始化
:param screen:
:param x:
:param y:
'''
self.screen = screen
self.x = x
self.y = y
self.image = pygame.image.load(loadRoute)
self.bulletList = []
self.disbulet = 0
pass
def moveLeft(self):
'''飞机左移'''
if self.x >= 10:
self.x -= 10
pass
def moveRight(self):
'''飞机右移'''
if self.x <= 320:
self.x += 10
pass
def display(self, bulet_rate=5):
'''飞机显示'''
self.screen.blit(self.image, (self.x, self.y))
if self.disbulet == bulet_rate:
for num, item in enumerate(self.bulletList):
if item.delete(upOrDown=False):
del self.bulletList[num]
for bullet in self.bulletList:
bullet.display()
bullet.moveAhead(upOrDown=False)
self.disbulet = 0
else:
for bullet in self.bulletList:
bullet.display()
self.disbulet += 1
pass
def shootBullet(self):
'''发射子弹'''
newBullet = bullet(self.screen, self.x-6, self.y+35, loadRoute='bullet1.png')
self.bulletList.append(newBullet)
def control(self, shoot_probability=0.0004):
if random.random() < shoot_probability:
self.shootBullet()
if random.random() < 0.0007:
if random.random() < 0.5:
self.moveLeft()
else:
self.moveRight()
def judge_win(heroPlane, enemyPlane):
'''
判断胜负
:param heroPlane:
:param enemyPlane:
:return: 返回 True 代表赢, 返回 False 代表输, None 代表未结束
'''
'''判断我方子弹和敌方飞机'''
pos1 = (enemyPlane.x, enemyPlane.y)
for item in heroPlane.bulletList:
pos0 = (item.x, item.y)
if distance(pos0, pos1) < 10:
print('you win the game !')
return True
'''判断敌方子弹和我方飞机'''
pos1 = (heroPlane.x, heroPlane.y)
for item in enemyPlane.bulletList:
pos0 = (item.x, item.y)
if distance(pos0, pos1) < 15:
print('you lose the game ! \nloser!!!!!')
return False
def distance(pos0, pos1):
m = (pos0[0]-pos1[0])**2 + (pos0[1]-pos1[1])**2
return math.sqrt(m)
def press_end():
eventlist = pygame.event.get()
for event in eventlist:
if event.type == lc.KEYDOWN:
exit()
pass
#主程序
import pygame
import pygame.locals as lc
import subfunction as sf
import random
def main():
screen = pygame.display.set_mode((350,500)) #设定窗口大小
background = pygame.image.load('02.JPG') #建立图片背景对象
pygame.display.set_caption('plane game') #设置标题
pygame.mixer.init() #添加音乐 初始化
pygame.mixer.music.load('music.mp3') #加入音乐
pygame.mixer.music.set_volume(0.2) #设置音量
pygame.mixer.music.play(-1) #循环次数
'''载入玩家飞机图片'''
hero = sf.HeroPlane(screen, x=170, y=450, loadRoute='hero.png')
enemy = sf.enemyPlane(screen, x=random.randint(0,330), y=0, loadRoute='enemy0.png')
'''设置显示内容'''
while True:
screen.blit(background, (0, 0)) # 设定要显示的内容 背景显示
'''控制敌机'''
enemy.display(bulet_rate=20)
enemy.control(shoot_probability=0.0004)
'''控制我方飞机'''
hero.display(bulet_rate=10) #显示飞机
sf.key_control(hero)
pygame.display.update() #更新要显示的内容
'''判断游戏是否结束'''
out = sf.judge_win(heroPlane=hero, enemyPlane=enemy)
if out != None:
break
if out:
background1 = pygame.image.load('win.png')
else:
background1 = pygame.image.load('lose.png')
print('按任意键退出!')
while True:
screen.blit(background1, (0, 0))
pygame.display.update()
sf.press_end()
pass
if __name__ == "__main__":
main()
这里只需要运行main函数就可以运行程序
上面是一些里面使用的图片。大家可以下载,命名分别为win.png, enemy0.png, bullet.png, 02.jpg,lose.png,hero.png,bullet1.png.
大家保存带同一个目录下面就可以直接使用。