import random
import pygame
import math
# 1.初始化界面
pygame.init()
screen = pygame.display.set_mode((800, 600)) # 設定顯示視窗大小--引數是元組(寬,高)
pygame.display.set_caption("JerkOff ") # 設定標題
# 加圖示
icon = pygame.image.load("ufo.png")
pygame.display.set_icon(icon)
# 加背景圖
bgImg = pygame.image.load("bg.png")
# 添加背景音效
pygame.mixer.music.load("bg.wav")
pygame.mixer.music.play(-1) # -1 單曲回圈一直不停
# 添加射中音效
bao_sound = pygame.mixer.Sound("exp.wav")
# 加飛機
playerImg = pygame.image.load("player.png")
# 飛機是移動的,位置定義成變數
playerX = 350
playerY = 500
playerStep = 0 # 移動步長(速度) 右移大于0,左移小于0(-5) 開始初始值為0 回圈不動,否則自己就會移動
# 添加多個敵人
number_of_enemies = 6
# 分數
score = 0
font = pygame.font.Font("freesansbold.ttf", 32) # 自帶字體不支持中文
# font = pygame.font.SysFont("simsunnsimsun",40) # 系統自帶字體
def show_score():
text = f"score:{score}" # f讓{}里面直接顯示變數
score_render = font.render(text, True, (255, 255, 255)) # render渲染也就是顯示 text顯示的文字 True24位顏色 三原色三元組()--用三種基本的顏色紅綠藍
screen.blit(score_render, (10, 10))
class Enemy(object):
"""
敵人類:創建讀個物件,產生多個敵人
"""
def __init__(self, enemy_type):
self.enemy_type = enemy_type
if self.enemy_type == 0:
self.img = pygame.image.load("enemy.png")
else:
self.img = pygame.image.load("enemy2.png")
self.x = random.randint(200, 600)
self.y = random.randint(50, 250)
self.step = random.randint(2, 6) # 敵人移動得速度
self.life = 60 # 血量
def show_enemy(self):
screen.blit(self.img, (self.x, self.y))
self.x += self.step
if self.life > 0:
self.blood()
# 控制敵人不出界
if self.x > 800 - 64 or self.x < 0: # 右邊界
self.step *= -1
self.y += 40
def reset(self):
"""敵人被擊中,重新開始"""
self.life -= 10
if self.life == 0:
self.x = random.randint(200, 600)
self.y = random.randint(50, 250)
self.life = 60
def blood(self):
"""血量"""
pygame.draw.rect(screen, (0, 255, 0), (self.x + 2, self.y, self.life, 2))
enemies = []
for i in range(number_of_enemies):
enemies.append(Enemy(random.randint(0, 2)))
class Bullet(object):
"""
子彈類:創建讀個物件,產生多個子彈(連發)
"""
def __init__(self):
self.img = pygame.image.load("bullet.png")
self.x = playerX + 16 # (64-32)/2
self.y = playerY + 10
self.step = 10 # 子彈移動的速度
def show_bullet(self):
screen.blit(self.img, (self.x, self.y))
self.y -= self.step
def hit(self):
"""擊中敵人"""
global score
for e in enemies:
if distance(self.x, self.y, e.x, e.y) < 30:
# 射中了
bullets.remove(self)
bao_sound.play()
if e.enemy_type == 0:
score += 50
else:
score += 100
e.reset() # 恢復位置
bullets = [] # 保存現有子彈,子彈可能飛出邊界
def process_events():
"""監視鍵盤動作"""
global playerStep
global running
for event in pygame.event.get(): # 把所有用戶的操作回傳來,比如敲鍵盤、打字等
if event.type == pygame.QUIT: # 事件型別 如關閉它或敲了鍵盤的某個健
running = False
# 通過鍵盤事件控制飛機移動
if event.type == pygame.KEYDOWN: # 按下鍵盤 移動
if event.key == pygame.K_RIGHT: # 向右的方向鍵
playerStep = 5
elif event.key == pygame.K_LEFT: # 向左的方向健
playerStep = -5
elif event.key == pygame.K_SPACE: # 空格健,發送子彈
# 創建一枚子彈
bullets.append(Bullet())
if event.type == pygame.KEYUP: # 鍵盤抬起 不移動
playerStep = 0
# 游戲結束
is_over = False
over_font = pygame.font.Font("freesansbold.ttf", 32)
def check_is_over():
if is_over:
text = f"game is over" # f讓{}里面直接顯示變數
score_render = over_font.render(text, True,
(255, 0, 0)) # render渲染也就是顯示 text顯示的文字 True24位顏色 三原色三元組()--用三種基本的顏色紅綠藍
screen.blit(score_render, (300, 300))
def show_enemy_bullet():
global is_over
"""顯示多個敵人,顯示多枚子彈"""
for e in enemies:
e.show_enemy()
# 游戲結束
if e.y > 500 - 64:
# 敵人飛出界面
is_over = True
print("游戲結束了")
enemies.clear()
for b in bullets:
b.show_bullet()
b.hit()
# 子彈飛出界面
if b.y < 0:
bullets.remove(b)
def distance(bx, by, ex, ey):
x = bx - ex
y = by - ey
return math.sqrt(x * x + y * y)
def move_player():
"""移動玩家"""
global playerX, playerY, playerStep
screen.blit(playerImg, (playerX, playerY)) # 把飛機畫在screen上
playerX += playerStep
# 控制飛機不出界
if playerX > 800 - 64: # 右邊界
playerX = 800 - 64
if playerX < 0: # 左邊界
playerX = 0
# 2.游戲主回圈:游戲之所以有界面等在那里,是因為有個回圈在那里
running = True
while running: # 此句下面什么也不加 界面就會卡在那里,什么也做不了,所以用event
screen.blit(bgImg, (0, 0)) # 把背景圖畫在screen上 坐標(0,0) 左上角0,0,先畫背景,要不然會被蓋住
process_events()
move_player()
show_enemy_bullet()
show_score()
check_is_over()
pygame.display.update() # 界面更新,這樣畫完的東西才能顯示出來
# 3.接下來就是在while里畫畫,每一幀里鋪上不同的畫
注意:圖片和各種音效的地址,上文代碼結構如下:

素材:飛機大戰素材外星人、音效、飛機.rar-游戲開發檔案類資源-CSDN文庫
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/351125.html
標籤:其他
