2018-08-10

具体的代码:

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,把基础打实些。根据教程写了四天写出来的。一个练手的程序。做工还很粗糙图画不会画,自己画的简笔画。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 大家好。小编通过这段时间学习做了一个超级简单的打飞机。现在贡献给大家。 我们先要建两个.py文件。小编在这里是建的...
    AnHuaFeng阅读 5,274评论 0 0
  • 这次呢,让我们重温一下儿时的乐趣,用Python做一个飞机大战的小游戏。接下来,让我们一起走进“飞机大战”。 一....
    HDhandi阅读 1,908评论 1 4
  • 一、快捷键 ctr+b 执行ctr+/ 单行注释ctr+c ...
    o_8319阅读 5,782评论 2 16
  • 这星期长见识了,虽然每星期都在学习新的内容,都在长见识,但是这次挺惊讶的,竟然可以用python,...
    要你何用杀了算了阅读 609评论 0 1
  • 夏筱 清清黄河(一) 你从唐古拉之巅一路走来 背着沉重带着咆哮的尘埃 混浊是你对满目荒野的...
    原香的夏小阅读 372评论 3 3