1. 程式人生 > 實用技巧 >python實踐——飛機大戰

python實踐——飛機大戰

需求: 我方飛機,敵方飛機,我方子彈,敵方子彈

功能: 我方飛機根據按鍵移動,敵方飛機也可以隨機自動移動

    雙方飛機都可以傳送子彈

    背景音樂的新增

步驟:

建立一個視窗

建立一個玩家飛機,根據方向鍵左右的移動

給我方飛機添加發射子彈的功能【按空格鍵傳送】

建立一個敵人飛機,敵人飛機可以自由的移動

敵人飛機可以自動的發射子彈

import pygame
from pygame.locals import *   ##匯入所有東西

def main ():
    screen=pygame.display.set_mode((700,400),0,32)    ##建立一個視窗
    backgrond=pygame.image.load('
./feiji/background.jpg') #設定一個背景圖 pygame.display.set_caption('cz大戰zwt') ###新增背景音樂 pygame.mixer.init() pygame.mixer.music.load('./feiji/background.mp3') pygame.mixer.music.set_volume(0.2) #設定音量 pygame.mixer.music.play(-1) ##無限迴圈 ##載入玩家飛機圖片 zwt=pygame.image.load('./feiji/zwt.png
') x,y=0,0 while True: screen.blit(backgrond,(0,0)) ##居中顯示背景圖 screen.blit(zwt, (x, y)) ##顯示玩家zwt圖片 ##獲取鍵盤事件 eventlist=pygame.event.get() for event in eventlist: if event.type==QUIT: print('退出') exit()
pass elif event.type==KEYDOWN: if event.type==K_a or event.key==K_LEFT: print('left') if x>0: x-=30 elif event.type==K_d or event.key==K_RIGHT: print('right') if x<620: x+=30 elif event.key == K_SPACE: print('k_SPACE') pygame.display.update() ##更新顯示內容 pass if __name__=='__main__': main()
面向過程

面向過程,程式碼臃腫,不易修改

import  pygame
import random
import time
from  pygame.locals import *
'''
實現飛機的顯示,控制飛機的移動
'''
class HeroPlane(object):
    def __init__(self,screen):
        ##飛機的預設位置
        self.x=225
        self.y=510
        ##設定顯示內容視窗
        self.screen=screen
        ##生成飛機的圖片物件
        #elf.imageName='./feiji/zwt.png'
        self.image=pygame.image.load('./feiji/zwt.png')
        ##存放子彈列表
        self.bulletList=[]
        #self.image=pygame.image.load(self.imageName)
        pass
    def moveleft(self):
        if self.x>0:
            self.x-=30
        pass
    def moveright(self):
        if self.x<380:
            self.x+=30
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        ##完善子彈展示邏輯
        needDelItemList=[]
        for item in self.bulletList:
            if item.judge():
                needDelItemList.append(item)
        ###重新遍歷
        for i in needDelItemList:
            self.bulletList.remove(i)
        for bullet in self.bulletList:
            bullet.display()##顯示子彈的位置
            bullet.move()##讓子彈進行移動,下次再顯示的時候就會看到子彈修改後的位置
        pass
    def sheBullet(self):
        newBullet=Bullet(self.x,self.y,self.screen)
        self.bulletList.append(newBullet)
        pass
    pass

###建立子彈類物件
class Bullet(object):
    def __init__(self,x,y,screen):
        self.x=x+13
        self.y=y-20
        self.screen=screen
        self.imgage=pygame.image.load('./feiji/Bullet.png')
        pass
    def display(self):
        self.screen.blit(self.imgage,(self.x,self.y))
    def move(self):
        self.y-=8

    def judge(self):
        ##判斷子彈越界
        if self.y<0:
            return True
        else:
            return False
##敵人子彈
class EnemyBullet(object):
    def __init__(self,x,y,screen):
        self.x=x
        self.y=y+60
        self.screen=screen
        self.imgage=pygame.image.load('./feiji/Bullet2.png')
        pass
    def display(self):
        self.screen.blit(self.imgage,(self.x,self.y))
    def move(self):
        self.y+=2

    def judge(self):
        ##判斷子彈越界
        if self.y>550:
            return True
        else:
            return False

##建立敵人
class EnemyPlane:
    def __init__(self, screen):
        ##m預設設定一個方向
        self.direction='right'
        ##飛機的預設位置
        self.x = 0
        self.y = 0
        ##設定顯示內容視窗
        self.screen = screen
        ##生成飛機的圖片物件
        # elf.imageName='./feiji/zwt.png'
        self.image = pygame.image.load('./feiji/cz.png')
        self.bulletList=[]
        pass
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
        needDelItemList = []
        for item in self.bulletList:
            if item.judge():
                needDelItemList.append(item)
        ###重新遍歷
        for i in needDelItemList:
            self.bulletList.remove(i)
        for bullet in self.bulletList:
            bullet.display()  ##顯示子彈的位置
            bullet.move()  ##讓子彈進行移動,下次再顯示的時候就會看到子彈修改後的位置
    def sheBullet(self):
        ###敵人隨機發射子彈
        num=random.randint(1,20)
        if num==3:
            newBullet=EnemyBullet(self.x,self.y,self.screen)
            self.bulletList.append(newBullet)
    def move(self):
        ##隨機移動
        if self.direction=='right':
            self.x+=2
        elif self.direction=='left':
            self.x-=2

        if self.x>410:
            self.direction='left'
        elif self.x<0:
            self.direction='right'
##控制鍵盤
def key_control(HeroObj):
    eventlist = pygame.event.get()
    for event in eventlist:
        if event.type == QUIT:
            print('退出')
            exit()
            pass
        elif event.type == KEYDOWN:
            if event.type == K_a or event.key == K_LEFT:
                print('left')
                HeroObj.moveleft()
            elif event.type == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveright()
            elif event.key == K_SPACE:
                print('k_SPACE')
                HeroObj.sheBullet()
    pass
##主函式
def main ():
    screen=pygame.display.set_mode((450,550),0,32)    ##建立一個視窗
    backgrond=pygame.image.load('./feiji/background.jpg') #設定一個背景圖
    pygame.display.set_caption('cz大戰zwt')
    ###新增背景音樂
    pygame.mixer.init()
    pygame.mixer.music.load('./feiji/background.mp3')
    pygame.mixer.music.set_volume(0.1)  #設定音量
    pygame.mixer.music.play(-1)  ##無限迴圈
    ##建立飛機物件
    hero=HeroPlane(screen)
    ##建立敵人
    enemyplane=EnemyPlane(screen)
    while True:
            screen.blit(backgrond,(0,0))  ##居中顯示背景圖
            hero.display()  ##顯示我方飛機
            enemyplane.display() ##顯示敵人
            enemyplane.move()##敵人移動
            enemyplane.sheBullet()##敵人發射子彈
            key_control(hero)
            pygame.display.update()  ##更新顯示內容
            pygame.time.Clock().tick(15)##一秒執行多少次

if __name__=='__main__':
    main()
面向物件

import  pygame
import random
import time
from  pygame.locals import *

##抽象出來一個飛機的基類
class BasePlane(object):
    def __init__(self,screen,imagePath):
        self.screen=screen
        self.image=pygame.image.load(imagePath)
        self.bulletList=[]
    def display(self):
        self.screen.blit(self.image, (self.x, self.y))
        ##完善子彈展示邏輯
        needDelItemList = []
        for item in self.bulletList:
            if item.judge():
                needDelItemList.append(item)
        ###重新遍歷
        for i in needDelItemList:
            self.bulletList.remove(i)
        for bullet in self.bulletList:
            bullet.display()  ##顯示子彈的位置
            bullet.move()  ##讓子彈進行移動,下次再顯示的時候就會看到子彈修改後的位置
class CommonBullet(object):
    def __init__(self,x,y,screen,bulletType):
        self.type=bulletType
        self.screen=screen
        if self.type=='hero':
            self.x=x+13
            self.y=y-20
            self.imagePath='./feiji/Bullet.png'
        elif self.type=='enemy':
            self.x=x
            self.y=y+60
            self.imagePath='./feiji/Bullet2.png'
        self.image=pygame.image.load(self.imagePath)
    def move(self):
        if self.type=='hero':
            self.y-=2
        elif self.type=='enemy':
            self.y+=2
    def display(self):
        self.screen.blit(self.image,(self.x,self.y))
    def judge(self):
        if self.y>550 or self.y<0:
            return True
        else:
            return False
class HeroPlane(BasePlane):
    def __init__(self,screen):
        ##飛機的預設位置
        self.x=225
        self.y=510
        super().__init__(screen,'./feiji/zwt.png')
    def moveleft(self):
        if self.x>0:
            self.x-=30
        pass
    def moveright(self):
        if self.x<380:
            self.x+=30
        pass
    def sheBullet(self):
        newBullet=CommonBullet(self.x,self.y,self.screen,'hero')
        self.bulletList.append(newBullet)
        pass
##建立敵人
class EnemyPlane(BasePlane):
    def __init__(self, screen):
        ##m預設設定一個方向
        self.direction='right'
        ##飛機的預設位置
        self.x = 0
        self.y = 0
        super().__init__(screen,'./feiji/cz.png')
        pass
    def sheBullet(self):
        ###敵人隨機發射子彈
        num=random.randint(1,20)
        if num==3:
            newBullet=CommonBullet(self.x,self.y,self.screen,'enemy')
            self.bulletList.append(newBullet)
    def move(self):
        ##隨機移動
        if self.direction=='right':
            self.x+=2
        elif self.direction=='left':
            self.x-=2

        if self.x>410:
            self.direction='left'
        elif self.x<0:
            self.direction='right'
def key_control(HeroObj):
    eventlist = pygame.event.get()
    for event in eventlist:
        if event.type == QUIT:
            print('退出')
            exit()
            pass
        elif event.type == KEYDOWN:
            if event.type == K_a or event.key == K_LEFT:
                print('left')
                HeroObj.moveleft()
            elif event.type == K_d or event.key == K_RIGHT:
                print('right')
                HeroObj.moveright()
            elif event.key == K_SPACE:
                print('k_SPACE')
                HeroObj.sheBullet()
    pass
def main ():
    screen=pygame.display.set_mode((450,550),0,32)    ##建立一個視窗
    backgrond=pygame.image.load('./feiji/background.jpg') #設定一個背景圖
    pygame.display.set_caption('cz大戰zwt')
    ###新增背景音樂
    pygame.mixer.init()
    pygame.mixer.music.load('./feiji/background.mp3')
    pygame.mixer.music.set_volume(0.1)  #設定音量
    pygame.mixer.music.play(-1)  ##無限迴圈
    ##建立飛機物件
    hero=HeroPlane(screen)
    ##建立敵人
    enemyplane=EnemyPlane(screen)
    while True:
            screen.blit(backgrond,(0,0))  ##居中顯示背景圖
            hero.display()  ##顯示我方飛機
            enemyplane.display() ##顯示敵人
            enemyplane.move()##敵人移動
            enemyplane.sheBullet()##敵人發射子彈
            key_control(hero)
            pygame.display.update()  ##更新顯示內容
            pygame.time.Clock().tick(15)##一秒執行多少次

if __name__=='__main__':
    main()
優化結構後