首页 > 编程语言 >Python实战-飞机大战

Python实战-飞机大战

时间:2024-03-20 16:29:05浏览次数:23  
标签:实战 __ Python self rect 大战 pygame def names

plane_sprites:

import random
import pygame

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

游戏基类:

class GameSprite(pygame.sprite.Sprite):
    def __init__(self, img_name,speed=1):
        super().__init__()
        self.image=pygame.image.load(img_name)
        self.rect=self.image.get_rect()
        self.speed=speed

    def update(self):
        self.rect.top+=self.speed

    @staticmethod
    def img_names(prefix,count):
        names=[]
        for i in range(1,count+1):
            names.append('./images/'+prefix+str(i)+'.png')
        return names

背景:

class Bg(GameSprite):
    def __init__(self, is_alt=False):
        super().__init__("./images/background.png")
        if is_alt:
            self.rect.bottom=0

    def update(self):
        super().update()
        if self.rect.y>=SCREEN_RECT.height:
            self.rect.bottom=0

飞机类:

class Plane(GameSprite):
    def __init__(self, live_names,destroy_names,life, speed):
        super().__init__(live_names[0], speed)
        #生命值
        self.life=life
        #加载正常状态
        self.__live_imgs=[]
        for file_name in live_names:
            img=pygame.image.load(file_name)
            self.__live_imgs.append(img)
        #加载摧毁状态
        self.__destory_imgs=[]
        for file_name in destroy_names:
            img=pygame.image.load(file_name)
            self.__destory_imgs.append(img)
        #初始状态
        self.images=self.__live_imgs
        self.show_img_i=0
        #循环播放
        self.loop_show=True
        #是否被摧毁
        self.be_destroyed=False

    def update(self):
        super().update()
        self.update_imgs()

    def update_imgs(self):
        pre_i=int(self.show_img_i)
        #缓慢加载
        self.show_img_i+=0.05
        cnt=len(self.images)

        if self.loop_show:
            self.show_img_i%=cnt
        elif self.show_img_i>cnt-1:
            self.show_img_i=cnt-1
            self.be_destroyed=True

        current_i=int(self.show_img_i)
        #图片索引加到1了
        if pre_i!=current_i:
            self.image=self.images[current_i]

    def destroyed(self):
        self.images=self.__destory_imgs
        self.show_img_i=0
        self.loop_show=False

敌机:

class Enemy1(Plane):
    def __init__(self):
        live_names=["./images/enemy1.png"]
        destroy_names=GameSprite.img_names('enemy1_down',4)
        speed=random.randint(1, 3)
        super().__init__(live_names,destroy_names,2,speed)

        self.rect.bottom=0
        self.rect.x=random.randint(0,SCREEN_RECT.width-self.rect.width)

    def update(self):
        super().update()
        if self.be_destroyed:
            self.kill()
        if self.rect.bottom>=SCREEN_RECT.bottom:
            self.kill()

主角:

class Hero(Plane):
    def __init__(self):
        live_names=GameSprite.img_names('me',2)
        destroy_names=GameSprite.img_names('me_destroy_',4)
        super().__init__(live_names,destroy_names,0,0)

        self.rect.bottom=SCREEN_RECT.bottom-20
        self.rect.centerx=SCREEN_RECT.centerx

        self.bullets=pygame.sprite.Group()

    def update(self):
        self.update_imgs()
        self.rect.left+=self.speed
        if self.rect.left<0:
            self.rect.left=0
        elif self.rect.right>=SCREEN_RECT.right:
            self.rect.right=SCREEN_RECT.right

    def fire(self):
        bul=Bullet()
        bul.rect.bottom=self.rect.y-20
        bul.rect.centerx=self.rect.centerx
        self.bullets.add(bul)

子弹:

class Bullet(GameSprite):
    def __init__(self):
        live_names="./images/bullet1.png"
        super().__init__(live_names,-2)

    def update(self):
        super().update()
        if self.rect.bottom<=0:
            self.kill()
    
plane_main:

import pygame
from plane_sprites import *

FRAME_PRE_SEC=60
CREATE_ENEMY_EVENT=pygame.USEREVENT
HERO_FIRE_EVENT=pygame.USEREVENT+1

设置游戏:



class PlaneGame(object):
    def __init__(self):
        print('游戏初始化...')
        pygame.init()
        self.score=0
        self.screen=pygame.display.set_mode(SCREEN_RECT.size)
        self.clock=pygame.time.Clock()
        self.__create_sprites()
        self.__create_user_events()


    def __create_sprites(self):
        #创建背景(背景移动)
        self.bg_group=pygame.sprite.Group(Bg(),Bg(True))
        #敌机
        self.enemy_group=pygame.sprite.Group()
        self.destroy_group=pygame.sprite.Group()
        #飞机
        self.hero=Hero()
        self.hero_group=pygame.sprite.Group(self.hero)
    
    @staticmethod
    def __create_user_events():
        #设置定时器事件,每一秒创建敌机
        pygame.time.set_timer(CREATE_ENEMY_EVENT,1000)
        #英雄每0.2s发射子弹
        pygame.time.set_timer(HERO_FIRE_EVENT,200)

    def start_game(self):
        print('游戏开始...')
        while True:
            self.clock.tick(FRAME_PRE_SEC)
            self.__event_handler()
            self.__update_sprites()
            self.__check_collide()
            pygame.display.update()
    
    def __event_handler(self):
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                PlaneGame.__game_over()
            elif event.type==CREATE_ENEMY_EVENT:
                self.enemy_group.add(Enemy1())
            elif event.type==HERO_FIRE_EVENT:
                self.hero.fire()
            # elif event.type==pygame.KEYDOWN and event.key==pygame.K_RIGHT:
            #     print('向右移动')#不能连续按
        if self.hero.be_destroyed:
            PlaneGame.__game_over()
        keys_pressed=pygame.key.get_pressed()
        # if keys_pressed[pygame.K_RIGHT]:
        #     self.hero.speed=3
        # elif keys_pressed[pygame.K_LEFT]:
        #     self.hero.speed=-3
        # else:
        #     self.hero.speed=0
        dir=keys_pressed[pygame.K_RIGHT]-keys_pressed[pygame.K_LEFT]
        self.hero.speed=dir*2

    def __check_collide(self):
        enemies=pygame.sprite.groupcollide(self.enemy_group,
                                             self.hero.bullets,
                                             False,
                                             True).keys()
        for enemy in enemies:
            enemy.life-=1
            if enemy.life<=0:
                enemy.add(self.destroy_group)
                enemy.remove(self.enemy_group)
                enemy.speed=1
                enemy.destroyed()
                self.score+=100
        for i in pygame.sprite.spritecollide(self.hero,self.enemy_group,True):
            print('英雄牺牲了...')
            self.hero.destroyed()


    def __update_sprites(self):
        for group in [self.bg_group, self.hero_group,
                      self.hero.bullets, self.enemy_group,
                      self.destroy_group]:
            group.update()
            group.draw(self.screen)

        font=pygame.font.SysFont(None,30)#30大小
        dy='score:{}'.format(self.score)
        s=font.render(dy,True,'purple')
        self.screen.blit(s,(350,10))


    @staticmethod
    def __game_over():
        print('游戏结束')
        pygame.quit()
        exit()

执行:

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

results:

标签:实战,__,Python,self,rect,大战,pygame,def,names
From: https://blog.csdn.net/qq_69866029/article/details/136719745

相关文章

  • Java调用python服务接口https遇到证书问题的具体解决
    是这样的,大概前一段时间做过一个业务,一直没有记录下来就是我们的算法部,封装好了一系列的算法,然后是python写的。而我们需要用Java去调用他们的方法。如何处理这个问题呢就是我在python里面写了一个rest-api,暴露出几个接口,供Java这边调。但是不知道为什么算法部当时那边弄了个......
  • 【python】Python实现梯度下降算法
    (文末包含完整代码)导入需要的包importnumpyasnpimportmatplotlib.pyplotasplt定义函数defget_y(x):y=x**2+x*2+1returny计算梯度defget_gradient(x):getgradient=2*x+2returngetgradient采用梯度下降计算函数最小值时自......
  • Python就该这样学,纯小白速通Python!学习大纲整理,建议保存
    一、学习建议1、找到自己感兴趣的方向,并且结合市场需求进行选择Python的应用范围测试运维web人工智能大数据爬虫及数据分析办公自动化2、学习过程中一定要勤加练习,并且尝试去使用学习过的内容实现一些简答的功能遇到技术问题不要慌,解决问题的过程也是加速自己成长的途......
  • 一个入门级python爬虫教程详解
    前言当你需要每天对Excel做大量重复的操作,如果只靠人工来做既浪费时间,又十分枯燥,好在Python为我们提供了许多操作Excel的模块,能够让我们从繁琐的工作中腾出双手。今天就和大家分享一个快速处理Excel的模块openpyxl,它的功能相对与其他模块更为齐全,足够应对日常出......
  • 人人都想自学Python,为什么坚持下来的没几个?
    随着云计算/自动化/人工智能的时代来临,Python语言也成为了当下最热门的语言之一。有的人开始自学,有的人通过面对面授课学习,也有一些人浅尝辄止。那么,为什么有一大批人最终停止在学Python的道路上呢?最后,如果大家如果在自学遇到困难,想找一个Python学习环境,可以加入我们的Py......
  • Linux环境运行python项目提示No module named '_ssl'
    版本python3.11.4控制台错误提醒File"/usr/local/python3/lib/python3.11/ssl.py",line100,in<module> import_ssl#ifwecan'timportit,lettheerrorpropagate ^^^^^^^^^^^ModuleNotFoundError:Nomodulenamed'_ssl'错误原因:ce......
  • Python修炼秘籍--Python数值类型(Day3)
    数值类型(Day3)一、数字类型1、整数:int2、布尔值:bool3、浮点数:float4、复数:complex5、数值运算符二、数字类型转换1、整数转换函数2、浮点数转换函数3、eval(‘x’)函数三、常用数学函数1、pow(x,y)1、pow(x,y,z)2、max(arg1,arg2,…)3、min(arg1,arg2,…)4、divmod(x,......
  • Python修炼秘籍--Python语言基础(Day2)
    Python语言基础(Day2)一、数据与数据类型1、数据2、数值类型3、文本序列:字符串4、序列类型5、集合和字典类型二、对象与变量1、对象2、变量3、变量(标识符)命名4、关键字(保留字)三、编码与命名规范1、编码规范2、Python编码规范PEP83、命名规范一、数据与数据类型1、......
  • 流畅的 Python 第二版(GPT 重译)(九)
    第四部分:控制流第十七章:迭代器、生成器和经典协程当我在我的程序中看到模式时,我认为这是一个麻烦的迹象。程序的形状应该只反映它需要解决的问题。代码中的任何其他规律性对我来说都是一个迹象,至少对我来说,这表明我使用的抽象不够强大——通常是我手动生成我需要编写的某个宏的......
  • 流畅的 Python 第二版(GPT 重译)(十三)
    第二十四章:类元编程每个人都知道调试比一开始编写程序要困难两倍。所以如果你在编写时尽可能聪明,那么你将如何调试呢?BrianW.Kernighan和P.J.Plauger,《编程风格的要素》¹类元编程是在运行时创建或自定义类的艺术。在Python中,类是一等对象,因此可以使用函数在任何时候......