<optgroup id="b2bz8"><code id="b2bz8"><blockquote id="b2bz8"></blockquote></code></optgroup> <form id="b2bz8"><nobr id="b2bz8"><meter id="b2bz8"></meter></nobr></form>

    <address id="b2bz8"></address>
    <nav id="b2bz8"><strong id="b2bz8"></strong></nav>

    <address id="b2bz8"><nobr id="b2bz8"></nobr></address><menu id="b2bz8"><tt id="b2bz8"></tt></menu>
    |
    |
    51CTO旗下網站
    |
    |
    移動端

    500行代碼,教你用Python寫個微信飛機大戰

    這幾天在重溫微信小游戲的飛機大戰,玩著玩著就在思考人生了,這飛機大戰怎么就可以做的那么好,操作簡單,簡單上手。

    作者:上海小胖來源:SegmentFault.com|2019-10-17 21:37

    500行代碼,教你用Python寫個微信飛機大戰

    這幾天在重溫微信小游戲的飛機大戰,玩著玩著就在思考人生了,這飛機大戰怎么就可以做的那么好,操作簡單,簡單上手。

    幫助蹲廁族、YP族、飯圈女孩在無聊之余可以有一樣東西讓他們振作起來!讓他們的左手 / 右手有節奏有韻律的朝著同一個方向來回移動起來!

    這是史詩級的發明,是濃墨重彩的一筆,是……

    在一陣抽搐后,我結束了游戲,瞬時覺得一切都索然無味,正在我進入賢者模式時,突然想到,如果我可以讓更多人已不同的方式體會到這種美輪美奐的感覺豈不美哉?

    所以我打開電腦,創建了一個 plan_game.py……

    先看效果圖

    500行代碼,教你用Python寫個微信飛機大戰

    操作環境

    • 操作系統:windows10
    • python版本:python 3.7
    • 代碼編輯器:pycharm 2018.2
    • 使用模塊:os,sys,random,pygame

    因為實現代碼使用到了一個pygame的第三方模塊,沒有的先 pip install 一下,這里順便提供一個比較好的pygame的教程.

    https://eyehere.net/2011/python-pygame-novice-professional-index/

    具體實現

    首先我們先指定素材文件的文件目錄.方便我們后面的使用。

    1. import os 
    2.  
    3. # 得到當前文件夾下面的material_images目錄的路徑 
    4. source_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'material_images'

    實現一個Game類,用來完成這個游戲的主要邏輯。

    1. import pygame 
    2.  
    3.  
    4. class Game(): 
    5.     def __init__(self, background_image_path, size=(480, 700), title='飛機大戰', font_name='方正舒體', font_size=30, speed=2000): 
    6.         ''
    7.         :param background_image_path: 背景圖片的路徑地址 
    8.         :param size: 游戲窗口的大小 
    9.         :param title: 游戲窗口的標題 
    10.         :param font_name: 指定字體 
    11.         :param font_size: 指定字體大小 
    12.         :param speed: 背景圖滾動整個窗口一次所用時間,單位為ms 
    13.         ''
    14.         self.size = size 
    15.         self.screen = pygame.display.set_mode(size
    16.         self.title = title 
    17.         self.background_image_path = background_image_path 
    18.         self.background = pygame.image.load(self.background_image_path).convert() 
    19.         # 設置字體對象,得到系統中自帶的字體 
    20.         self.font = pygame.font.SysFont(font_name, font_size) 
    21.         # 得到Clock對象,我們可以使用它來獲取距離上次繪制圖像的時間 
    22.         self.clock = pygame.time.Clock() 
    23.         # 背景圖初始位置 
    24.         self.height = 0 
    25.         # 使用窗口的高度處于滾動的時間,就能得到每ms滾動的距離 
    26.         self.every_ms_move_distance = self.size[1] / speed   # 2秒 
    27.         # 分數 
    28.         self.score = 0 
    29.         # 存放所有的敵機 
    30.         self.enemies = [] 
    31.  
    32.  
    33.     def show_score(self): 
    34.         ''
    35.         顯示分數, 在窗口的的最上方距離上邊距10px, 左右居中 
    36.         ''
    37.         pass 
    38.  
    39.  
    40.     def set_time_passed(self): 
    41.         # 控制畫 的幀, 越大越快 
    42.         # 得到上一次繪制圖像到到現在的時間, ms 
    43.         self.time_passed = self.clock.tick() 
    44.  
    45.  
    46.     def draw_background(self): 
    47.         ''
    48.         繪制背景圖片,一直向下滾動,營造飛機一直往上面飛的感覺 
    49.         ''
    50.         # 每次移動的距離 = 每ms移動的距離 * 上次到現在的時間(ms) 
    51.         pass 
    52.  
    53.  
    54.     def create_enemy(self, image_path=os.path.join(source_dir,'enemy1.png'), enemy_number=5): 
    55.         ''
    56.         創建敵機 
    57.         :param image_path: 敵機的圖片地址 
    58.         :param enemy_number: 最多有幾個敵機在屏幕上 
    59.         ''
    60.         pass 
    61.  
    62.  
    63.     def draw_enemies(self, time_passed, screen): 
    64.         ''
    65.         繪制敵機到屏幕上,清理跑出窗口的敵機, 
    66.         :param time_passed: 上次繪制導向現在經過的時間 
    67.         :param screen: 繪制的窗口對象 
    68.         ''
    69.         pass 
    70.  
    71.  
    72.     def bullet_and_enemy_crash_detection(self, bullets): 
    73.         ''
    74.         檢測子彈是否擊中敵機 
    75.         :param bullets: 飛機的所有子彈 
    76.         ''
    77.         pass 
    78.  
    79.  
    80.     def plan_and_enemy_crash_detection(self, plan, allow_crash_size=None): 
    81.         ''
    82.         檢測敵機與飛機是否相撞 
    83.         :param plan: 飛機對象 
    84.         :param allow_crash_size: 允許飛機碰撞的大小,只有左右有效 
    85.         ''
    86.         pass 
    87.  
    88.  
    89.     def draw_plan(self, plan, time_passed): 
    90.         ''
    91.         繪制飛機 
    92.         :param plan: 飛機對象 
    93.         :param time_passed: 距離上次繪制的時間 
    94.         :return
    95.         ''
    96.         pass 
    97.  
    98.  
    99.     def game_over(self): 
    100.         ''
    101.         游戲結束 
    102.         ''
    103.         while True
    104.             # 繪制背景圖 
    105.             pass 
    106.  
    107.  
    108.     def run(self): 
    109.         ''
    110.         游戲入口函數,開始函數,主體函數 
    111.         :return
    112.         ''
    113.  
    114.         # 設置游戲窗口的大小 
    115.         pygame.display.set_caption(self.title) 
    116.         # 初始化一個飛機對象 
    117.         plan = Plan() 
    118.  
    119.         while True
    120.             # 如果飛機自毀完成, 游戲結束, 調用game_over函數 
    121.             pass 
    122.  
    123.             # 檢測監聽事件 
    124.             pass 
    125.  
    126.             # 檢測上下左右的移動案件. 
    127.             # w,a,s,d 和 上,下,左,右鍵都可以 
    128.             # 然后執行plan.update函數,改變飛機的位置 
    129.             pass 
    130.  
    131.             # 子彈和敵機的碰撞檢測 
    132.             self.bullet_and_enemy_crash_detection(plan.bullets) 
    133.             # 飛機與敵機的碰撞檢測 
    134.             self.plan_and_enemy_crash_detection(plan) 
    135.             # 設置屬性time_passed的值, 距離上次的時間,方便后面使用 
    136.             self.set_time_passed() 
    137.             # 繪制背景圖片 
    138.             self.draw_background() 
    139.             # 顯示分數 
    140.             self.show_score() 
    141.             # 生成敵機 
    142.             self.create_enemy() 
    143.             # 繪制敵機 
    144.             self.draw_enemies(time_passed=self.time_passed, screen=self.screen) 
    145.             # 繪制飛機 
    146.             self.draw_plan(plan=plan, time_passed=self.time_passed) 
    147.             # 繪制子彈 
    148.             plan.draw_bullets(time_passed=self.time_passed, screen=self.screen) 
    149.             # 顯示我們的圖像 
    150.             pygame.display.update() 
    151.  
    152. 這里說以下怎樣查看自己的系統中有哪些自帶的字體. 
    153. pygame.font.get_fonts(),這個函數就能夠得到系統中所有的自帶字體文件。不過,當我們游戲中有中文的時候,我們也得選擇支持中文的字體,否則的話是顯示不出中文的。 

    500行代碼,教你用Python寫個微信飛機大戰

    實現DestroyAnimationMixin類,這個類主要是用來顯示飛機或敵機的自毀動畫

    1. # 顯示飛機自毀動畫的Mixin類, 可用于飛機和敵機的自毀動畫顯示 
    2. class DestroyAnimationMixin(): 
    3.  
    4.     def show_destroy_animation(self, time_passed, destroy_time=200): 
    5.         ''
    6.         顯示自毀動畫 
    7.         動畫其實就是幾張圖片切換的比較快,我們的眼睛識別不出來,所以認為他是動態的,也就是動畫 
    8.         :param time_passed: 距離上次繪制圖像到現在的時間,單位ms 
    9.         :param destroy_time: 自毀動畫總共顯示時間,單位ms 
    10.         ''
    11.  
    12.         # 因為我們的自毀圖片有四張,需要依次顯示,首先動畫的效果 
    13.         # self.destroy_image_position 表示第幾章自毀圖片,從零開始 
    14.         # 如果大于等于4了,說明自毀動畫顯示完成,設置self.destroyed變量為True, 方便別處調用 
    15.         if self.destroy_image_position >= 4: 
    16.             self.destroyed = True 
    17.             return 
    18.  
    19.         # 依次加載自毀圖片 
    20.         if self.time_passed >= destroy_time / 4: 
    21.             self.image = pygame.image.load(os.path.join(source_dir, self.destroy_images[self.destroy_image_position])).convert_alpha() 
    22.             self.destroy_image_position += 1 
    23.             self.time_passed = 0 
    24.         else
    25.             self.time_passed += time_passed 

    500行代碼,教你用Python寫個微信飛機大戰

    實現飛機類,完成飛機的主要操作。飛機的操作包括:飛機位置、飛機子彈、發射子彈等。

    1. # 飛機類,繼承DestroyAnimationMixin, 方便使用顯示自毀動畫的函數 
    2. class Plan(DestroyAnimationMixin): 
    3.     def __init__(self, image_path=os.path.join(source_dir,'plan.png'), background_size=(480, 700)): 
    4.         ''
    5.         :param image_path: 飛機圖片地址 
    6.         :param background_size: 游戲窗口大小 
    7.         ''
    8.         self.background_size = background_size 
    9.         self.image = pygame.image.load(image_path).convert_alpha() 
    10.         self.image_size = self.image.get_size() 
    11.         self.position = [(background_size[0]-self.image_size[0]) / 2, 500] 
    12.         # 飛機每次移動的距離 
    13.         self.every_time_move_distance = 0.5 
    14.         # 飛機的子彈 
    15.         self.bullets = [] 
    16.         # destroy association attributes, 自毀相關屬性 
    17.         # 開始自毀 
    18.         self.start_destroy = False 
    19.         # 自毀結束 
    20.         self.destroyed = False 
    21.         # 自毀圖片 
    22.         self.destroy_images = ['me_destroy_1.png''me_destroy_2.png''me_destroy_3.png''me_destroy_4.png'
    23.         # 自毀圖片位置 
    24.         self.destroy_image_position = 0 
    25.         # 距離上次繪制圖像到現在的時間 
    26.         self.time_passed = 0 
    27.  
    28.     def update(self, direction): 
    29.         ''
    30.         更新飛機位置 
    31.         :param direction: 飛機移動方向 
    32.         ''
    33.         pass 
    34.  
    35.     def shut(self, image_path=os.path.join(source_dir,'bullet.png')): 
    36.         ''
    37.         飛機發射子彈 
    38.         :param image_path: 子彈圖片 
    39.         ''
    40.         pass 
    41.  
    42.     def draw_bullets(self, time_passed, screen): 
    43.         ''
    44.         繪制飛機的所有子彈 
    45.         :param time_passed: 距離上次繪制圖像到現在的時間 
    46.         :param screen: 繪制到哪一個窗口中 
    47.         ''
    48.         pass 

    500行代碼,教你用Python寫個微信飛機大戰

    實現敵機類,完成敵機的主要操作。主要是用來更新位置。

    1. # 敵機類,繼承DestroyAnimationMixin, 方便使用顯示自毀動畫的函數 
    2. class Enemy(DestroyAnimationMixin): 
    3.     def __init__(self, image_path=os.path.join(source_dir, 'enemy1.png'), speed=2000, background_size=(480, 700)): 
    4.         ''
    5.         :param image_path: 敵機圖片地址 
    6.         :param speed: 敵機移動整個窗口需要的時間,單位ms,也就是速度 
    7.         :param background_size: 游戲窗口的尺寸 
    8.         ''
    9.         self.image = pygame.image.load(image_path).convert_alpha() 
    10.         self.speed = background_size[1] / speed 
    11.         self.background_size = background_size 
    12.         self.position = [random.randint(0, background_size[0]-self.image.get_size()[0]), -self.image.get_size()[1]] 
    13.         # 開始自毀 
    14.         self.start_destroy = False 
    15.         # 自毀完成 
    16.         self.destroyed = False 
    17.         # 自毀圖片路徑 
    18.         self.destroy_images = ['enemy1_down1.png''enemy1_down2.png''enemy1_down3.png''enemy1_down3.png'
    19.         # 距離上次繪制圖像到現在的時間 
    20.         self.time_passed = 0 
    21.         # 自毀圖片在self.destroy_images的位置 
    22.         self.destroy_image_position = 0 
    23.  
    24.     def update(self, time_passed): 
    25.         ''
    26.         更新敵機的位置 
    27.         :param time_passed: 距離上次繪制圖像到現在的時間 
    28.         :return
    29.         ''
    30.         pass 

    實現子彈類,完成子彈的主要操作

    1. # 飛機子彈類 
    2. class Bullet(): 
    3.     def __init__(self, image_path=os.path.join(source_dir,'bullet.png'), background_size=(480, 700), plan=None, speed=1000): 
    4.         ''
    5.         :param image_path: 子彈的圖片地址 
    6.         :param background_size: 游戲窗口大小 
    7.         :param plan: 飛機對象 
    8.         :param speed: 子彈飛行速度 
    9.         ''
    10.         self.image = pygame.image.load(image_path).convert_alpha() 
    11.         self.background_size = background_size 
    12.         self.speed = background_size[1] / speed 
    13.         # 子彈是否擊中敵機 
    14.         self.destroyed = False 
    15.         self.position = self._get_position(plan) 
    16.  
    17.     def _get_position(self, plan): 
    18.         ''
    19.         根據plan得到子彈發出位置 
    20.         :param plan: 飛機對象 
    21.         ''
    22.         bullet_size = self.image.get_size() 
    23.         plan_width = plan.image_size[0] 
    24.         x = (plan_width-bullet_size[0]) / 2 
    25.         return [plan.position[0] + x, plan.position[1]] 
    26.  
    27.     def update(self, time_passed): 
    28.         ''
    29.         改變子彈位置 
    30.         :param time_passed: 距離上次繪制圖像到現在的時間 
    31.         ''
    32.         # 如果子彈超出屏幕或者擊中敵機,就設置self.position[1]為-100,在plan.draw的時候就移除它 
    33.         if self.position[1] + self.image.get_size()[1] <= 0 or self.destroyed: 
    34.             self.position[1] = -100 
    35.             return 
    36.  
    37.         # 改變的距離 = 時間 * 速率 
    38.         self.position[1] -= time_passed * self.speed 

    500行代碼,教你用Python寫個微信飛機大戰

    這樣,我們就把所有的操作都實現完了,接下來只需要使用 Game().run(),就可以運行我們的游戲了。

    【編輯推薦】

    1. Python輕松查看微信撤回消息,秘密無處可藏
    【責任編輯:未麗燕 TEL:(010)68476606】

    點贊 0
    分享:
    大家都在看
    猜你喜歡

    訂閱專欄+更多

    CentOS 8 全新學習術

    CentOS 8 全新學習術

    CentOS 8 正式發布
    共16章 | UbuntuServer

    229人訂閱學習

    用Python玩轉excel

    用Python玩轉excel

    讓重復操作傻瓜化
    共3章 | DE8UG

    216人訂閱學習

    AI入門級算法

    AI入門級算法

    算法常識
    共22章 | 周蘿卜123

    182人訂閱學習

    讀 書 +更多

    Linux安全體系分析與編程

    本書選擇經典的開放源代碼,全面系統地分析了Linux安全機制。本書共有17章,前10章著重介紹了Linux操作系統的安全機制及實現方法,闡述了公...

    訂閱51CTO郵刊

    點擊這里查看樣刊

    訂閱51CTO郵刊

    51CTO服務號

    51CTO官微

    日韩大片