pygame实现飞机大战总结

安装pygame库

pip  install pygame

飞机大战游戏使用的pygame库,该游戏的代码分为三个部分,游戏窗体的创建,设置飞机和子弹的动画效果,飞机类的编写。

创建飞机大战的游戏窗体

#设置游戏屏幕大小
SCREEN_WIDTH=480
SCREEN_HEIGHT=700
#初始化pygame,必须放在最前面
pygame.init()
#设置游戏界面大小,背景图片及标题,像素大小
screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
#游戏界面标题
pygame.display.set_caption('飞机大战')

设置游戏的动画效果

#背景图
background=pygame.image.load('resplane/resplane1/image/background.png').convert()
#飞机图片集合
#设置玩家飞机不同状态图片列表,多张图片展示为动画效果
player_img1=pygame.image.load('resplane/resplane1/image/cap1.png')
player_img2=pygame.image.load('resplane/resplane1/image/player1.png')
plane_img=[]
plane_img2=[]
#参数前面两位为图片偏移量,后为像素大小
plane_img.append(player_img1.subsurface(pygame.Rect(0,0,30,30)).convert_alpha())
plane_img2.append(player_img2.subsurface(pygame.Rect(0,0,30,30)).convert_alpha())
player_pos1=[40,600]
player_pos2=[420,600]

在使用pygame.Rect时要注意大小不要小于实际图片的 像素大小,不然会报错。

玩家飞机类

class Player(pygame.sprite.Sprite):
    def __init__(self,plane_img,init_pos):
        pygame.sprite.Sprite.__init__(self)
        self.image=plane_img
        self.rect=pygame.Rect(0,0,100,120)
        self.rect.topleft=init_pos
        self.img_index=0
        self.speed=8
    def moveUp(self):
        if self.rect.top<=0:
            self.rect.top=0
        else:
            self.rect.top-=self.speed
    def moveDown(self):
        if self.rect.top>=SCREEN_HEIGHT-self.rect.height:
            self.rect.top=SCREEN_HEIGHT-self.rect.height
        else:
            self.rect.top+=self.speed
    def moveLeft(self):
        if self.rect.left<=0:
            self.rect.left=0
        else:
            self.rect.left-=self.speed
    def moveRight(self):
        if self.rect.left>=SCREEN_WIDTH-self.rect.width:
            self.rect.left=SCREEN_WIDTH-self.rect.width
        else:
            self.rect.left+=self.speed

完整代码

import pygame
from sys import exit
from pygame.locals import *
#玩家飞机类
class Player(pygame.sprite.Sprite):
    def __init__(self,plane_img,init_pos):
        pygame.sprite.Sprite.__init__(self)
        self.image=plane_img
        self.rect=pygame.Rect(0,0,100,120)
        self.rect.topleft=init_pos
        self.img_index=0
        self.speed=8
    def moveUp(self):
        if self.rect.top<=0:
            self.rect.top=0
        else:
            self.rect.top-=self.speed
    def moveDown(self):
        if self.rect.top>=SCREEN_HEIGHT-self.rect.height:
            self.rect.top=SCREEN_HEIGHT-self.rect.height
        else:
            self.rect.top+=self.speed
    def moveLeft(self):
        if self.rect.left<=0:
            self.rect.left=0
        else:
            self.rect.left-=self.speed
    def moveRight(self):
        if self.rect.left>=SCREEN_WIDTH-self.rect.width:
            self.rect.left=SCREEN_WIDTH-self.rect.width
        else:
            self.rect.left+=self.speed
