日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
500行代碼,教你用Python寫個微信飛機大戰(zhàn)

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

創(chuàng)新互聯(lián)專注于清流網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供清流營銷型網(wǎng)站建設(shè),清流網(wǎng)站制作、清流網(wǎng)頁設(shè)計、清流網(wǎng)站官網(wǎng)定制、小程序定制開發(fā)服務(wù),打造清流網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供清流網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

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

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

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

所以我打開電腦,創(chuàng)建了一個 plan_game.py……

先看效果圖

操作環(huán)境

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

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

用Python和Pygame寫游戲-從入門到精通(目錄)

具體實現(xiàn)

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

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

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

 
 
 
 
  1. import pygame 
  2.  
  3.  
  4. class Game(): 
  5.     def __init__(self, background_image_path, size=(480, 700), title='飛機大戰(zhàn)', 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.         # 設(shè)置字體對象,得到系統(tǒng)中自帶的字體 
  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.         # 分數(shù) 
  28.         self.score = 0 
  29.         # 存放所有的敵機 
  30.         self.enemies = [] 
  31.  
  32.  
  33.     def show_score(self): 
  34.         ''' 
  35.         顯示分數(shù), 在窗口的的最上方距離上邊距10px, 左右居中 
  36.         ''' 
  37.         pass 
  38.  
  39.  
  40.     def set_time_passed(self): 
  41.         # 控制畫 的幀, 越大越快 
  42.         # 得到上一次繪制圖像到到現(xiàn)在的時間, ms 
  43.         self.time_passed = self.clock.tick() 
  44.  
  45.  
  46.     def draw_background(self): 
  47.         ''' 
  48.         繪制背景圖片,一直向下滾動,營造飛機一直往上面飛的感覺 
  49.         ''' 
  50.         # 每次移動的距離 = 每ms移動的距離 * 上次到現(xiàn)在的時間(ms) 
  51.         pass 
  52.  
  53.  
  54.     def create_enemy(self, image_path=os.path.join(source_dir,'enemy1.png'), enemy_number=5): 
  55.         ''' 
  56.         創(chuàng)建敵機 
  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: 上次繪制導(dǎo)向現(xiàn)在經(jīng)過的時間 
  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.         游戲結(jié)束 
  102.         ''' 
  103.         while True: 
  104.             # 繪制背景圖 
  105.             pass 
  106.  
  107.  
  108.     def run(self): 
  109.         ''' 
  110.         游戲入口函數(shù),開始函數(shù),主體函數(shù) 
  111.         :return: 
  112.         ''' 
  113.  
  114.         # 設(shè)置游戲窗口的大小 
  115.         pygame.display.set_caption(self.title) 
  116.         # 初始化一個飛機對象 
  117.         plan = Plan() 
  118.  
  119.         while True: 
  120.             # 如果飛機自毀完成, 游戲結(jié)束, 調(diào)用game_over函數(shù) 
  121.             pass 
  122.  
  123.             # 檢測監(jiān)聽事件 
  124.             pass 
  125.  
  126.             # 檢測上下左右的移動案件. 
  127.             # w,a,s,d 和 上,下,左,右鍵都可以 
  128.             # 然后執(zhí)行plan.update函數(shù),改變飛機的位置 
  129.             pass 
  130.  
  131.             # 子彈和敵機的碰撞檢測 
  132.             self.bullet_and_enemy_crash_detection(plan.bullets) 
  133.             # 飛機與敵機的碰撞檢測 
  134.             self.plan_and_enemy_crash_detection(plan) 
  135.             # 設(shè)置屬性time_passed的值, 距離上次的時間,方便后面使用 
  136.             self.set_time_passed() 
  137.             # 繪制背景圖片 
  138.             self.draw_background() 
  139.             # 顯示分數(shù) 
  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. 這里說以下怎樣查看自己的系統(tǒng)中有哪些自帶的字體. 
  153. pygame.font.get_fonts(),這個函數(shù)就能夠得到系統(tǒng)中所有的自帶字體文件。不過,當(dāng)我們游戲中有中文的時候,我們也得選擇支持中文的字體,否則的話是顯示不出中文的。 

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

 
 
 
 
  1. # 顯示飛機自毀動畫的Mixin類, 可用于飛機和敵機的自毀動畫顯示 
  2. class DestroyAnimationMixin(): 
  3.  
  4.     def show_destroy_animation(self, time_passed, destroy_time=200): 
  5.         ''' 
  6.         顯示自毀動畫 
  7.         動畫其實就是幾張圖片切換的比較快,我們的眼睛識別不出來,所以認為他是動態(tài)的,也就是動畫 
  8.         :param time_passed: 距離上次繪制圖像到現(xiàn)在的時間,單位ms 
  9.         :param destroy_time: 自毀動畫總共顯示時間,單位ms 
  10.         ''' 
  11.  
  12.         # 因為我們的自毀圖片有四張,需要依次顯示,首先動畫的效果 
  13.         # self.destroy_image_position 表示第幾章自毀圖片,從零開始 
  14.         # 如果大于等于4了,說明自毀動畫顯示完成,設(shè)置self.destroyed變量為True, 方便別處調(diào)用 
  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 

實現(xiàn)飛機類,完成飛機的主要操作。飛機的操作包括:飛機位置、飛機子彈、發(fā)射子彈等。

 
 
 
 
  1. # 飛機類,繼承DestroyAnimationMixin, 方便使用顯示自毀動畫的函數(shù) 
  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, 自毀相關(guān)屬性 
  17.         # 開始自毀 
  18.         self.start_destroy = False 
  19.         # 自毀結(jié)束 
  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.         # 距離上次繪制圖像到現(xiàn)在的時間 
  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.         飛機發(fā)射子彈 
  38.         :param image_path: 子彈圖片 
  39.         ''' 
  40.         pass 
  41.  
  42.     def draw_bullets(self, time_passed, screen): 
  43.         ''' 
  44.         繪制飛機的所有子彈 
  45.         :param time_passed: 距離上次繪制圖像到現(xiàn)在的時間 
  46.         :param screen: 繪制到哪一個窗口中 
  47.         ''' 
  48.         pass 

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

 
 
 
 
  1. # 敵機類,繼承DestroyAnimationMixin, 方便使用顯示自毀動畫的函數(shù) 
  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.         # 距離上次繪制圖像到現(xiàn)在的時間 
  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: 距離上次繪制圖像到現(xiàn)在的時間 
  28.         :return: 
  29.         ''' 
  30.         pass 

實現(xiàn)子彈類,完成子彈的主要操作

 
 
 
 
  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.         根據(jù)plan得到子彈發(fā)出位置 
  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: 距離上次繪制圖像到現(xiàn)在的時間 
  31.         ''' 
  32.         # 如果子彈超出屏幕或者擊中敵機,就設(shè)置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 

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


當(dāng)前文章:500行代碼,教你用Python寫個微信飛機大戰(zhàn)
文章網(wǎng)址:http://m.5511xx.com/article/dpdeigp.html