python实现简单飞机大战小游戏

为了熟悉Python基础语法,学习了一个经典的案例:飞机大战,最后实现效果如下:

实现步骤:

①下载64位对应python版本的pygamepygame-1.9.6-cp38-cp38-win_amd64.whl

② 更新pippython -m pip install --upgrade pip

③ 安装pygamepip install pygame-1.9.6-cp38-cp38-win_amd64.whl

④ 实现代码如下:

import sys  # 导入系统模块
import random  # 随机数模块
import pygame  # 导入pygame模块
import pygame.locals  # 导入pygame本地策略

ICO_PATH = "images/app.ico"  # APP_ICO
APP_NAME = "飞机大战V1.0"  # APP_NAME
Enemy_IMGS = ("images/enemy1.png", "images/enemy2.png")  # ENEMY_IMGS

# TODO 定义一个公共类
class Model:
    window = None  # 主窗体window对象

    # 初始化函数
    def __init__(self, img_path, x, y):
        self.img = pygame.image.load(img_path)
        self.x = x
        self.y = y

    # 将图片填充到背景中
    def display(self):
        Model.window.blit(self.img, (self.x, self.y))

# TODO 背景
class Background(Model):
    # 背景移动
    def move(self):
        if self.y <= Game.WINDOW_HEIGHT:
            self.y += 1
        else:
            self.y = 0

    # 背景图片展示
    def display(self):
        Model.window.blit(self.img, (self.x, self.y))  # 填充背景
        Model.window.blit(self.img, (self.x, self.y - Game.WINDOW_HEIGHT))  # 填充辅助背景

# TODO 玩家类
class PlayerPlane(Model):
    def __init__(self, img_path, x, y):
        super().__init__(img_path, x, y)
        # 子弹
        self.bullets = []

    def display(self, enemys):
        super().display()
        remove_bullets = []
        for bullet in self.bullets:

            bullet.move()
            bullet.display()
            # 如果子弹小于消失于屏幕,删除子弹
            if bullet.y < -11:
                remove_bullets.append(bullet)
            # 子弹的矩阵
            bullet_rect = pygame.locals.Rect(bullet.x, bullet.y, 5, 11)
            # TODO 进行碰撞检测
            for enemy in enemys:
                # 敌机的矩阵
                enemy_rect = pygame.locals.Rect(enemy.x, enemy.y, 57, 43)
                # 如果碰撞
                if pygame.Rect.colliderect(bullet_rect, enemy_rect):
                    # 随机修改敌机的位置模拟敌机销毁并生成新敌机并删除子弹
                    enemy.img = pygame.image.load(Enemy_IMGS[random.randint(0, 1)])
                    enemy.x = random.randint(0, Game.WINDOW_WIDTH - 57)
                    enemy.y = random.randint(-Game.WINDOW_WIDTH, -43)
                    remove_bullets.append(bullet)
                    break

        for bullet in remove_bullets:
            self.bullets.remove(bullet)

# TODO 敌机类
class EnemyPlane(Model):
    def __init__(self):
        self.img = pygame.image.load(Enemy_IMGS[random.randint(0, 1)])
        self.x = random.randint(0, Game.WINDOW_WIDTH - 57)
        self.y = random.randint(-Game.WINDOW_WIDTH, -43)

    def move(self):
        if self.y > Game.WINDOW_HEIGHT:
            self.y = -43  # 返回初始位置
        else:
            self.y += 1

# TODO 子弹类
class Bullet(Model):
    def move(self):
        self.y -= 1

# TODO 游戏类
class Game:
    WINDOW_WIDTH = 410
    WINDOW_HEIGHT = 614

    # 初始化操作
    def __init__(self):
        self.window = pygame.display.set_mode([Game.WINDOW_WIDTH, Game.WINDOW_HEIGHT])  # 窗口的设置
        self.background = Background("images/background.png", 0, 0)  # 窗体模型的设置

        self.player = PlayerPlane("images/me1.png", 180, 400)
        self.enemyPlanes = []
        for _ in range(5):
            self.enemyPlanes.append(EnemyPlane())

    # 游戏的入口函数
    def run(self):
        self.frame_init()
        while True:
            self.background.move()  # 背景向上移动,模拟环境移动
            self.background.display()  # 将图片塞入到窗体中

            self.player.display(self.enemyPlanes)

            for enemy in self.enemyPlanes:
                enemy.move()
                enemy.display()

            pygame.display.update()  # 刷新窗体
            self.event_init()  # 监听事件

    # 初始化窗口
    def frame_init(self):
        Model.window = self.window  # 将window对象赋值给Model公有类
        ico = pygame.image.load(ICO_PATH)  # 加载图片
        pygame.display.set_icon(ico)  # 设置icon
        pygame.display.set_caption(APP_NAME)  # 设置app_name

    # 事件初始化方法
    def event_init(self):
        for event in pygame.event.get():
            # 关闭事件
            if event.type == pygame.locals.QUIT:
                sys.exit()
            # 监听鼠标事件
            if event.type == pygame.locals.MOUSEMOTION:
                pos = pygame.mouse.get_pos()
                self.player.x = pos[0] - 51
                self.player.y = pos[1] - 63
        focus_state = pygame.mouse.get_pressed()
        if focus_state[0] == 1:
            pos = pygame.mouse.get_pos()
            self.player.bullets.append(Bullet("images/bullet1.png", pos[0], pos[1] - 75))

if __name__ == "__main__":
    Game().run()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • python pygame模块编写飞机大战

    本文实例为大家分享了python pygame模块编写飞机大战的具体代码,供大家参考,具体内容如下 该程序没有使用精灵组,而是用列表存储对象来替代精灵组的动画效果.用矩形对象的重叠来判断相撞事件.该程序可以流畅运行,注释较为详细,希望可以帮助大家. import pygame from pygame.locals import * from sys import exit import time import random # 创建子弹类,把子弹的图片转化为图像对象,设定固定的移动速度 clas

  • python实现飞机大战

    本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下 实现的效果如下: 主程序代码如下: import pygame from plane_sprites import * class PlaneGame(object): """飞机大战主游戏""" def __init__(self): print("游戏初始化") # 1,绘制屏幕窗口 self.screen = pygame.display.

  • python实现飞机大战游戏(pygame版)

    简介 使用python实现pygame版的飞机大战游戏: 环境:Windows系统+python3.8.0 游戏规则: 1.点击"PLAY"或者按键"P"开始游戏: 2.敌机根据设置频率从顶部随机位置生成,生成后向下移动: 3.飞船在底部中间生成,玩家使用上下左右键控制飞船移动,敲击空格键发射子弹: 4.子弹打到敌机,该敌机产生爆炸效果并累计分数到右上角: 5.消灭10只飞机后,等级升高,敌机生成频率变快,下落速度也变快: 6.当三条命都消失了,游戏结束. 游戏运行

  • python飞机大战pygame碰撞检测实现方法分析

    本文实例讲述了python飞机大战pygame碰撞检测实现方法.分享给大家供大家参考,具体如下: 目标 了解碰撞检测方法 碰撞实现 01. 了解碰撞检测方法 pygame 提供了 两个非常方便 的方法可以实现碰撞检测: pygame.sprite.groupcollide() 两个精灵组 中 所有的精灵 的碰撞检测 groupcollide(group1, group2, dokill1, dokill2, collided = None) -> Sprite_dict 如果将 dokill 设

  • python实现飞机大战项目

    本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下 引用了小甲鱼的框架,往上面添加了一些新功能 1.我方飞机模块 import pygame class MyPlane(pygame.sprite.Sprite): def __init__(self,bg_size): pygame.sprite.Sprite.__init__(self) self.image1 = pygame.image.load(r'E:\learn pygame\image\me1.png

  • 使用python实现飞机大战游戏

    本文实例为大家分享了Python飞机大战项目,供大家参考,具体内容如下 import gc import random import pygame # 玩家飞机精灵类 import Constants class HeroPlane(pygame.sprite.Sprite): def __init__(self, screen): # 调用父类初始化方法 # pygame.sprite.Sprite.__init__(self) super().__init__() # 窗口 self.scr

  • python实现飞机大战小游戏

    本文实例为大家分享了python实现飞机大战的具体代码,供大家参考,具体内容如下 初学Python,写了一个简单的Python小游戏. 师出bilibili某前辈 pycharm自带了第三方库pygame,安装一下就好了,很方便. 虽然很多大佬已经给出了步骤,我这里还是啰嗦一下,也为了自己巩固一下. 上图: 这里再给出代码的逻辑架构 plane_main.py import pygame from plane_sprites import * class PlaneGame(object): "

  • 用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动

    目标是拷贝微信的飞机大战,当然拷贝完以后大家就具备自己添加不同内容的能力了. 首先是要拿到一些图片素材,熟悉使用图像处理软件和绘画的人可以自己制作,并没有这项技能的同学只能和我一样从网上下载相应的素材了. 网上可以找到相应的这样的图片,注意,所有的元件图片要是png类型的图片,那样可以有透明的背景,否则会有白色的边框露出来. 找到素材以后我们就要开始搭建我们的飞机大战了. 微信上的飞机大战是由手指控制的,在电脑上,我们就先用鼠标代替了. 按照之前我们在天空上移动云的那个程序,我们可以知道该怎么做

  • python版飞机大战代码分享

    利用pygame实现了简易版飞机大战.源代码如下: # -*- coding:utf-8 -*- import pygame import sys from pygame.locals import * from pygame.font import * import time import random class Hero(object): #玩家 英雄类 def __init__(self, screen_temp): self.x = 210 self.y = 700 self.life

  • python实现飞机大战游戏

    飞机大战(Python)代码分为两个python文件,工具类和主类,需要安装pygame模块,能完美运行(网上好多不完整的,调试得心累.实现出来,成就感还是满满的),如图所示: 完整代码如下: 1.工具类plane_sprites.py import random import pygame # 屏幕大小的常量 SCREEN_RECT = pygame.Rect(0, 0, 480, 700) # 刷新的帧率 FRAME_PER_SEC = 60 # 创建敌机的定时器常量 CREATE_ENEM

随机推荐