基於pygame實現飛機大戰【面向過程】


一.簡介

  pygame
頂級pygame包
pygame.init - 初始化所有導入的pygame模塊
pygame.quit - uninitialize所有pygame模塊
pygame.error - 標准的pygame例外
pygame.get_error - 獲取當前錯誤消息
pygame.set_error - 設置當前的錯誤消息
pygame.get_sdl_version - 獲取SDL的版本號
pygame.get_sdl_byteorder - 獲取SDL的字節順序
pygame.register_quit - 注冊pygame退出時要調用的函數
pygame.encode_string - 編碼Unicode或字節對象
pygame.encode_file_path - 將Unicode或字節對象編碼為文件系統路徑

pygame包代表其他人使用的頂級包。Pygame本身被分解成許多子模塊,但這不會影響使用pygame的程序。

為方便起見,pygame中的大多數頂級變量都放在名為“pygame.locals”的模塊中。除了'import pygame'之外,這意味着與'from pygame.locals import *一起使用 

當你'導入pygame'時,會自動導入所有可用的pygame子模塊。請注意,某些pygame模塊被視為“可選”,可能無法使用。在這種情況下,pygame將提供占位符對象而不是模塊,可用於測試可用性。

pygame. init
初始化所有導入的pygame模塊
init() - >(numpass,numfail)

初始化所有導入的pygame模塊。如果模塊失敗,則不會引發異常,但如果成功那么失敗的總數將作為元組返回。您始終可以手動初始化單個模塊,但pygame.init()初始化所有導入的pygame模塊是一種方便的方法來啟動所有操作。init()各個模塊功能會在失敗時引發異常。

您可能希望單獨初始化不同的模塊以加速您的程序或不使用您的游戲沒有的東西。

init()不止一次調用它是安全的:重復調用將不起作用。即使您擁有pygame.quit()所有模塊也是如此

pygame. quit
uninitialize所有pygame模塊
退出() - >無

取消初始化之前已初始化的所有pygame模塊。當Python解釋器關閉時,無論如何調用此方法,因此您的程序不應該需要它,除非它想要終止其pygame資源並繼續。不止一次調用此函數是安全的:重復調用無效。

注意,pygame.quit()取消初始化所有pygame模塊不會退出程序。考慮讓你的程序以與普通python程序結束相同的方式結束。

異常 pygame. error
標准的pygame例外
raise pygame.error(message)

pygame或SDL操作失敗時會引發此異常您可以捕獲任何預期的問題並處理錯誤。始終會引發有關問題的描述性消息的異常。

派生自RuntimeError異常,也可用於捕獲這些引發的錯誤。

pygame. get_error
獲取當前錯誤消息
get_error() - > errorstr

SDL維護內部錯誤消息。引發pygame.error()標准的pygame異常時,通常會給你這條消息您很少需要調用此函數。

pygame. set_error
設置當前的錯誤消息
set_error(error_msg) - >無

SDL維護內部錯誤消息。引發pygame.error()標准的pygame異常時,通常會給你這條消息您很少需要調用此函數。

pygame. get_sdl_version
獲取SDL的版本號
get_sdl_version() - > major,minor,patch

返回SDL的三個版本號此版本在編譯時構建。它可用於檢測pygame可能無法使用哪些功能。

get_sdl_version是pygame 1.7.0中的新功能

pygame. get_sdl_byteorder
獲取SDL的字節順序
get_sdl_byteorder() - > int

返回SDL的字節順序它返回LIL_ENDIAN小端字節順序和BIG_ENDIAN大端字節順序。

get_sdl_byteorder是pygame 1.8中的新功能

pygame. register_quit
注冊pygame退出時要調用的函數
register_quit(callable) - > None

pygame.quit()未初始化所有pygame模塊時,將調用所有已注冊的退出函數。Pygame模塊在初始化時會自動執行此操作。常規pygame用戶不需要此功能。

pygame. encode_string
編碼Unicode或字節對象
encode_string([obj [,encoding [,errors [,etype]]]]) - > bytes或None

obj:如果是Unicode,則編碼; if bytes,返回不變; 如果有的話,返回None; 如果沒有給出,則引發SyntaxError。

encoding(string):如果存在,則使用編碼。默認為'unicode_escape'。

errors(string):如果給出,如何處理不可編碼的字符。默認為'backslashreplace'。

etype(異常類型):如果給定,則為編碼錯誤引發異常類型。默認值為UnicodeEncodeError,由返回 PyUnicode_AsEncodedString()對於默認編碼和錯誤值,應該沒有編碼錯誤。

此函數用於編碼文件路徑。支持關鍵字參數。

在pygame 1.9.2中添加(主要用於單元測試)

pygame. encode_file_path
將Unicode或字節對象編碼為文件系統路徑
encode_file_path([obj [,etype]]) - > bytes或None

obj:如果是Unicode,則編碼; if bytes,返回不變; 如果有的話,返回None; 如果沒有給出,則引發SyntaxError。

etype(異常類型):如果給定,則為編碼錯誤引發異常類型。默認值為UnicodeEncodeError,由返回 PyUnicode_AsEncodedString()

此函數用於編碼pygame中的文件路徑。編碼是由返回的編解碼器sys.getfilesystemencoding()支持關鍵字參數。

在pygame 1.9.2中添加(主要用於單元測試)

pygame.version
包含版本信息的小模塊
pygame.version.ver - 版本號作為字符串
pygame.version.vernum - 版本的整數整數
pygame.version.rev - 構建的存儲庫修訂版

這個模塊會自動導入到pygame包中,並提供一些變量來檢查已經導入的pygame版本。

pygame.version. ver
版本號作為字符串
ver ='1.2'

