圖片:(5張,子彈是白色,不明顯)
代碼:
"""
__project_ = 'python'
__file_name__ = 'python實戰'
__author__ = 'Administrator'
__time__ = '2019/12/17 8:38'
__product_name = PyCharm
"""
'''
完成“飛機大戰遊戲“以下要求
1.實現背景精靈類和相關邏輯,背景可正常移動,加載合適的資源圖片
2.實現飛機精靈類和相關邏輯,添加飛機發射子彈的方法shoot,加載合適的資源圖片
3.實現普通敵機精靈類和相關邏輯,添加敵機類的生命值屬性,加載合適的資源圖片
4.實現加強版敵機精靈類和相關邏輯,加載合適的資源圖片(圖片可以和飛機圖片相同)
5.實現子彈精靈類和相關邏輯,加載合適的資源圖片
6.實現隨機出現普通敵機或加強版敵機邏輯
7.實現敵機擊毀邏輯:普通敵機遇到子彈被擊毀,加強版敵將遇到5顆子彈被擊毀
8.實現空格鍵一次發射5顆同方向的子彈邏輯
9.實現s鍵一次發送5顆不同方向的子彈邏輯
10.實現遊戲邏輯,可進行遊戲
註釋簡介清晰,編碼規範,程序功能完整,無bug
拓展: 30秒只可以使用8次散彈 步驟9方法
time.clock()計算時間方法
'散彈時間機制'
now_clock = mytime.clock()
if now_clock - self.fire_h_clock < 30:
if self.fire_h_count<8:
self.fire_h_count+=1
self.myplane.shoot_H()
else:
pass# '不能發射子彈'
else:
self.fire_h_clocks = now_clock
self.myplane.shoot_H()
self.fire_h_count = 1
'''
import pygame
import random
import time as mytime
SCREEN_RECT = pygame.Rect(0, 0, 331,587) # 遊戲窗口大小
FRAME_PER_SER = 60 # 幀率
CREATE_ENMY_EVENT = pygame.USEREVENT # 創建敵機事件ID
PLANE_FIRE_EVENT = pygame.USEREVENT + 1 # 自動開火事件ID
# 重寫精靈類
class GameSprite(pygame.sprite.Sprite):
def __init__(self, image_name, speed=1):
''
super().__init__()
# 添加圖片屬性image、大小rect和速度 speed屬性
self.image = pygame.image.load(image_name)
self.rect = self.image.get_rect()
self.speed = speed
def update(self, *args):
super().update(*args)
self.rect.y += self.speed
# 實現背景精靈類和相關邏輯,
class Background(GameSprite):
def __init__(self, is_alt=False):
super().__init__('bg.png')
# 背景可正常移動,加載合適的資源圖片
if is_alt:
self.rect.y = SCREEN_RECT.height
def update(self, *args):
super().update(*args)
if self.rect.y > SCREEN_RECT.height:
self.rect.y = -SCREEN_RECT.height # 完成背景圖滾動
# 實現普通敵機精靈類和相關邏輯,
class Enemy(GameSprite):
def __init__(self, image_name='dj.png', lives=1):
# 添加敵機類的生命值屬性,加載合適的資源圖片
super().__init__(image_name)
self.speed = random.randint(1, 3) # 敵機速度,隨機1-3
self.lives = lives
# 敵機出現位置
self.rect.bottom = 0
max_x = SCREEN_RECT.width - self.rect.width
self.rect.x = random.randint(0, max_x)
def update(self, *args):
super().update(*args)
# # 實現敵機擊毀邏輯:普通敵機遇到子彈被擊毀,加強版敵將遇到5顆子彈被擊毀
if self.lives == 0: # 加強版敵將遇到5顆子彈被擊毀
self.kill()
if self.rect.y > SCREEN_RECT.height:
self.kill() # 敵機出屏幕銷燬
# 實現飛機精靈類和相關邏輯,
class Myplane(GameSprite):
def __init__(self):
super().__init__('fj.png')
self.rect.centerx = SCREEN_RECT.centerx
self.rect.bottom = SCREEN_RECT.bottom - 30
self.bullets = pygame.sprite.Group()
def update(self, *args):
# super().update(*args)
self.rect.x += self.speed
# 飛機不飛出屏幕
if self.rect.x < 0:
self.rect.x = 0
elif self.rect.right > SCREEN_RECT.right:
self.rect.right = SCREEN_RECT.right
# 添加飛機發射子彈的方法shoot,加載合適的資源圖片
def shoot(self):
# '子彈'
b = Bullet()
b.rect.bottom = self.rect.y - 20
b.rect.centerx = self.rect.centerx
self.bullets.add(b)
def shoot5(self):
'''8.實現空格鍵一次發射5顆同方向的子彈邏輯'''
for i in range(5):
b = Bullet()
b.rect.bottom = self.rect.y - 20 * i
b.rect.centerx = self.rect.centerx
self.bullets.add(b)
def shoot_H(self):
'''9.實現s鍵一次發送5顆不同方向的子彈邏輯'''
for i in range(-2, 3):
speed_h = i
b = Bullet(speed_h=speed_h)
b.rect.bottom = self.rect.y
b.rect.centerx = self.rect.centerx - 20 * i
self.bullets.add(b)
# 實現子彈精靈類和相關邏輯,
class Bullet(GameSprite):
def __init__(self, speed_h=0):
super().__init__('zd.png', -2) # 加載合適的資源圖片
self.speed_h = speed_h
def update(self, *args):
super().update(*args)
if self.speed_h != 0:
self.rect.x -= self.speed_h
if self.rect.bottom < 0:
self.kill() # 移出屏幕銷燬
class PlaneGame(object): # 遊戲類
def __init__(self):
self.screen = pygame.display.set_mode(SCREEN_RECT.size)
self.clock = pygame.time.Clock()
self.fire_h_clock = mytime.clock()
self.fire_h_count = 0
# 創建精靈
self.__create_sprites()
# 監聽
pygame.time.set_timer(CREATE_ENMY_EVENT, 1000)
pygame.time.set_timer(PLANE_FIRE_EVENT, 500)
# 設置標題-沒考覈
pygame.display.set_caption('飛機大戰-初級版')
def __create_sprites(self):
bg0 = Background()
bg1 = Background(True)
self.back_group = pygame.sprite.Group(bg0, bg1)
self.enemy_group = pygame.sprite.Group()
self.myplane = Myplane()
self.myplane_group = pygame.sprite.Group(self.myplane)
def start_game(self):
while True:
self.clock.tick(FRAME_PER_SER) # 刷新幀率
# 事件監聽
self.__event_handler()
# 檢查碰撞
self.__check_collid()
# 更新繪製
self.__update_sprites()
pygame.display.update()
def __event_handler(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
# PlaneGame.del結束遊戲
PlaneGame.game_over()
quit()
elif event.type == CREATE_ENMY_EVENT:
# 實現隨機出現普通敵機或加強版敵機邏輯
is_enemy = random.randint(0, 5)
if is_enemy < 4:
enemy = Enemy()
self.enemy_group.add(enemy)
else:
enemy = Enemy(image_name='fj0.png', lives=5)
self.enemy_group.add(enemy)
elif event.type == PLANE_FIRE_EVENT:
self.myplane.shoot()
keys = pygame.key.get_pressed()
if keys[32] and event.type == pygame.KEYDOWN:
'實現空格鍵一次發射5顆同方向的子彈邏輯'
self.myplane.shoot5()
elif keys[115] and event.type == pygame.KEYDOWN:
# '9.實現s鍵一次發送5顆不同方向的子彈邏輯'
#self.myplane.shoot_H()
#''''散彈時間機制'
now_clock = mytime.clock()
if now_clock - self.fire_h_clock < 30:
if self.fire_h_count<8:
self.fire_h_count+=1
self.myplane.shoot_H()
else:
pass# '不能發射子彈'
else:
self.fire_h_clock = now_clock
self.myplane.shoot_H()
self.fire_h_count = 1#'''
if keys[pygame.K_RIGHT]:
self.myplane.speed = 2
elif keys[pygame.K_LEFT]:
self.myplane.speed = -2
else:
self.myplane.speed = 0
def __check_collid(self):
# 實現敵機擊毀邏輯:普通敵機遇到子彈被擊毀,
res_dict = pygame.sprite.groupcollide(self.enemy_group, self.myplane.bullets, False, True)
for i in res_dict.keys():
count = len(res_dict[i])
i.lives -= count
enemies = pygame.sprite.spritecollide(self.myplane, self.enemy_group, True)
if len(enemies) > 0:
self.myplane.kill()
PlaneGame.game_over()
def __update_sprites(self):
self.back_group.update()
self.back_group.draw(self.screen)
self.enemy_group.update()
self.enemy_group.draw(self.screen)
self.myplane_group.update()
self.myplane_group.draw(self.screen)
self.myplane.bullets.update()
self.myplane.bullets.draw(self.screen)
@staticmethod
def game_over():
pygame.quit()
exit()
if __name__ == '__main__':
g = PlaneGame()
g.start_game()