具體的代碼:
settings配置
import pygame
class Settings(object):
? ? """設(shè)置常用的屬性"""
? ? 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"]? # 英雄機(jī)圖片
? ? ? ? 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")# 英雄機(jī)的子彈
飛行物類
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):
? ? ? ? """飛行物移動(dòng)一步"""
? ? ? ? pass
? ? def shootBy(self, bullet):
? ? ? ? """檢查當(dāng)前飛行物是否被子彈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))
英雄機(jī)
from flyingObject import FlyingObject
from bullet import Bullet
import pygame
class Hero(FlyingObject):
? ? """英雄機(jī)"""
? ? index = 2? # 標(biāo)志位
? ? def __init__(self, screen, images):
? ? ? ? # self.screen = screen
? ? ? ?
? ? ? ? self.images = images? # 英雄級(jí)圖片數(shù)組,為Surface實(shí)例
? ? ? ? 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):
? ? ? ? """設(shè)置雙倍火力"""
? ? ? ? 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):
? ? ? ? """動(dòng)態(tài)顯示飛機(jī)"""
? ? ? ? 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):
? ? ? ? """英雄機(jī)射擊"""
? ? ? ? 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):
? ? ? ? """英雄機(jī)和其他飛機(jī)"""
? ? ? ? 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):
? ? """敵人买猖,敵人有分?jǐn)?shù)"""
? ? @abc.abstractmethod
? ? def getScore(self):
? ? ? ? """獲得分?jǐn)?shù)"""
? ? ? ? pass
award
import abc
class Award(object):
? ? """獎(jiǎng)勵(lì)"""
? ? DOUBLE_FIRE = 0
? ? LIFE = 1
? ? @abc.abstractmethod
? ? def getType(self):
? ? ? ? """獲得獎(jiǎng)勵(lì)類型"""
? ? ? ? pass
if __name__ == '__main__':
? ? print(Award.DOUBLE_FIRE)
airplane
import random
from flyingObject import FlyingObject
from enemy import Enemy
class Airplane(FlyingObject, Enemy):
? ? """普通敵機(jī)"""
? ? 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):
? ? ? ? """獲得的分?jǐn)?shù)"""
? ? ? ? return 5
? ? def outOfBounds(self):
? ? ? ? """是否越界"""
? ? ? ? return self.y < 715
? ? def step(self):
? ? ? ? """移動(dòng)"""
? ? ? ? self.y += 3? # 移動(dòng)步數(shù)
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):
? ? ? ? """移動(dòng)"""
? ? ? ? if self.x + self.width > 480:
? ? ? ? ? ? self.index = False
? ? ? ? if self.index == True:
? ? ? ? ? ? self.x += 3
? ? ? ? else:
? ? ? ? ? ? self.x -= 3
? ? ? ? self.y += 3? # 移動(dòng)步數(shù)
? ? 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) #創(chuàng)建窗口
hero=Hero(screen,sets.heroImages)
flyings=[]
bullets=[]
score=0
def hero_blitme():
"""畫英雄機(jī)"""
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():
"""畫分?jǐn)?shù)和生命值"""
pygame.font.init()
fontObj=pygame.font.Font("SIMYOU.TTF", 20) #創(chuàng)建font對(duì)象
textSurfaceObj=fontObj.render(u'生命值:%d\n分?jǐn)?shù):%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():
"""畫狀態(tài)"""
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) #本來準(zhǔn)備在寫幾個(gè)敵機(jī)的亮瓷,后面沒找到好看的圖片就刪了
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():
"""子彈入場(chǎng)灿巧,將子彈加到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):
"""子彈與敵人碰撞檢測(cè)"""
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() # 獲得分?jǐn)?shù)
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("飛機(jī)大戰(zhàn)")
while True:
? ? screen.blit(sets.bgImage, (0, 0))? # 加載屏幕
? ? action()
? ? pygame.display.update()? # 重新繪制屏幕
? ? # time.sleep(0.1)? ? ? # 過0.01秒執(zhí)行,減輕對(duì)cpu的壓力
if name == 'main':
main()
``` 寫這個(gè)主要是練習(xí)一下python缸濒,把基礎(chǔ)打?qū)嵭┕8鶕?jù)教程寫了四天寫出來的。一個(gè)練手的程序幻馁。做工還很粗糙圖畫不會(huì)畫洗鸵,自己畫的簡(jiǎn)筆畫。