mport pygame
import random
from sys import exit #向sys模塊借用個exit函數來退出程序
定義一個敵機類
class Enemy:
def restar(self): #重置敵機位置與速度 self.x=random.randint(100,600) self.y=random.randint(-200,-80) self.speed=random.random()+0.4 def __init__(self): self.restar() self.image=pygame.image.load('enermy.jpg') def move(self): if self.y < 800: self.y+=self.speed #向下移動 else: self.restar()
定義一個bullet類,封裝子彈相關的數據和方法
class Bullet:
def __init__(self): self.x=0; self.y=-1; self.image=pygame.image.load('bulet.jpg') self.active=False #默認不激活子彈 def move(self): #激活狀態下,向上移動 if self.active: self.y-=0.8 #擋飛出屏幕,設為不激活 if self.yenemy.x and bullet.x < enemy.x + enemy.image.get_width()) and ( bullet.y > enemy.ywww.cungun.com and bullet.y < enemy.y + enemy.image.get_height() ): enemy.restar(); bullet.active=False return True return False
class Plane:
def restar(self): self.x=200 self.y=600 def __init__(self): self.restar() self.image=pygame.image.load('plane.jpg') def move(self): x, y = pygame.mouse.get_pos(); # 跟隨鼠標移動 x -= self.image.get_width() / 2; y -= self.image.get_height() / 2; self.x=x; self.y=y
def checkcrash(enemy, plane):
if (plane.x + 0.7*plane.image.get_width() > enemy.x) and ( plane.x + 0.3*plane.image.get_width() < enemy.x + enemy.image.get_width()) and ( plane.y + 0.7*plane.image.get_height() > enemy.y) and ( plane.y + 0.3*plane.image.get_width() < enemy.y + enemy.image.get_height() ): return True return False
pygame.init()
screen=pygame.display.set_mode((1000,700),0,32) #創建一個窗口
pygame.display.set_caption('xwr!')#設置窗口標題
background=pygame.image.load('pygame.jpg') #加載並轉換圖像
plane=Plane()#加載飛機游戲圖像
bullets=[]#創建子彈的list
for i in range(5):
bullets.append(Bullet()) #向list添加5發子彈
count_b=len(bullets)#子彈總數
index_b=0 #即將激活的子彈序號
interval_b=0#發射子彈的間隔
enemies=[]
for e in range(5):
enemies.append(Enemy())
gameover = False
分數
score = 0
用以顯示文字的font變量
font = pygame.font.Font(None, 32)
while True: #游戲主循環函數
for event in pygame.event.get():
if event.type==pygame.QUIT: #接收到退出事件后退出程序 pygame.quit() exit() if gameover and event.type==pygame.MOUSEBUTTONUP: plane.restar() for e in enemies: e.restar() for b in bullets: b.restar() score=0; gameover=False screen.blit(background, (0, 0)) # 將背景圖畫上去 if not gameover: interval_b-=1 #發射間隔遞減 if interval_b<0: #激活一發子彈 bullets[index_b].restar() interval_b=80 #重置間隔時間 index_b=(index_b+1)%count_b#子彈序號周期性遞增 for b in bullets: #處於激活狀態的子彈,移動位置並繪制 if b.active: for e in enemies: if checkhit(e,b): score+=100