一、步骤
1.创建游戏循环
代码如下(示例):
while True:
.
.
.
pygame.quit()
2.将背景图片加载到窗口并且刷新
代码如下(示例):
screen.blit(bg_img, (0, 0))
clock.tick(60)
3.飞机移动
代码如下(示例):
# region 事件监听
event_list = pygame.event.get()
#飞机移动
for event in event_list:
if event.type == pygame.QUIT: # 加入QUIT模块不卡
pygame.quit() # 卸载模块
exit(0) # 正常退出
# 控制飞机移动
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT: # 左移动
hero_x -= 5 if hero_x >= 5 else 0
elif event.key == pygame.K_RIGHT: # 右移动
hero_x += 5 if hero_x <= 375 else 380
elif event.key == pygame.K_UP: # 上移动
hero_y -= 5 if hero_y >= 5 else 0
elif event.key == pygame.K_DOWN: # 下移动
hero_y += 5 if hero_y <= 421 else 526
elif event.key == pygame.K_SPACE:
# 创建 战斗子弹的实例
hero_bullet = HeroBullet(screen=screen, x=hero_x + 50 - 11, y=hero_y - 22)
# 将子弹转到列表内
hero_bullet_list.append(hero_bullet)
# 定义飞机位置
hero_rect = pygame.rect.Rect(hero_x, hero_y, 100, 124)
4.子弹移动
代码如下(示例):
if direct=='左':
enemy_x-=5
if enemy_x<=0:
direct='右'
elif direct=='右':
enemy_x+=5
if enemy_x>=315:
direct='左'
# 敌机随机发射子弹
x = random.randint(0, 100)
if x ==1 or x==99:
# 创建 战斗子弹的实例
enemy_bullet = EnemyBullet(screen=screen, x=enemy_x +50, y=246)
# 将子弹转到列表内
enemy_bullet_list.append(enemy_bullet)
#遍历敌机发射子弹
for bullet in enemy_bullet_list:
bullet.draw()
enemy_bullet_rect=pygame.rect.Rect(bullet.x,bullet.y,22,22)
for z in hero_bullet_list:
z.draw() # 绘制子弹 子弹已经成立 出来了
# 让子弹再上边消失 为了不让子弹出窗口
hero_bullet_list.remove(z) if z.y < 0 else ""
# 子弹的位置
hero_bullet_rect = pygame.rect.Rect(z.x, z.y, 22, 22)
flag=pygame.Rect.colliderect(hero_bullet_rect,enemy_rect)
if flag:
enemy_is_bomb = True
hero_bullet_list.remove(z)
5.子弹与飞机交互,飞机爆炸
代码如下(示例):
#判断敌机发射的子弹是否与飞机交互
flag1 = pygame.Rect.colliderect(enemy_bullet_rect,hero_rect)
# 判断 是否满足 子弹与敌机交互
if flag1:
hero_is_bomb = True # 满足了 爆炸条件
enemy_bullet_list.remove(bullet) # 打到了则消失
if hero_is_bomb == False:
# 绘制敌机图片
if heroindex==0:
screen.blit(hero1_img, (hero_x, hero_y))
heroindex+=1
else:
#将飞机图片渲染
screen.blit(hero2_img,(hero_x,hero_y))
heroindex=0
elif hero_is_bomb==True:
if hero_bomb_index==len(hero_bomb_list):
print('你输了')
pygame.quit()
exit(0)
#加载图片
hero_bomb_img=pygame.image.load(hero_bomb_list[hero_bomb_index])
#爆炸 索引+1
hero_bomb_index+=1
#绘制
screen.blit(hero_bomb_img,(hero_x,hero_y))
#爆炸慢动作
time.sleep(0.2)
if enemy_is_bomb == False:
screen.blit(enemy1_img, (enemy_x, enemy_y))
else:
if enemy_bomb_index == len(enemy_bomb_list):
print('游戏结束你赢了')
pygame.quit()
exit(0)
enemy_bomb_img = pygame.image.load(enemy_bomb_list[enemy_bomb_index])
screen.blit(enemy_bomb_img, (enemy_x, enemy_y))
enemy_bomb_index += 1
time.sleep(0.3)
pygame.display.update()
6.总代码:
代码如下(示例):
import pygame
import random
import time
#定义飞机子弹
class HeroBullet():
def __init__(self,x,y,screen):
# 初始化x轴
self.x=x
# 初始化y轴
self.y=y
# 初始化screen窗口
self.screen=screen
# 初始化子弹
self.hero_bullet_img=pygame.image.load("img/bullet.png")
def draw(self):
# 绘制子弹
self.screen.blit(self.hero_bullet_img, (self.x, self.y))
self.move()
def move(self):
# 子弹移动
self.y -= 5
class EnemyBullet():
def __init__(self,x,y,screen):
self.x=x
self.y=y
self.screen=screen
self.enemy_bullet_img=pygame.image.load("img/bullet1.png")
def draw(self):
self.screen.blit(self.enemy_bullet_img, (self.x, self.y))
self.move()
def move(self):
self.y += 5
#初始化pygame
pygame.init()
#创建游戏窗口
screen=pygame.display.set_mode((480,650))
#修改游戏名称
pygame.display.set_caption('飞机大战')
#修改游戏图标
icon=pygame.image.load('img/icon72x72.png')
pygame.display.set_icon(icon)
#加载背景图片
bg_img=pygame.image.load('img/background.png')
#加载飞机图片
hero1_img=pygame.image.load('img/hero1.png')
hero2_img=pygame.image.load('img/hero2.png')
#定义飞机的爆炸图片列表
hero_bomb_list=["img/hero_blowup_n1.png","img/hero_blowup_n2.png","img/hero_blowup_n3.png","img/hero_blowup_n4.png"]
# 定义飞机图片切换索引
heroindex = 0
hero_x=190
hero_y=526
#加载敌机图片
enemy1_img=pygame.image.load('img/enemy-3.gif')
enemy_bomb_list=["img/enemy2_down1.png", "img/enemy2_down2.png","img/enemy2_down3.png","img/enemy2_down4.png",'img/enemy2_down5.png','img/enemy2_down6.png']
#定义敌机初始值
#定义敌机位置
enemy_rect=pygame.rect.Rect(158,0,165,250)
#定义敌机初始移动方向
direct='左'
#定义飞机子弹列表
hero_bullet_list=[]
#定义敌机子弹列表
enemy_bullet_list=[]
#创建游戏时钟
clock=pygame.time.Clock()
# 灵敏度
pygame.key.set_repeat(20, 30)
enemy_is_bomb = False
hero_is_bomb = False
enemy_bomb_index = 0
hero_bomb_index=0
enemy_x=enemy_rect.x
enemy_y=enemy_rect.y
#游戏循环
while True:
#刷新率
clock.tick(60)
# 将背景图片加载到窗口
screen.blit(bg_img, (0, 0))
# region 事件监听
event_list = pygame.event.get()
#敌机移动
for event in event_list:
if event.type == pygame.QUIT: # 加入QUIT模块不卡
pygame.quit() # 卸载模块
exit(0) # 正常退出
# 控制飞机移动
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT: # 左移动
hero_x -= 5 if hero_x >= 5 else 0
elif event.key == pygame.K_RIGHT: # 右移动
hero_x += 5 if hero_x <= 375 else 380
elif event.key == pygame.K_UP: # 上移动
hero_y -= 5 if hero_y >= 5 else 0
elif event.key == pygame.K_DOWN: # 下移动
hero_y += 5 if hero_y <= 421 else 526
elif event.key == pygame.K_SPACE:
# 创建 战斗子弹的实例
hero_bullet = HeroBullet(screen=screen, x=hero_x + 50 - 11, y=hero_y - 22)
# 将子弹转到列表内
hero_bullet_list.append(hero_bullet)
# 定义飞机位置
hero_rect = pygame.rect.Rect(hero_x, hero_y, 100, 124)
if direct=='左':
enemy_x-=5
if enemy_x<=0:
direct='右'
elif direct=='右':
enemy_x+=5
if enemy_x>=315:
direct='左'
# 敌机随机发射子弹
x = random.randint(0, 100)
if x ==1 or x==99:
# 创建 战斗子弹的实例
enemy_bullet = EnemyBullet(screen=screen, x=enemy_x +50, y=246)
# 将子弹转到列表内
enemy_bullet_list.append(enemy_bullet)
#遍历敌机发射子弹
for bullet in enemy_bullet_list:
bullet.draw()
enemy_bullet_rect=pygame.rect.Rect(bullet.x,bullet.y,22,22)
#判断敌机发射的子弹是否与飞机交互
flag1 = pygame.Rect.colliderect(enemy_bullet_rect,hero_rect)
# 判断 是否满足 子弹与敌机交互
if flag1:
hero_is_bomb = True # 满足了 爆炸条件
enemy_bullet_list.remove(bullet) # 打到了则消失
if hero_is_bomb == False:
# 绘制敌机图片
if heroindex==0:
screen.blit(hero1_img, (hero_x, hero_y))
heroindex+=1
else:
#将飞机图片渲染
screen.blit(hero2_img,(hero_x,hero_y))
heroindex=0
elif hero_is_bomb==True:
if hero_bomb_index==len(hero_bomb_list):
print('你输了')
pygame.quit()
exit(0)
#加载图片
hero_bomb_img=pygame.image.load(hero_bomb_list[hero_bomb_index])
#爆炸 索引+1
hero_bomb_index+=1
#绘制
screen.blit(hero_bomb_img,(hero_x,hero_y))
#爆炸慢动作
time.sleep(0.2)
for z in hero_bullet_list:
z.draw() # 绘制子弹 子弹已经成立 出来了
# 让子弹再上边消失 为了不让子弹出窗口
hero_bullet_list.remove(z) if z.y < 0 else ""
# 子弹的位置
hero_bullet_rect = pygame.rect.Rect(z.x, z.y, 22, 22)
flag=pygame.Rect.colliderect(hero_bullet_rect,enemy_rect)
if flag:
enemy_is_bomb = True
hero_bullet_list.remove(z)
if enemy_is_bomb == False:
screen.blit(enemy1_img, (enemy_x, enemy_y))
else:
if enemy_bomb_index == len(enemy_bomb_list):
print('游戏结束你赢了')
pygame.quit()
exit(0)
enemy_bomb_img = pygame.image.load(enemy_bomb_list[enemy_bomb_index])
screen.blit(enemy_bomb_img, (enemy_x, enemy_y))
enemy_bomb_index += 1
time.sleep(0.3)
#更新
pygame.display.update()
#卸载pygame模块
pygame.quit()