python可以做什麼?
可以做日常任務,比如自動備份你的MP3;
可以做網站,很多著名的網站像知乎、YouTube就是Python寫的;
可以做網絡遊戲的後臺,很多在線遊戲的後臺都是Python開發的。
但是今天要教你用python打手槍。
簡述:
相信很多朋友都用java 寫過飛機大戰,在自己學完python基礎以後就開始寫python版飛機大戰,今天把用pygame實現飛機大戰的遊戲分享給大家。
Pygame是跨平臺Python模塊,專為電子遊戲設計,包含圖像、聲音。
建立在SDL基礎上,允許實時電子遊戲研發而無需被低級語言《如機器語言和匯編語言》束縛。
—–百度百科
pygame知識前瞻:
- 1.遊戲的初始化和退出
- pygame.init() 導入並初始化 所有pygame模塊 在使用其他模塊之前 必須先調用init 方法
- pygame.quit() 卸載所有pygame 模塊 在遊戲結束之前調用
- 2.理解遊戲中的坐標系
- 原點 在左上角《0,0》
- x 軸 水平方向向右 逐漸增加
- y 軸 垂直方向向下 逐漸增加
- xy指定位置 寬和高指定大小
- 註:
- 遊戲中所有可見元素 都是以矩形區域描述
- pygame.Rect 用來描述 矩形區域 不需要使用init方法
- 3.創建遊戲的主窗口
- pygame.display
- pygame.display.set_mode《》
- resolution 指定屏幕的 寬和高 用元組指定
- flags 指定屏幕的附加選項 是否全屏
- depth 表示顏色的位數 默認自動匹配
代碼結構:
main.py 主函數
myplane.py 英雄機類
enemy.py 敵機類
bullet.py 子彈類
supply.py 子彈供給類
程序執行流程:
代碼:
整個遊戲主要分三個角色,敵機,英雄機和子彈
敵機 enemy.py:
隨機出現一堆敵人的飛機,直管往前沖,從屏幕的上方往下方蜂擁而至,沒有其他的任何行為。
設置了三種敵機的等級,大中小,代碼量比較大隻貼主要代碼。
def move(self): if self.rect.top < self.height: self.rect.top += self.speed else: self.reset()def reset(self): self.active = True self.rect.left,self.rect.top = randint(0,self.width - self.rect.width), randint(-5 * self.height,0)
敵機的行為就一個飛,而且是隻會往前,同時敵機有幾個重要的屬性,比如它的飛行圖片和擊落的圖片,然後獲取的屏幕上的坐標。
英雄機 myplane.py:
英雄機總是要有點主角光環的,所以稍微復雜一點,它有這麼幾個主要的屬性,飛行的圖片,被擊落的圖片,屏幕坐標,它的子彈,我們需要控制它的飛機方向,向上,向下,左邊和右邊,發射子彈。
def moveUp(self): if self.rect.top > 0: self.rect.top -= self.speed else: self.rect.top = 0def moveDown(self): if self.rect.bottom < self.height - 60: self.rect.top += self.speed else: self.rect.bottom = self.height - 60def moveLeft(self): if self.rect.left > 0: self.rect.left -= self.speed else: self.rect.left = 0def moveRight(self): if self.rect.right < self.width: self.rect.left += self.speed else: self.rect.right = self.widthdef reset(self): self.rect.left,self.rect.top = (self.width - self.rect.width) // 2, self.height - self.rect.height - 60 self.active = True self.invincible = True
子彈 bullet.py:
這裡需要初始化子彈的圖片,獲取在坐標軸中的位置。
def __init__(self,position): pygame.sprite.Sprite.__init__(self) self.image = pygame.image.load ("images/bullet1.png").convert_alpha() self.rect = self.image.get_rect() self.rect.left,self.rect.top = position self.speed = 12 self.active = False self.mask = pygame.mask. from_surface(self.image)def move(self): self.rect.top -= self.speed if self.rect.top < 0: self.active = Falsedef reset(self,position): self.rect.left,self.rect.top = position self.active = True
子彈供給 supply.py:
self.speed = 5 self.active = False self.mask = pygame.mask. from_surface(self.image)def move(self): if self.rect.top < self.height: self.rect.top += self.speed else: self.active = Falsedef reset(self): self.active = True self.rect.left,self.rect.bottom = randint(0,self.width - self.rect.width),-100
在這個遊戲中還可以獲得額外獎勵,就是英雄機的子彈速度和大小發生變化。
主函數 main.py:
主要負責遊戲邏輯的控制,背景音樂的引用,遊戲界面的初始化和遊戲循環。
running = Truewhile running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit()
其實用一個大的while 循環《隻貼了一小部分代碼》來寫整個遊戲的邏輯部分,主要實現了以下功能:
- 繪制出背景幕佈
- 繪制出玩家的戰機,敵機
- 綁定戰機和敵機的鼠標和鍵盤響應事件
- 發射子彈,通過坐標來判斷子彈和敵機的碰撞,以及敵機和玩家戰機的碰撞
- 最後還要計算得分:
同時還有其他的代碼實現了遊戲的初始化和遊戲終止。
『我自己是一名從事了多年開發的Python老程序員,辭職目前在做自己的Python私人定制課程,今年年初我花了一個月整理了一份最適合2019年學習的Python學習幹貨,從最基礎的到各種框架都有整理,送給每一位喜歡Python小夥伴,想要獲取的可以轉發文章並關注我的頭條號。
在後臺私信我:01,即可免費獲取。
“