Python飞机大战

1.0游戏基础部分

1.1 导入python包pygame

import pygame

1.2创建游戏窗口

pygame.init()
screan = pygame.display.set_mode((480, 500)

1.3 设置切换索引量和创建时钟

shitindex = 0
clock = pygame.time.Clock()

2.0加载游戏背景

2.1游戏背景图片加载

#循环外
bg_img = pygame.image.load("img/background.png")
#循环内
screan.blit(bg_img, (0, 0))

2.2游戏刷新频率

while True:
    clock.tick(60)

2.3设置窗口名称和窗口图标

#循环内
pygame.display.set_caption("飞机大战")
icon = pygame.image.load("img/icon.png")
pygame.display.set_icon(icon)

3.0英雄机部分

3.1设置英雄机位置和坐标

#循环外
hero_rect = pygame.rect.Rect(189, 374, 102, 126)
hero_PlaneX = hero_rect.x
hero_PlaneY = hero_rect.y

3.2导入英雄机图片

#循环外
hero_img1 = pygame.image.load("img/me1.png")
hero_img2 = pygame.image.load("img/me2.png")

#循环内
if shitindex == 0:
    screan.blit(hero_img1, (hero_PlaneX, hero_PlaneY))
    shitindex += 1
else:
    screan.blit(hero_img2, (hero_PlaneX, hero_PlaneY))
    shitindex = 0

3.3设置英雄机能从底部飞出

循环内
hero_PlaneY -= 1
if hero_PlaneY < 0:
    hero_PlaneY = 650

3.4对飞机事件进行监听

循环内
event_list = pygame.event.get()
for event in event_list:

3.5设置游戏退出

#设置游戏退出
#循环内
if event.type == pygame.QUIT:
    print("游戏结束了......")
    pygame.quit()
    exit(0)

3.6设置飞机移动

if event.type == pygame.KEYDOWN:
if event.key == pygame.K_LEFT:
    hero_PlaneX = hero_PlaneX - 5 if hero_PlaneX >= 5 else 0
elif event.key == pygame.K_RIGHT:
    hero_PlaneX = hero_PlaneX + 5 if hero_PlaneX <= 375 else 380
elif event.key == pygame.K_UP:
    hero_PlaneY = hero_PlaneY - 5 if hero_PlaneY >= 5 else 0
elif event.key == pygame.K_DOWN:
    hero_PlaneY = hero_PlaneY + 5 if hero_PlaneY <= 521 else 526

4.0英雄机子弹部分

4.1创建英雄机子弹

#循环外
class HeroBullet:
    def __init__(self, x, y, screen):
        self.x = x
        self.y = y
        self.screen = screen
        self.pic = pygame.image.load("img/bullet1.png")
    def draw(self):
    	self.screen.blit(self.pic, (self.x, self.y))
    	self.move()
	def move(self):
    	self.y -= 5

4.2创建英雄机子弹列表

#循环外
hero_Bulletlist = []

4.3 创建英雄机子弹索引

#循环外
hero_bomb = False
hero_index_bomb = 0

4.4 英雄机子弹实现

for bullet in hero_Bulletlist:
    bullet.draw()
if bullet.y < 0:
    hero_Bulletlist.remove(bullet)
    continue
 hero_bulle_rect = pygame.rect.Rect(bullet.x, bullet.y, 22, 22)
 flag = hero_bulle_rect.colliderect(enemy_rect)
 if flag:
 	hero_Bulletlist.remove(bullet)
    enemy_bomb = True

4.5 导入爆炸图片

#循环外
hero_bomb_imgs = ["img/me_destroy_1.png",
                  "img/me_destroy_2.png",
                  "img/me_destroy_3.png",
                  "img/me_destroy_4.png"]

4.6 绘制英雄机爆炸图片并设置时间

if hero_bomb:
    if hero_index_bomb == len(hero_bomb_imgs):
        time.sleep(0.3)
        exit(0)
    hero_bomb_img = pygame.image.load(hero_bomb_imgs[hero_index_bomb])
    screan.blit(hero_bomb_img, (hero_PlaneX, hero_PlaneY))
    hero_index_bomb += 1
    time.sleep(0.2)

总代码

import random
import time
import pygame
# 可视化
pygame.init()
# 窗口大小
screan = pygame.display.set_mode((480, 500))
# 作为切换的索引量
shitindex = 0
# 加载游戏背景
bg_img = pygame.image.load("img/background.png")
# 绘制yingx 飞机
hero_img1 = pygame.image.load("img/me1.png")
hero_img2 = pygame.image.load("img/me2.png")
hero_bomb_imgs = ["img/me_destroy_1.png",
                  "img/me_destroy_2.png",
                  "img/me_destroy_3.png",
                  "img/me_destroy_4.png"]

enemy_bomb_imgs = ['img/enemy2_down1.png',
                   'img/enemy2_down2.png',
                   'img/enemy2_down3.png',
                   'img/enemy2_down4.png']
# 定义英雄机
hero_rect = pygame.rect.Rect(189, 374, 102, 126)
hero_PlaneX = hero_rect.x
hero_PlaneY = hero_rect.y
# #加载敌机图片
enemy_img1 = pygame.image.load('img/enemy2.png')
enemy_img2 = pygame.image.load("img/enemy2_hit.png")
# 定义敌机位置
enemy_rect = pygame.rect.Rect(198, 0, 69, 99)
enmyPlaneX = enemy_rect.x
enmyPlaneY = enemy_rect.y
# 设置灵敏度
pygame.key.set_repeat(20, 30)
# 创建时钟
clock = pygame.time.Clock()
# 定义敌机初始移动方向
direct = "left"

# 创建英雄机子弹
class HeroBullet:
    def __init__(self, x, y, screen):
        self.x = x
        self.y = y
        self.screen = screen
        self.pic = pygame.image.load("img/bullet1.png")

    def draw(self):
        self.screen.blit(self.pic, (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.pic = pygame.image.load("img/bomb.png")

    def draw(self):
        self.screen.blit(self.pic, (self.x, self.y))
        self.move()

    def move(self):
        self.y += 5
hero_Bulletlist = []
enemy_list = []
# 英雄机爆炸
hero_bomb = False
hero_index_bomb = 0
# 反派机爆炸
enemy_bomb = False
enemy_index_bomb = 0
# 游戏循环
while True:
    clock.tick(60)  # 表示每秒刷新60次
    pygame.display.set_caption("飞机大战")
    icon = pygame.image.load("img/icon.png")
    # 用于设置窗口的图标
    pygame.display.set_icon(icon)

    screan.blit(bg_img, (0, 0))
    # 英雄机绘制
    if shitindex == 0:
        screan.blit(hero_img1, (hero_PlaneX, hero_PlaneY))
        shitindex += 1
    else:
        screan.blit(hero_img2, (hero_PlaneX, hero_PlaneY))
        shitindex = 0

    if direct == "left":
        enmyPlaneX = enmyPlaneX - 5
        if enmyPlaneX <= 0:
            direct = "right"
    elif direct == "right":
        enmyPlaneX = enmyPlaneX + 5
        if enmyPlaneX > 480 - 80:
            direct = "left"
    for bullet in hero_Bulletlist:
        bullet.draw()
        # 子弹到最上面消失
        if bullet.y < 0:
            hero_Bulletlist.remove(bullet)
            continue  # 跳过后续逻辑,避免处理已经移除的子弹
        # 定义英雄子弹rect
        hero_bulle_rect = pygame.rect.Rect(bullet.x, bullet.y, 22, 22)
        # 检测敌机和敌机子弹是否相交
        flag = hero_bulle_rect.colliderect(enemy_rect)
        if flag:
            hero_Bulletlist.remove(bullet)
            enemy_bomb = True  # 设置敌机爆炸标志
    if not enemy_bomb:
        # 绘制敌机未爆炸图片
        if enemy_index_bomb == 0:
            screan.blit(enemy_img1, (enmyPlaneX, enmyPlaneY))
            enemy_index_bomb += 1
        else:
            screan.blit(enemy_img2, (enmyPlaneX, enmyPlaneY))
            enemy_index_bomb = 0
    # 绘制敌机爆炸图片
    else:
        # 当前敌机爆炸图片索引和爆炸图片相同,退出游戏
        if enemy_index_bomb == len(enemy_bomb_imgs):
            time.sleep(0.1)
            exit(0)
        enemy_bomb_img = pygame.image.load(enemy_bomb_imgs[enemy_index_bomb])
        # 绘制爆炸图片
        screan.blit(enemy_bomb_img,(enmyPlaneX,enmyPlaneY))
        enemy_index_bomb +=1
        time.sleep(0.2)

    x = random.randint(1, 100)
    if x == 6 or x == 60:
        enemy_Bullet = EnemyBullet(enmyPlaneX + 34 - 2, enmyPlaneY + 99, screan)
        enemy_list.append(enemy_Bullet)
    for enemy_bullet in enemy_list:
        enemy_bullet.draw()
        enemy_Bulle_rect = pygame.rect.Rect(enemy_bullet.x, enemy_bullet.y, 5, 11)
        flag2 = enemy_Bulle_rect.colliderect(hero_rect)
        if flag2:
            print('战机爆炸')
            hero_bomb = True
            enemy_list.remove(enemy_bullet)
        if hero_bomb:
            if hero_index_bomb == len(hero_bomb_imgs):
                time.sleep(0.3)
                exit(0)
            hero_bomb_img = pygame.image.load(hero_bomb_imgs[hero_index_bomb])
            screan.blit(hero_bomb_img, (hero_PlaneX, hero_PlaneY))
            hero_index_bomb += 1
            time.sleep(0.2)
    # 飞机可以从底部飞出,实现自动飞行
    hero_PlaneY -= 1
    # 飞机底部飞出
    if hero_PlaneY < 0:
        hero_PlaneY = 650
    #
    screan.blit(enemy_img1, (enmyPlaneX, enmyPlaneY))

    # 对所有事件进行监听
    event_list = pygame.event.get()
    for event in event_list:
        if event.type == pygame.QUIT:
            print("游戏结束了......")
            pygame.quit()
            exit(0)

    # 对英雄飞机左右上下经行移动的事件监听
    if event.type == pygame.KEYDOWN:
        if event.key == pygame.K_LEFT:
            hero_PlaneX = hero_PlaneX - 5 if hero_PlaneX >= 5 else 0
        elif event.key == pygame.K_RIGHT:
            hero_PlaneX = hero_PlaneX + 5 if hero_PlaneX <= 375 else 380
        elif event.key == pygame.K_UP:
            hero_PlaneY = hero_PlaneY - 5 if hero_PlaneY >= 5 else 0
        elif event.key == pygame.K_DOWN:
            hero_PlaneY = hero_PlaneY + 5 if hero_PlaneY <= 521 else 526
        elif event.key == pygame.K_SPACE:
            hero_Bullet = HeroBullet(hero_PlaneX + 50 - 2, hero_PlaneY - 11, screan)
            hero_Bulletlist.append(hero_Bullet)
    pygame.display.update()

在这里插入图片描述

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值