pygame之《飞机大战》(一)

前言:

学习完Python后,为巩固与练习,因而编写了《飞机大战》小游戏。(共六个章节)
GitHub:https://github.com/GYT0313/FeiJiDaZhan

最终成果展示:

在这里插入图片描述


必须资源:图片和音乐下载

完整代码,及可在windows运行的.exe文件

pygame之《飞机大战》( 二 )
pygame之《飞机大战》( 三 )
pygame之《飞机大战》( 四 )
pygame之《飞机大战》( 五 )
pygame之《飞机大战》( 六 )

环境配置:

Python的环境配置网上教程很多,在此就不讲解配置过程。
本次编写运行平台及环境:Ubuntu / Python3.6+。
注:Python2 运行报错。

《飞机大战》分析:

需求:
1. 玩家飞机(hero)
2. 敌人飞机(enemy0、enemy1、enemy2)
3. 补给品(blood_supply血量补给、bullet_supply弹药补给)
4. 子弹

1. Base(所有类的基类)
2. BasePlane(飞机类的基类)
3. HeroPlane(hero飞机类)
4. Enemy0Plane、Enemy1Plane、Enemy2Plane(三种敌机类)
5. BaseBullet(所有子弹的基类)
6. Bullet(hero子弹)EnemyBullet(enemy子弹)
6. supply_2_hero(补给品类)
以及众多的全局变量和函数。

类的继承关系图:

类的关系图


代码编写:

注:所有代码都在一个 .py 文件

图片和音乐下载:https://download.csdn.net/download/qq_38038143/10367723

1 - 窗口和hero的显示

# -*- coding:utf-8 -*-

import pygame
from pygame.locals import *
import time

def main():
    #1. 创建窗口
    screen = pygame.display.set_mode((480,852),0,32)

    #2. 创建一个背景图片
    background = pygame.image.load("./feiji/background.png")

    #3. 创建一个飞机图片
    hero = pygame.image.load("./feiji/hero1.png")


    while True:
        screen.blit(background, (0,0))

        screen.blit(hero, (195, 700))

        pygame.display.update()

        time.sleep(0.01)

if __name__ == "__main__":
    main()
运行截图:

这里写图片描述
2 - 键盘事件的监听触发

def key_control(hero_temp):
    #获取事件,比如按键等
    for event in pygame.event.get():

        #判断是否是点击了退出按钮
        if event.type == QUIT:
            print("exit")
            exit()
        #判断是否是按下了键
        elif event.type == KEYDOWN:
            #检测按键是否是a或者left
            if event.key == K_a or event.key == K_LEFT:
                print('left')
                hero_temp.move_left()
            #检测按键是否是d或者right
            elif event.key == K_d or event.key == K_RIGHT:
                print('right')
                hero_temp.move_right()
            #检测按键是否是空格键
            elif event.key == K_SPACE:
                print('space')

3 - 子弹基类

class Bullet(object):
    def __init__(self, screen_temp, x, y):
        self.x = x+40
        self.y = y-20
        self.screen = screen_temp
        self.image = pygame.image.load("./feiji/bullet.png")
    
    def display(self):
        self.screen.blit(self.image, (self.x, self.y))

    def move(self):
        self.y -= 10

4 - hero左右移动及发射子弹

class HeroPlane(object):
    def __init__(self, screen_temp):
        self.x = 195
        self.y = 700
        self.screen = screen_temp
        self.image = pygame.image.load("./feiji/hero1.png")
        self.bullet_list = [] #存储发射出去的子弹的引用
    
    def display(self):
        self.screen.blit(self.image, (self.x, self.y))
        
        for bullet in self.bullet_list:
            bullet.display()
            bullet.move()

    #当一直按下键盘时调用移动函数
    def press_move(self):
        if len(self.key_down_list) != 0:
            if self.key_down_list[0] == K_LEFT:
                self.move_left()
            elif self.key_down_list[0] == K_RIGHT:
                self.move_right()

    def move_left(self):
        self.x -= 5

    def move_right(self):
        self.x += 5

    def fire(self):
        self.bullet_list.append(Bullet(self.screen, self.x, self.y))

5 - Enemy0类

class EnemyPlane(object):
    """敌机的类"""
    def __init__(self, screen_temp):
        self.x = 0
        self.y = 0
        self.screen = screen_temp
        self.image = pygame.image.load("./feiji/enemy0.png")
        #self.bullet_list = [] #存储发射出去的子弹的引用
        self.direction = "right" #飞机默认移动方向
    
    def display(self):
        self.screen.blit(self.image, (self.x, self.y))
        
        #for bullet in self.bullet_list:
        #    bullet.display()
        #    bullet.move()
    
    def move(self):
        if self.direction == "right":
            self.x += 5
        elif self.direction == "left":
            self.x -= 5
        if self.x > 430:
            self.direction = "left"
        elif self.x < 0:
            self.direction = "right"

    def fire(self):
        self.bullet_list.append(Bullet(self.screen, self.x, self.y))
填充main()函数:
def main():
    #1. 创建窗口
    screen = pygame.display.set_mode((480,852),0,32)

    #2. 创建一个背景图片
    background = pygame.image.load("./feiji/background.png")

    #3. 创建一个飞机对象
    hero = HeroPlane(screen)
    
    #4. 创建一个敌机对象
    enemy = EnemyPlane(screen)

    while True:
        screen.blit(background, (0,0))

        hero.display()
        enemy.display()
        enemy.move()#调用敌机移动
        pygame.display.update()
        key_control(hero)

        time.sleep(0.01)
运行截图:

这里写图片描述

本章结束:

《飞机大战》(一)的代码编写就先到这里结束,本次教程主要实现hero飞机的移动、子弹发射,Enemy0的移动。对本次游戏有一个初步的编写及认识。以后的教程或对其进一步的改进。

[pygame之《飞机大战》(二)]

  • 31
    点赞
  • 213
    收藏
    觉得还不错? 一键收藏
  • 36
    评论
好的,这里是一个简单的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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值