這是表示為字符串的版本。它也可以包含一個微型版本號e.g.,'1.5.2'

pygame.version. vernum
版本的整數整數
vernum =(1,5,3)

該版本的變量可以很容易地與相同格式的其他版本號進行比較。檢查pygame版本號的示例如下所示:

if pygame.version.vernum < (1, 5): print 'Warning, older version of pygame (%s)' % pygame.version.ver disable_advanced_features = True
pygame.version. rev
構建的存儲庫修訂版
rev ='a6f89747b551 +'

從中構建此程序包的存儲庫檢出的Mercurial節點標識符。如果標識符以加號'+'結尾,則包中包含未提交的更改。請在錯誤報告中包含此修訂號,特別是對於非發布的pygame構建。

二.代碼實現

  1 # -*- coding: utf-8 -*-
  2 """
  3 Created on Sat Jan 30 12:21:29 2019
  4 
  5 @author: zhen
  6 """
  7 
  8 import pygame
  9 import time
 10 import random
 11 from pygame.locals import *
 12 """
 13     1.搭建界面,主要是完成窗口和背景圖片
 14 """
 15 
 16 
 17 def main():
 18     # 1.創建一個窗口,用來顯示內容
 19     screen = pygame.display.set_mode((480, 620), 0, 32)
 20     # 設置名稱
 21     pygame.display.set_caption('飛機大戰')
 22     # 2.創建一個和窗口大小一樣的圖片用來充當背景
 23     background = pygame.image.load("D:\圖片\stars2.jpg")
 24     # 3.創建飛機
 25     plane = pygame.image.load("D:\圖片\hero3.png")
 26     # 4.創建敵機
 27     dj = pygame.image.load("D:\圖片\dj1.png")
 28     # 創建飛機坐標變量
 29     x = 220
 30     y = 570
 31     # 創建敵機初始坐標
 32     djx = 0
 33     djy = 0
 34     # 設置敵機移動方向
 35     dj_move_direct = "right"
 36     # 創建友軍飛機子彈
 37     fires = []
 38     x_loc = []
 39     y_loc = []
 40     # 創建友軍子彈的初始位置
 41     fx = x + 20
 42     fy = 540
 43     # 友軍子彈,默認不顯示
 44     fire_show = "false"
 45     # 創建敵機子彈
 46     djzds = []
 47     djx_loc = []
 48     djy_loc = []
 49     # 敵機子彈初始位置
 50     djzdx = 0
 51     djzdy = 0
 52     while True:
 53         # 設定需要顯示的背景圖片,把背景圖片覆蓋窗口
 54         screen.blit(background, (0, 0))
 55         # 顯示飛機
 56         screen.blit(plane, (x, y))
 57         # 顯示友軍子彈
 58         if fire_show == "true":
 59             for i in range(len(fires)):
 60                 if fire_show == "true":
 61                     y_loc[i] = y_loc[i]-5
 62                     screen.blit(fires[i], (x_loc[i], y_loc[i]))
 63 
 64         # 顯示敵機
 65         screen.blit(dj, (djx, djy))
 66         # 敵機自動移動
 67         if djx > 400:
 68             dj_move_direct = "left"
 69         elif djx < 0:
 70             dj_move_direct = "right"
 71 
 72         if dj_move_direct == "right":
 73             djx += 1
 74         else:
 75             djx -= 1
 76 
 77         # 添加敵機子彈
 78         rand = random.randint(1, 100)
 79         if rand == 6 or rand == 8:
 80             djzd = pygame.image.load("D://圖片/zd3.png")
 81             djzds.append(djzd)
 82             djx_loc.append(djx + 30)
 83             djy_loc.append(djy + 40)
 84         # 顯示敵機子彈
 85         for i in range(len(djzds)):
 86             djy_loc[i] = djy_loc[i] + 5
 87             screen.blit(djzds[i], (djx_loc[i], djy_loc[i]))
 88         # 更新需要顯示的內容
 89         pygame.display.update()
 90         # 獲取事件
 91         for event in pygame.event.get():
 92             # 判斷是否點擊了退出按鈕
 93             if event.type == QUIT:
 94                 print("exit")
 95                 exit()
 96             elif event.type == KEYDOWN:
 97                 # 檢測是否是按鍵A或左方向鍵
 98                 if event.key == K_a or event.key == K_LEFT:
 99                     print("event.key == K_a or event.key == K_LEFT")
100                     if x > 0:
101                         x -= 10
102                 # 檢測是否是按鍵D或右方向鍵
103                 elif event.key == K_d or event.key == K_RIGHT:
104                     print("event.key == K_d or event.key == K_RIGHT")
105                     if x < 420:
106                         x += 10
107                 elif event.key == K_SPACE:
108                     fire_show = "true"
109                     # 創建新的友軍子彈,面向過程編程已經出現麻煩的情況了,坐標要分開放置
110                     fire = pygame.image.load("D://圖片/fire5.png")
111                     fires.append(fire)
112                     x_loc.append(x + 20)
113                     y_loc.append(fy)
114                     print("fire")
115         # 休眠
116         time.sleep(0.01)
117 
118 
119 if __name__ == "__main__":
120     main()

三.結果

  敵機開火&同時開火

四.分析

  使用pygame編寫一些小型游戲簡潔易上手,在使用面向過程的編碼方式編寫時,隨着邏輯復雜提高,代碼的不斷增加的情況下,編碼越賣越復雜且難以修改,建議使用面向對象的編碼方式!

 五.素材

  敵機:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_dj1.png

  敵機子彈:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_zd3.png

  友軍:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_hero3.png

  友軍子彈:https://www.cnblogs.com/images/cnblogs_com/yszd/1394555/t_fire5.png


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM