python飞机大战源代码(可直接运行)_飞机大战python源代码-程序员宅基地

技术标签: python  fjdz  

喜欢的点个赞支持一下哦

联系方式见评论区--------------欢迎大家一起探讨-----------------------------------------------------------------

 

具体的代码:
settings配置
import pygame


class Settings(object):
    """设置常用的属性"""


    def __init__(self):
        self.bgImage = pygame.image.load('img/background.png')  # 背景图


        self.bgImageWidth = self.bgImage.get_rect()[2]  # 背景图宽
        self.bgImageHeight = self.bgImage.get_rect()[3]  # 背景图高
        self.start=pygame.image.load("img/start.png")
        self.pause=pygame.image.load("img/pause.png")
        self.gameover=pygame.image.load("img/gameover.png")
        self.heroImages = ["img/hero.gif",
                           "img/hero1.png", "img/hero2.png"]  # 英雄机图片
        self.airImage = pygame.image.load("img/enemy0.png") # airplane的图片
        self.beeImage = pygame.image.load("img/bee.png") # bee的图片
        self.heroBullet=pygame.image.load("img/bullet.png")# 英雄机的子弹
飞行物类
import abc




class FlyingObject(object):
    """飞行物类,基类"""


    def __init__(self, screen, x, y, image):
        self.screen = screen
        self.x = x
        self.y = y
        self.width = image.get_rect()[2]
        self.height = image.get_rect()[3]
        self.image = image


    @abc.abstractmethod
    def outOfBounds(self):
        """检查是否越界"""
        pass


    @abc.abstractmethod
    def step(self):
        """飞行物移动一步"""
        pass


    def shootBy(self, bullet):
        """检查当前飞行物是否被子弹bullet(x,y)击中"""
        x1 = self.x
        x2 = self.x + self.width
        y1 = self.y
        y2 = self.y + self.height
        x = bullet.x
        y = bullet.y
        return x > x1 and x < x2 and y > y1 and y < y2


    def blitme(self):
        """打印飞行物"""
        self.screen.blit(self.image, (self.x, self.y))
英雄机
from flyingObject import FlyingObject
from bullet import Bullet
import pygame




class Hero(FlyingObject):
    """英雄机"""
    index = 2  # 标志位
    def __init__(self, screen, images):


        # self.screen = screen
        
        self.images = images  # 英雄级图片数组,为Surface实例
        image = pygame.image.load(images[0])
        x = screen.get_rect().centerx
        y = screen.get_rect().bottom
        super(Hero,self).__init__(screen,x,y,image)
        self.life = 3  # 生命值为3
        self.doubleFire = 0  # 初始火力值为0


    def isDoubleFire(self):
        """获取双倍火力"""
        return self.doubleFire


    def setDoubleFire(self):
        """设置双倍火力"""
        self.doubleFire = 40


    def addDoubleFire(self):
        """增加火力值"""
        self.doubleFire += 100
    def clearDoubleFire(self):
        """清空火力值"""
        self.doubleFire=0


    def addLife(self):
        """增命"""
        self.life += 1
    
    def sublife(self):
        """减命"""
        self.life-=1
   
    def getLife(self):
        """获取生命值"""
        return self.life
    def reLife(self):
        self.life=3
        self.clearDoubleFire()




    def outOfBounds(self):
        return False


    def step(self):
        """动态显示飞机"""
        if(len(self.images) > 0):
            Hero.index += 1
            Hero.index %= len(self.images)
            self.image = pygame.image.load(self.images[int(Hero.index)])  # 切换图片


    def move(self, x, y):
        self.x = x - self.width / 2
        self.y = y - self.height / 2


    def shoot(self,image):
        """英雄机射击"""
        xStep=int(self.width/4-5)
        yStep=20
        if self.doubleFire>=100:
            heroBullet=[Bullet(self.screen,image,self.x+1*xStep,self.y-yStep),Bullet(self.screen,image,self.x+2*xStep,self.y-yStep),Bullet(self.screen,image,self.x+3*xStep,self.y-yStep)]
            self.doubleFire-=3
            return heroBullet
        elif self.doubleFire<100 and self.doubleFire > 0:
            heroBullet=[Bullet(self.screen,image,self.x+1*xStep,self.y-yStep),Bullet(self.screen,image,self.x+3*xStep,self.y-yStep)]
            self.doubleFire-=2
            return heroBullet
        else:
            heroBullet=[Bullet(self.screen,image,self.x+2*xStep,self.y-yStep)]
            return heroBullet


    def hit(self,other):
        """英雄机和其他飞机"""
        x1=other.x-self.width/2
        x2=other.x+self.width/2+other.width
        y1=other.y-self.height/2
        y2=other.y+self.height/2+other.height
        x=self.x+self.width/2
        y=self.y+self.height
        return x>x1 and x<x2 and y>y1 and y<y2
enemys
import abc


class Enemy(object):
    """敌人,敌人有分数"""
    @abc.abstractmethod
    def getScore(self):
        """获得分数"""
        pass
award
import abc




class Award(object):
    """奖励"""
    DOUBLE_FIRE = 0
    LIFE = 1


    @abc.abstractmethod
    def getType(self):
        """获得奖励类型"""
        pass




if __name__ == '__main__':


    print(Award.DOUBLE_FIRE)
airplane
import random
from flyingObject import FlyingObject
from enemy import Enemy




class Airplane(FlyingObject, Enemy):
    """普通敌机"""


    def __init__(self, screen, image):


        x = random.randint(0, screen.get_rect()[2] - 50)
        y = -40
        super(Airplane, self).__init__(screen, x, y, image)


    def getScore(self):
        """获得的分数"""
        return 5


    def outOfBounds(self):
        """是否越界"""


        return self.y < 715


    def step(self):
        """移动"""
        self.y += 3  # 移动步数
Bee
import random
from flyingObject import FlyingObject
from award import Award




class Bee(FlyingObject, Award):


    def __init__(self, screen, image):
        x = random.randint(0, screen.get_rect()[2] - 60)
        y = -50
        super(Bee, self).__init__(screen, x, y, image)
        self.awardType = random.randint(0, 1)
        self.index = True


    def outOfBounds(self):
        """是否越界"""
        return self.y < 715


    def step(self):
        """移动"""
        if self.x + self.width > 480:
            self.index = False
        if self.index == True:
            self.x += 3
        else:
            self.x -= 3
        self.y += 3  # 移动步数


    def getType(self):
        return self.awardType
主类
```python
import pygame
import sys
import random
from setting import Settings
from hero import Hero
from airplane import Airplane
from bee import Bee
from enemy import Enemy
from award import Award


START=0
RUNNING=1
PAUSE=2
GAMEOVER=3
state=START
sets = Settings()
screen = pygame.display.set_mode(
(sets.bgImageWidth, sets.bgImageHeight), 0, 32) #创建窗口
hero=Hero(screen,sets.heroImages)
flyings=[]
bullets=[]
score=0
def hero_blitme():
"""画英雄机"""
global hero
hero.blitme()


def bullets_blitme():
"""画子弹"""
for b in bullets:
b.blitme()


def flyings_blitme():
"""画飞行物"""
global sets
for fly in flyings:
fly.blitme()


def score_blitme():
"""画分数和生命值"""
pygame.font.init()
fontObj=pygame.font.Font("SIMYOU.TTF", 20) #创建font对象
textSurfaceObj=fontObj.render(u'生命值:%d\n分数:%d\n火力值:%d'%(hero.getLife(),score,hero.isDoubleFire()),False,(135,100,184))
textRectObj=textSurfaceObj.get_rect()
textRectObj.center=(300,40)
screen.blit(textSurfaceObj,textRectObj)


def state_blitme():
"""画状态"""
global sets
global state
if state==START:
screen.blit(sets.start, (0,0))
elif state==PAUSE:
screen.blit(sets.pause,(0,0))
elif state== GAMEOVER:
screen.blit(sets.gameover,(0,0))


def blitmes():
"""画图"""
hero_blitme()
flyings_blitme()
bullets_blitme()
score_blitme()
state_blitme()


def nextOne():
"""生成敌人"""
type=random.randint(0,20)
if type<4:
return Bee(screen,sets.beeImage)
elif type==5:
return Bee(screen,sets.beeImage) #本来准备在写几个敌机的,后面没找到好看的图片就删了
else:
return Airplane(screen,sets.airImage)


flyEnteredIndex=0
def enterAction():
"""生成敌人"""
global flyEnteredIndex
flyEnteredIndex+=1
if flyEnteredIndex%40==0:
flyingobj=nextOne()
flyings.append(flyingobj)


shootIndex=0
def shootAction():
"""子弹入场,将子弹加到bullets"""
global shootIndex
shootIndex +=1
if shootIndex % 10 ==0:
heroBullet=hero.shoot(sets.heroBullet)
for bb in heroBullet:
bullets.append(bb)


def stepAction():
"""飞行物走一步"""


hero.step()
for flyobj in flyings:
    flyobj.step()
global bullets
for b in bullets:       
    b.step()
def outOfBoundAction():
"""删除越界的敌人和飞行物"""
global flyings
flyingLives=[]
index=0
for f in flyings:
if f.outOfBounds()==True:
flyingLives.insert(index,f)
index+=1
flyings=flyingLives
index=0
global bullets
bulletsLive=[]
for b in bullets:
if b.outOfBounds()==True:
bulletsLive.insert(index,b)
index+=1
bullets=bulletsLive


j=0
def bangAction():
"""子弹与敌人碰撞"""
for b in bullets:
bang(b)


def bang(b):
"""子弹与敌人碰撞检测"""
index=-1
for x in range(0,len(flyings)):
f=flyings[x]
if f.shootBy(b):
index=x
break
if index!=-1:
one=flyings[index]
if isinstance(one,Enemy):
global score
score+=one.getScore() # 获得分数
flyings.remove(one) # 删除


    if isinstance(one,Award):
        type=one.getType()
        if type==Award.DOUBLE_FIRE:
            hero.addDoubleFire()
        else:
            hero.addLife()
        flyings.remove(one)


    bullets.remove(b)
def checkGameOverAction():
if isGameOver():
global state
state=GAMEOVER
hero.reLife()


def isGameOver():
for f in flyings:
if hero.hit(f):
hero.sublife()
hero.clearDoubleFire()
flyings.remove(f)


return hero.getLife()<=0
def action():
x, y = pygame.mouse.get_pos()


blitmes()  #打印飞行物 
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        sys.exit()
    if event.type == pygame.MOUSEBUTTONDOWN:
        flag=pygame.mouse.get_pressed()[0] #左键单击事件
        rflag=pygame.mouse.get_pressed()[2] #右键单击事件
        global state
        if flag==True and (state==START or state==PAUSE):
            state=RUNNING
        if flag==True and state==GAMEOVER:
            state=START
        if rflag==True:
            state=PAUSE


if state==RUNNING:
    hero.move(x,y)  
    enterAction()
    shootAction()
    stepAction()      
    outOfBoundAction()
    bangAction()
    checkGameOverAction()


     
def main():


pygame.display.set_caption("飞机大战")


while True:
    screen.blit(sets.bgImage, (0, 0))  # 加载屏幕


    action()
    pygame.display.update()  # 重新绘制屏幕
    # time.sleep(0.1)       # 过0.01秒执行,减轻对cpu的压力
if name == 'main':
main()


``` 写这个主要是练习一下python,把基础打实些。pygame的文本书写是没有换行,得在新建一个对象去写,为了简单我把文本都书写在了一行。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/caozewei/article/details/81015192

智能推荐

Matlab系列之符号运算(下)_syms eqn可以是矩阵吗-程序员宅基地

文章浏览阅读702次。Matlab系列之符号运算(下)续符号矩阵符号矩阵的生成符号矩阵的运算符号微积分极限微分积分符号积分变换Fourier变换及其逆变换Laplace变换及其逆变换z变换及其逆变换符号方程求解代数方程求解微分方程求解无穷级数的求和运算更多精彩,等你发现~续上一篇主要对符号对象进行了一些生成和使用的基本操作,然后本篇将介绍符号矩阵、微积分、积分变换以及符号方程的求解,具体内容就往下慢慢看了。符号矩阵符号矩阵的生成符号矩阵的生成和数值矩阵的相关操作类似,创建方法有以下的几种:1、直接创建符号矩阵2、用_syms eqn可以是矩阵吗

SpringBoot统一异常通用处理_spring boot <root level="error">-程序员宅基地

文章浏览阅读352次。一 日志1 什么是日志通过日志查看程序的运行过程,运行信息,异常信息等。2 配置日志级别日志记录器(Logger)的行为是分等级的。一般分为:FATAL(致命)、ERROR(错误)、WARN(警告)、INFO(信息)、DEBUG(调试)默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别# 设置日志级别为ERRORlogging: level: root: ERROR这种方式能将ERROR级别以及以上级别的日志打_spring boot

Microsoft .NET Framework 安装未成功(证书方面)-程序员宅基地

文章浏览阅读4.3k次。问题:在为windows7 sp1安装framework 4.6.2的时候,有两次证书方面的报错// 错误1:无法建立到信任根颁发机构的证书链// 错误2:已处理证书链,但是在不受信任的根证书中终止查找资料:经过查找,发现在4.6的前期版本,就已经有过次问题的解决方案,比如类似的文章:.NET Framework 4.6.1/4.6 的安全性更新 31360..._netframework4.6.2安装未成功

CAN总线的物理层分析(三)_can物理层需求分析-程序员宅基地

文章浏览阅读2.4k次。一、CAN拓扑网络连接在CAN总线上的设备叫做节点设备(CAN Node),CAN网络的拓扑一般为线型。线束最常用的是双绞线,线上传输为对称的差分电平信号。下图为CAN总线网络示意图,节点主要包括Host、控制器和收发器。Host常集成有CAN控制器,CAN控制器负责处理协议相关功能,以减轻Host的负担。CAN收发器将控制器连接到传输媒介。通常控制器和总线收发器通过光耦或磁耦隔离,这样即使总..._can物理层需求分析

随便推点

人工智能/数据科学比赛汇总 2019.6_l2rpn ijcnn 2019-程序员宅基地

文章浏览阅读5.1w次,点赞2次,收藏13次。内容来自 DataSciComp,人工智能/数据科学比赛整理平台。Github:iphysresearch/DataSciComp本项目由 ApacheCN 强力支持。微博 | 知乎 | CSDN | 简书 | OSChina | 博客园2019世界机器人大赛—BCI脑控机器人大赛 暨 第三届中国脑机接口比赛http://www.worldrobotconference.com/ht..._l2rpn ijcnn 2019

九度题目1074对称平方数_1074是谁的平方-程序员宅基地

文章浏览阅读500次。#includeint main(){ int n,p,i,x,m; n=0; while(n bool c=true; int a[10]; p=n*n; i=0; while(p>0){ a[i]=p%10; p=p/10; i++; } if(i==1){ printf("%d\n",n);_1074是谁的平方

过滤器Filter与拦截器Interceptor原理分析与区别_过滤器和拦截器的底层原理-程序员宅基地

文章浏览阅读1k次。对过滤器与拦截器主要区别进行概述,主要阐述两者执行顺序_过滤器和拦截器的底层原理

数据流处理与DMP数据平台的关系-程序员宅基地

文章浏览阅读842次,点赞12次,收藏9次。1.背景介绍1. 背景介绍数据流处理(Data Stream Processing)和DMP数据平台(DMP,Data Management Platform)都是在大数据时代中广泛应用的技术。数据流处理主要用于实时处理和分析大量、高速变化的数据,而DMP数据平台则是用于管理、整合和分析来自多个渠道的用户数据,以实现有针对性的营销和推广活动。在这篇文章中,我们将深入探讨数据流处理与DM...

自然语言处理与AI语言模型的道德与法律问题-程序员宅基地

文章浏览阅读263次,点赞5次,收藏3次。1.背景介绍1. 背景介绍自然语言处理(NLP)是人工智能领域的一个重要分支,旨在让计算机理解、生成和处理人类语言。随着深度学习技术的发展,AI语言模型(例如GPT-3、BERT等)在语言理解和生成方面取得了显著进展。然而,这些模型也引发了一系列道德和法律问题,需要我们深入思考和解决。本文将从以下几个方面探讨NLP和AI语言模型的道德与法律问题:数据收集与隐私保护模型偏见与公平...

Python之Request库的安装_request whl-程序员宅基地

文章浏览阅读1.8w次,点赞5次,收藏33次。方法一:以管理员身份运行cmd,执行 pip install requests若撞墙,可以试试 pip --trusted-host pypi.python.org install requests还不行的话,在撞墙的link上获取压缩包,解压后执行进入文件夹的命令(以我的为例)cd C:\Program Files\Python36\Lib\requests-2.7.0进入文件夹,执行安装命令..._request whl