隕石動(dòng)效完成!從零開(kāi)始用Python編程制作飛機(jī)大戰(zhàn)游戲 P07
2023-01-28 17:24 作者:xiaotiaotiao2011 | 我要投稿

import pygame # 導(dǎo)入pygame import random # 導(dǎo)入random import os #bug:石頭無(wú)法旋轉(zhuǎn) # 設(shè)置常量,常量就是在python中不變的量 FPS = 60 # FPS是指幀數(shù),指在一秒內(nèi)運(yùn)行多少次 WIDTH = 500 HEIGHT = 600 WHITE = (255, 255, 255) # 這是一個(gè)RGB,R表示red,G表示green,B表示blue,數(shù)值是一個(gè)元組,必須帶括號(hào) GREEN = (0, 255, 0) RED = (225, 0, 0) YELLOW = (255, 255, 0) BLACK = (0, 0, 0) # 初始化pygame pygame.init() pygame.mixer.init() screen = pygame.display.set_mode( (WIDTH, HEIGHT)) # 創(chuàng)建一個(gè)窗口,寬為WIDTH常量,高為HEIGHT常量 clock = pygame.time.Clock() # 設(shè)置幀數(shù) background_img=pygame.image.load(os.path.join("img", "background.png")).convert() player_img=pygame.image.load(os.path.join("img","player.png")).convert() rock_img=pygame.image.load(os.path.join("img","rock.png")).convert() bullet_img=pygame.image.load(os.path.join("img","bullet.png")).convert() pygame.display.set_caption('plane_war') # 窗口標(biāo)題為字符串“plane_war”,引號(hào)是英文 hoot_sound=pygame.mixer.Sound(os.path.join("sound","shoot.wav")) expl_sounds=[pygame.mixer.Sound(os.path.join("sound","expl0.wav")), pygame.mixer.Sound(os.path.join("sound","expl1.wav"))] pygame.mixer.music.load(os.path.join("sound","background.ogg")) pygame.mixer.music.set_volume(0.3) class Player(pygame.sprite.Sprite): # 設(shè)置一個(gè)類,繼承父類pygame.sprite.Sprite def __init__(self): # 設(shè)置初始化內(nèi)容 pygame.sprite.Sprite.__init__(self) self.image = pygame.transform.scale(player_img,(50,40)) self.image.set_colorkey((BLACK)) self.rect = self.image.get_rect() # 獲取長(zhǎng)方形的矩形位置 self.rect.centerx = WIDTH/2 # 設(shè)置長(zhǎng)方形中心在x軸的中心 self.rect.bottom = HEIGHT-20 # 設(shè)置長(zhǎng)方形的底部在y軸的580位置 self.speedx = 8 # 設(shè)置每次移動(dòng)的像素(px) def update(self): # 定義update函數(shù) key_pressed = pygame.key.get_pressed() # 獲取鍵盤狀態(tài) # 判斷鍵盤狀態(tài) if key_pressed[pygame.K_RIGHT]: # 判斷鍵盤右鍵是否按下 self.rect.x += self.speedx if key_pressed[pygame.K_LEFT]: # 判斷鍵盤左鍵是否按下 self.rect.x -= self.speedx # 判斷位置 if self.rect.right > WIDTH: # 如果右邊的位置大于寬 self.rect.right = WIDTH if self.rect.left < 0: # 如果左邊小于寬 self.rect.left = 0 def shoot(self): bullet = Bullet(self.rect.centerx, self.rect.centery) all_sprites.add(bullet) bullets.add(bullet) hoot_sound.play( ) def k_shoot(self): for i in range(100): 偏差 = random.randrange(-250, 250) bullet = Bullet(self.rect.centerx+偏差, self.rect.centery) all_sprites.add(bullet) bullets.add(bullet) hoot_sound.play( ) class Rock(pygame.sprite.Sprite): # 設(shè)置一個(gè)類,繼承父類pygame.sprite.Sprite def __init__(self): # 設(shè)置初始化內(nèi)容 pygame.sprite.Sprite.__init__(self) self.image_origin=rock_img self.image_origin.set_colorkey(BLACK) self.image=self.image_origin.copy() self.big_or_small=random.randint(30,70) self.image = pygame.transform.scale(rock_img, (self.big_or_small, self.big_or_small)) self.image.set_colorkey((BLACK)) self.rect = self.image.get_rect() # 獲取長(zhǎng)方形的矩形位置 # 隨機(jī)生成位置和速度 try: self.rect.x = random.randint(0, WIDTH-self.rect.x) self.rect.y = random.randint(-40, -10) self.speedy = random.randint(2, 10) # 設(shè)置每次移動(dòng)的像素(px) self.speedx = random.randint(-3, 3) except: self.rect.x = random.randint(0, 470) self.rect.y = -10 self.speedy = random.randint(2, 10) self.speedx = random.randint(-3, 3) self.total_degree=0 self.rot_degree=random.randrange(-3,3) def rotate(self): self.total_degree+=3 self.total_degree%=360 self.image=pygame.transform.rotate(self.image_origin,self.rot_degree) center=self.rect.center self.rect=self.image.get_rect() self.rect.center=center def update(self): # 定義update函數(shù) self.rect.y += self.speedy # y軸增加 self.rect.x += self.speedx # x軸增加 if self.rect.top > HEIGHT or self.rect.left > WIDTH or self.rect.right < 0: try: self.rect.x = random.randint(0, WIDTH-self.rect.x) self.rect.y = random.randint(-40, -10) self.speedy = random.randint(2, 10) # 設(shè)置每次移動(dòng)的像素(px) self.speedx = random.randint(-3, 3) except: self.rect.x = random.randint(0, 470) self.rect.y = -10 self.speedy = random.randint(2, 10) self.speedx = random.randint(-3, 3) class Bullet(pygame.sprite.Sprite): # 設(shè)置一個(gè)類,繼承父類pygame.sprite.Sprite def __init__(self, x, y): # 設(shè)置初始化內(nèi)容 pygame.sprite.Sprite.__init__(self) self.image =pygame.transform.scale(bullet_img,(5,20)) # 創(chuàng)建一個(gè)寬10,高20的長(zhǎng)方形,數(shù)值為數(shù)組 self.image.set_colorkey(BLACK) self.rect = self.image.get_rect() self.rect.x = x self.rect.y = y self.speedy = -10 # 速度-10 def update(self): # 定義update函數(shù) self.rect.y += self.speedy # y軸增加 if self.rect.bottom < 0: self.kill() # 隱藏 all_sprites = pygame.sprite.Group() # 創(chuàng)建一個(gè)所有精靈列表 rocks = pygame.sprite.Group() bullets = pygame.sprite.Group() player = Player() all_sprites.add(player) pygame.mixer.music.play(-1) for i in range(8): rock = Rock() all_sprites.add(rock) rocks.add(rock) running = True # 設(shè)running為布爾值True,表示真 # 主循環(huán) while running: clock.tick(FPS) # 設(shè)置幀數(shù)為60/s for event in pygame.event.get(): # 判斷窗口狀態(tài) if event.type == pygame.QUIT: # 檢測(cè)窗口是否關(guān)閉 running = False # 如果是,將running設(shè)為False,停止判斷 elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE: player.shoot() if event.key==pygame.K_k: player.k_shoot() # 更新游戲 all_sprites.update() hits_rockandbullet = pygame.sprite.groupcollide( rocks, bullets, True, True) # 檢測(cè)子彈與隕石是否碰撞 for hit in hits_rockandbullet: # 打中一個(gè)再生成一個(gè) random.choice(expl_sounds).play() r = Rock() all_sprites.add(r) rocks.add(r) # 顯示畫面 hits_rockandbullet=pygame.sprite.spritecollide(player,rocks,False) if hits_rockandbullet: running=False#True screen.fill(BLACK) screen.blit(background_img,(0,0)) all_sprites.draw(screen) pygame.display.update() # 窗口刷新 pygame.quit()
標(biāo)簽: