飞机大战(python)

配置类

import pygame

SCREEN_RECT = pygame.Rect(0,0,480,700)

CREATE_ENEMY_EVENT = pygame.USEREVENT

HERO_FIRE_EVENT = pygame.USEREVENT +1
class Settings():
    """存储所有的设置类"""
    def __init__(self):
        self.caption = "飞机大战"

主程序类:

import pygame
from plane_sprites import *
import Settings
import sys
from hero import Hero

class PlaneGame():
    """飞机大战主程序"""

    def __init__(self):
        self.screen = pygame.display.set_mode(Settings.SCREEN_RECT.size)
        self.clock = pygame.time.Clock()

        pygame.time.set_timer(Settings.CREATE_ENEMY_EVENT,1000)
        pygame.time.set_timer(Settings.HERO_FIRE_EVENT, 500)

    def __create_sprits(self):

        self.plane_group = pygame.sprite.Group()

        self.hero = Hero()
        self.hero_group = pygame.sprite.Group(self.hero)

    def start_game(self):
        pygame.init()
        pygame.display.set_caption(Settings.Settings().caption)
        bg = pygame.image.load("./images/background.png")
        bg_rect1 = pygame.Rect(0, 0, 480, 700)
        bg_rect2 = pygame.Rect(0, -700, 480, 700)
        self.screen.blit(bg, bg_rect1)
        self.screen.blit(bg, bg_rect2)

        self.__create_sprits()

        while True:
            self.clock.tick(60)

            self.__background_scrool(bg, bg_rect1, bg_rect2)

            self.__event_handler()

            self.__check_collide()

            self.__update_sprites()

            pygame.display.flip()

    def __background_scrool(self, bg, bg_rect1, bg_rect2):
        """背景图像的移动"""
        bg_rect1.y += 1
        bg_rect2.y += 1
        if bg_rect1.y >= 700:
            bg_rect1.y = -700
        elif bg_rect2.y >= 700:
            bg_rect2.y = -700
        self.screen.blit(bg, bg_rect1)
        self.screen.blit(bg, bg_rect2)

    def __event_handler(self):
        """监视键盘和鼠标事件"""
        for event in pygame.event.get():
            if event:
                print(event)

            if event.type == pygame.QUIT:
                PlaneGame.__game_over()
            elif event.type == Settings.CREATE_ENEMY_EVENT:
                print("敌机---")
                plane_path = "./images/enemy1.png"
                plane = [GameSprites(plane_path) for i in range(10)]
                self.plane_group.add(plane)
            elif event.type == Settings.HERO_FIRE_EVENT:
                self.hero.fire()

        keys_press = pygame.key.get_pressed()

        if keys_press[pygame.K_RIGHT] :
            self.hero.speed = 2
        elif  keys_press[pygame.K_LEFT]:
            self.hero.speed = -2
        else:
            self.hero.speed =0

    def __check_collide(self):
        """碰撞检测"""
        pygame.sprite.groupcollide(self.hero.bullets,self.plane_group,True,True)
        enemies = pygame.sprite.spritecollide(self.hero, self.plane_group, True)

        if enemies:

            self.hero.kill()
            self.__game_over()

    def __update_sprites(self, ):
        """修改精灵组"""
        self.plane_group.update()
        self.plane_group.draw(self.screen)
        self.hero_group.update()
        self.hero_group.draw(self.screen)
        self.hero.bullets.update()
        self.hero.bullets.draw(self.screen)

    @staticmethod
    def __game_over():
        """游戏结束方法"""
        pygame.quit()
        sys.exit()

if __name__ == '__main__':
    PlaneGame().start_game()

敌机精灵类

import pygame
import random

class GameSprites(pygame.sprite.Sprite):
    """飞机大战游戏精灵"""
    def __init__(self, image_path, speed=1):
"""
        初始化方法
        :param image_path: 图片路径
        :param speed: 移动速度
"""
        super().__init__()
        self.speed = random.randint(1,3)
        self.image = pygame.image.load(image_path)

        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0,400)
        self.rect.y = random.randint(-500,-self.rect.height)

    def __del__(self):
        print("敌机挂了")

        self.kill()

    def update(self):