#设置游戏屏幕大小
SCREEN_WIDTH=480
SCREEN_HEIGHT=700
#初始化pygame,必须放在最前面
pygame.init()
#设置游戏界面大小,背景图片及标题,像素大小
screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
#游戏界面标题
pygame.display.set_caption('飞机大战')
#背景图
background=pygame.image.load('resplane/resplane1/image/background.png').convert()
#飞机图片集合
#设置玩家飞机不同状态图片列表,多张图片展示为动画效果
player_img1=pygame.image.load('resplane/resplane1/image/cap1.png')
player_img2=pygame.image.load('resplane/resplane1/image/player1.png')
plane_img=[]
plane_img2=[]
#参数前面两位为图片偏移量,后为像素大小
plane_img.append(player_img1.subsurface(pygame.Rect(0,0,30,30)).convert_alpha())
plane_img2.append(player_img2.subsurface(pygame.Rect(0,0,30,30)).convert_alpha())
player_pos1=[40,600]
player_pos2=[420,600]
#实例化玩家飞机
player1=Player(plane_img,player_pos1)
player2=Player(plane_img2,player_pos2)
#游戏循环帧率设置
clock=pygame.time.Clock()#判断游戏循环退出的参数
running=True#游戏主循环
while running:
   #控制游戏最大帧率
    clock.tick(60)
    #绘制背景
    screen.fill(0)
    screen.blit(background,(0,0))
    #绘制玩家飞机
    screen.blit(player1.image[player1.img_index],player1.rect)
    screen.blit(player2.image[player2.img_index],player2.rect)
    #更新屏幕
    pygame.display.update()
    key_pressed=pygame.key.get_pressed()
    if key_pressed[K_w]:
        player1.moveUp()
    if key_pressed[K_s]:
        player1.moveDown()
    if key_pressed[K_a]:
        player1.moveLeft()
    if key_pressed[K_d]:
        player1.moveRight()
        
    if key_pressed[K_UP]:
        player2.moveUp()
    if key_pressed[K_DOWN]:
        player2.moveDown()
    if key_pressed[K_LEFT]:
        player2.moveLeft()
    if key_pressed[K_RIGHT]:
        player2.moveRight()
    #处理游戏退出,不能删除,不然移动窗体就会死机
    for event in pygame.event.get():
        if event.type==pygame.QUIT:
            pygame.quit()
            exit()



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这里是一个简单的Pygame飞机大战游戏示例: ```python import pygame import random # 初始化 Pygame pygame.init() # 创建游戏窗口 screen_width = 480 screen_height = 700 screen = pygame.display.set_mode((screen_width, screen_height)) # 设置游戏标题 pygame.display.set_caption("飞机大战") # 加载背景图片 background = pygame.image.load("images/background.png").convert() # 加载游戏音效 pygame.mixer.music.load("sound/game_music.ogg") pygame.mixer.music.set_volume(0.2) pygame.mixer.music.play(-1) bullet_sound = pygame.mixer.Sound("sound/bullet.wav") bullet_sound.set_volume(0.2) enemy_down_sound = pygame.mixer.Sound("sound/enemy_down.wav") enemy_down_sound.set_volume(0.2) game_over_sound = pygame.mixer.Sound("sound/game_over.wav") game_over_sound.set_volume(0.2) # 加载玩家飞机图片 player_image = pygame.image.load("images/player.png").convert_alpha() # 加载子弹图片 bullet_image = pygame.image.load("images/bullet.png").convert_alpha() # 加载敌机图片 enemy_images = [ pygame.image.load("images/enemy1.png").convert_alpha(), pygame.image.load("images/enemy2.png").convert_alpha(), pygame.image.load("images/enemy3.png").convert_alpha(), ] # 定义玩家飞机类 class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = player_image self.rect = self.image.get_rect() self.rect.midbottom = (screen_width // 2, screen_height - 30) self.speed = 8 self.bullets = pygame.sprite.Group() def update(self, keys): if keys[pygame.K_LEFT] and self.rect.left > 0: self.rect.x -= self.speed if keys[pygame.K_RIGHT] and self.rect.right < screen_width: self.rect.x += self.speed def shoot(self): bullet = Bullet(self.rect.centerx, self.rect.top) self.bullets.add(bullet) bullet_sound.play() # 定义子弹类 class Bullet(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() self.image = bullet_image self.rect = self.image.get_rect() self.rect.centerx = x self.rect.bottom = y self.speed = -10 def update(self): self.rect.y += self.speed if self.rect.bottom < 0: self.kill() # 定义敌机类 class Enemy(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = random.choice(enemy_images) self.rect = self.image.get_rect() self.rect.x = random.randint(0, screen_width - self.rect.width) self.rect.y = random.randint(-200, -50) self.speed = random.randint(1, 4) self.health = 1 def update(self): self.rect.y += self.speed if self.rect.top > screen_height: self.kill() # 创建游戏对象 player = Player() enemies = pygame.sprite.Group() all_sprites = pygame.sprite.Group() all_sprites.add(player) # 设置游戏主循环 clock = pygame.time.Clock() score = 0 game_over = False while not game_over: clock.tick(60) # 处理事件 for event in pygame.event.get(): if event.type == pygame.QUIT: game_over = True # 检测玩家按键 keys = pygame.key.get_pressed() if keys[pygame.K_SPACE]: player.shoot() # 更新玩家和子弹 player.update(keys) player.bullets.update() # 检测子弹和敌机碰撞 for bullet in player.bullets: enemies_hit = pygame.sprite.spritecollide(bullet, enemies, True) for enemy in enemies_hit: enemy_down_sound.play() score += 100 bullet.kill() # 更新敌机 if random.randint(1, 30) == 1: enemy = Enemy() enemies.add(enemy) all_sprites.add(enemy) enemies.update() # 检测玩家与敌机碰撞 if pygame.sprite.spritecollide(player, enemies, True): game_over_sound.play() game_over = True # 绘制游戏界面 screen.blit(background, (0, 0)) all_sprites.draw(screen) # 显示得分 font = pygame.font.SysFont(None, 36) score_text = font.render("得分: {}".format(score), True, (255, 255, 255)) screen.blit(score_text, (10, 10)) # 更新屏幕 pygame.display.update() # 游戏结束 pygame.quit() ``` 你可以在代码中看到,程序使用了 Pygame 绘图模块来创建游戏窗口、加载图片和播放音效。游戏中有三个主要的类:Player、Bullet和Enemy。其中,Player类表示玩家飞机,Bullet类表示子弹,Enemy类表示敌机。游戏主循环中,程序不断更新玩家和子弹位置,检测子弹和敌机碰撞,更新敌机位置,检测玩家与敌机碰撞,绘制游戏界面,并在游戏结束时退出 Pygame
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值