"""
        重写update方法
"""
        self.rect.y += self.speed
        if self.rect.y >= 700:
            print("del enemy")
            self.__del__()

英雄类

import pygame
import random
from bullet import Bullet

class Hero(pygame.sprite.Sprite):
    """飞机大战英雄类"""

    def __init__(self, speed=0):
"""
        初始化方法
        :param speed: 移动速度
"""
        super().__init__()
        self.speed = speed
        self.image = pygame.image.load("./images/me1.png")

        self.rect = self.image.get_rect()
        self.rect.centerx = 480 * 0.5
        self.rect.bottom = 700 - 120

        self.bullets = pygame.sprite.Group()

    def __del__(self):
        print("英雄挂了")

        self.kill()

    def update(self):
"""
        重写update方法
"""
        self.rect.x += self.speed
        if self.rect.x >= 380:
            self.rect.x = 380
        elif self.rect.x  0:
            self.rect.x = 0

    def fire(self):
        print("发射子弹...")
        for i in range(3):

            bullet = Bullet()

            bullet.rect.bottom = self.rect.y -i*20
            bullet.rect.centerx = self.rect.centerx
            self.bullets.add(bullet)

子弹类

import pygame

class Bullet(pygame.sprite.Sprite):
    """飞机大战子弹类"""

    def __init__(self, speed=-2):
"""
        初始化方法
        :param speed: 移动速度
"""
        super().__init__()
        self.speed = speed
        self.image = pygame.image.load("./images/bullet2.png")

        self.rect = self.image.get_rect()

    def update(self):
"""
        重写update方法
"""
        self.rect.y += self.speed

        if self.rect.bottom <0:
            self.__del__()

    def __del__(self):
        print("子弹被销毁")
        self.kill()

运行效果如下:

飞机大战(python)

关键点的理解:

  1. pygame中专门提供一个类来描述矩形区域Rect(x,y,weight,height)->Rect对象。这个对象有很多属性 Rect.size 返回元组(weight,height)
  2. pygame专门提供一个模块pygame.display用于创建、管理游戏窗口。pygame.display.setmode() 初始化游戏显示窗口(必须使用变量来记录返回结果,因为后续的所有的图像绘制都基于这个返回结果)
    pygame.display.update() 刷新屏幕内容显示
  3. 理解图像并实现图像的绘制:
    首先使用pygame.image.load()加载图像数据;使用游戏屏幕对象,调用blit方法,将图像绘制到指定位置;调用pygame.diaplay.update()来更新整个屏幕的显示 注:可以在screen对象完成所有的bilt方法之后,统一调用update方法。
    png格式的图片是支持透明图像的
  4. 游戏中的动画实现原理:本质上是快速在屏幕上绘制图像,每次绘制的图像被称为帧,一般电脑上每秒绘制60次
  5. 游戏时钟:pygame中专门提供了一个时钟类,pygame.time.clock,可以方便的设置屏幕的绘制的速度
    使用游戏时钟的步骤:首先在游戏初始化创建一个时钟对象,其次在游戏循环中调用tick(帧率)方法。tick会根据上次被调用的时间,自动设置游戏循环中的延时。
  6. 在游戏循环中监听事件:py.event.get()可以获取所有的事件列表
  7. 理解精灵和精灵组的作用:pygame.sprite.Sprite()记录存储图像(image)和位置(rect);
    pygame.sprite.Group() 有add、update(修改位置,让精灵组中的所有的精灵各自调用update方法进行位置的更新)和draw(screen):在sceen上绘制精灵组中的所有的精灵
  8. 定时器:pygame.time.set_timer(eventid,mill) 第一个参数eventid需要指定常量pygame.USEREVENT来指定,并且一次增加;通过事件的监听来使定时器的发生
  9. pygame中对键盘按键捕获的两种方式:首先,判断event.typepygame.KEYDOWN and event.keypygame.k_RIGHT
    其次的方式为:获取所有按键元组pygame.key.get_press() 如果被按下了,数值为1

Original: https://blog.csdn.net/lianggege88/article/details/125010060
Author: lianggege88
Title: 飞机大战(python

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/780070/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 支持JDK19虚拟线程的web框架,之三:观察运行中的虚拟线程

    本篇借助JProfiler工具,从线程的观察结果去印证官方资料,做到理论结合实践,让您领先一步,掌握和了解神秘的虚拟线程内幕 欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原…

    Python 2023年10月15日
    051
  • CS、BS架构和网络通信协议

    1. CS架构 CS架构其实在我们身边比比皆是,手机里的app大多都是CS架构,比如腾讯作为服务端为你提供视频,你得下个腾讯视频客户端才能看它的视频。 这里的腾讯视频是客服端cli…

    Python 2023年11月1日
    038
  • 直方图均衡化

    直方图均衡化目标• 本小节我们要学习直方图均衡化的概念,以及如何使用它来改善图片的对比。 原理想象一下如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,…

    Python 2023年8月28日
    046
  • 超长时间序列数据可视化的6个技巧

    时间序列是由表示时间的x轴和表示数据值的y轴组成,使用折线图在显示数据随时间推移的进展时很常见。它在提取诸如趋势和季节性影响等信息方面有一些好处。 但是在处理超长的时间轴时有一个问…

    Python 2023年8月17日
    049
  • Python实现自动驾驶

    Original: https://www.cnblogs.com/123456feng/p/16107178.htmlAuthor: 蚂蚁ailingTitle: Python实…

    Python 2023年11月9日
    026
  • 在PE文件中简单注入代码,实现在启动前弹窗

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 弹尽粮绝,会员救园:…

    Python 2023年10月19日
    037
  • 阿里云-数据仓库-数据分析开发神器-ODPS

    ; 一、 ODPS 基本面-F10 1、什么是ODPS? 1、开发数据处理服务(Open Data Processing Service,简称ODPS), 2016年后更名MaxC…

    Python 2023年10月27日
    043
  • 关系代数(关系代数的五个基本操作)

    五种基本关系代数运算是? 五种基本关系代数运算是并、差、投影、交、选择、投影。 1、并:设有两个关系R和S,它们具有相同的结构。R和S的并是由属于R或属于S的元组组成的集合,运算符…

    Python 2023年10月9日
    073
  • Django学习笔记以及项目制作过程

    pip install django 创建项目 进入d:\projects 目录,执行 django-admin startproject bysms 创建 如下的目录结构: by…

    Python 2023年8月5日
    063
  • 美化Matplotlib的3个小技巧

    Matplotlib是Python的数据可视化库的基础。它是其他可视化工具(如Seaborn)的基础。 Matplotlib提供了很大的灵活性,因此您可以自定义或调整几乎所有的图表…

    Python 2023年8月24日
    066
  • Python数据分析中对DataFrame的数据分组处理groupby

    【小白从小学Python、C、Java】 【Python全国计算机等级考试】 【Python数据分析考试必会题】 ● 标题与摘要 Python数据分析中对DataFrame的 数据…

    Python 2023年8月7日
    049
  • conda 环境

    准备工作:配置 conda 镜像 默认的 conda 源下载速度比较慢,需要先将 conda 源设置为国内镜像 &#x6DFB;&#x52A0; Anaconda …

    Python 2023年9月8日
    032
  • numpy学习笔记

    numpy 创建数组array 一维数组的创建与修改 import numpy as py a = np.array([1, 2, 3, 4, 5]) b = np.array(r…

    Python 2023年8月28日
    040
  • Python逆向爬虫之scrapy框架,非常详细

    爬虫系列目录 配套视频地址:https://www.wotiecity.com/system/course/MTc=?cid=93332355 文章目录 Python逆向爬虫之sc…

    Python 2023年10月2日
    046
  • Lumerical—文件名后缀的含义

    Lumerical—文件名后缀的含义 引言 后缀名含义 作者说明 引言 在 Lumerical中,我们会遇到很多不同的文件类型,它们拥有着不同的后缀名,那么这些后缀名是…

    Python 2023年9月7日
    041
  • Python 超强命令行解析工具 argparse !

    在工作中,我们经常需要从命令行当中解析出指定的参数,而 Python 也提供了相应的标准库来做这件事情,比如 sys, optparse, getopt, argparse。这里面…

    Python 2023年11月9日
    028
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球