溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么用Python寫個(gè)微信飛機(jī)大戰(zhàn)

發(fā)布時(shí)間:2021-11-01 17:21:40 來(lái)源:億速云 閱讀:123 作者:小新 欄目:移動(dòng)開發(fā)

小編給大家分享一下怎么用Python寫個(gè)微信飛機(jī)大戰(zhàn),希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

怎么用Python寫個(gè)微信飛機(jī)大戰(zhàn)

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

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

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

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

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

先看效果圖

怎么用Python寫個(gè)微信飛機(jī)大戰(zhàn)

操作環(huán)境

  • 操作系統(tǒng):windows10

  • python版本:python 3.7

  • 代碼編輯器:pycharm 2018.2

  • 使用模塊:os,sys,random,pygame

因?yàn)閷?shí)現(xiàn)代碼使用到了一個(gè)pygame的第三方模塊,沒(méi)有的先 pip install 一下,這里順便提供一個(gè)比較好的pygame的教程.

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

具體實(shí)現(xiàn)

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

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

實(shí)現(xiàn)一個(gè)Game類,用來(lái)完成這個(gè)游戲的主要邏輯。

  1. import pygame 

  2.  

  3.  

  4. class Game(): 

  5.     def __init__(self, background_image_path, size=(480, 700), title='飛機(jī)大戰(zhàn)', font_name='方正舒體', font_size=30, speed=2000): 

  6.         ''' 

  7.         :param background_image_path: 背景圖片的路徑地址 

  8.         :param size: 游戲窗口的大小 

  9.         :param title: 游戲窗口的標(biāo)題 

  10.         :param font_name: 指定字體 

  11.         :param font_size: 指定字體大小 

  12.         :param speed: 背景圖滾動(dòng)整個(gè)窗口一次所用時(shí)間,單位為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è)置字體對(duì)象,得到系統(tǒng)中自帶的字體 

  20.         self.font = pygame.font.SysFont(font_name, font_size) 

  21.         # 得到Clock對(duì)象,我們可以使用它來(lái)獲取距離上次繪制圖像的時(shí)間 

  22.         self.clock = pygame.time.Clock() 

  23.         # 背景圖初始位置 

  24.         self.height = 0 

  25.         # 使用窗口的高度處于滾動(dòng)的時(shí)間,就能得到每ms滾動(dòng)的距離 

  26.         self.every_ms_move_distance = self.size[1] / speed   # 2秒 

  27.         # 分?jǐn)?shù) 

  28.         self.score = 0 

  29.         # 存放所有的敵機(jī) 

  30.         self.enemies = [] 

  31.  

  32.  

  33.     def show_score(self): 

  34.         ''' 

  35.         顯示分?jǐn)?shù), 在窗口的的最上方距離上邊距10px, 左右居中 

  36.         ''' 

  37.         pass 

  38.  

  39.  

  40.     def set_time_passed(self): 

  41.         # 控制畫 的幀, 越大越快 

  42.         # 得到上一次繪制圖像到到現(xiàn)在的時(shí)間, ms 

  43.         self.time_passed = self.clock.tick() 

  44.  

  45.  

  46.     def draw_background(self): 

  47.         ''' 

  48.         繪制背景圖片,一直向下滾動(dòng),營(yíng)造飛機(jī)一直往上面飛的感覺(jué) 

  49.         ''' 

  50.         # 每次移動(dòng)的距離 = 每ms移動(dòng)的距離 * 上次到現(xiàn)在的時(shí)間(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)建敵機(jī) 

  57.         :param image_path: 敵機(jī)的圖片地址 

  58.         :param enemy_number: 最多有幾個(gè)敵機(jī)在屏幕上 

  59.         ''' 

  60.         pass 

  61.  

  62.  

  63.     def draw_enemies(self, time_passed, screen): 

  64.         ''' 

  65.         繪制敵機(jī)到屏幕上,清理跑出窗口的敵機(jī), 

  66.         :param time_passed: 上次繪制導(dǎo)向現(xiàn)在經(jīng)過(guò)的時(shí)間 

  67.         :param screen: 繪制的窗口對(duì)象 

  68.         ''' 

  69.         pass 

  70.  

  71.  

  72.     def bullet_and_enemy_crash_detection(self, bullets): 

  73.         ''' 

  74.         檢測(cè)子彈是否擊中敵機(jī) 

  75.         :param bullets: 飛機(jī)的所有子彈 

  76.         ''' 

  77.         pass 

  78.  

  79.  

  80.     def plan_and_enemy_crash_detection(self, plan, allow_crash_size=None): 

  81.         ''' 

  82.         檢測(cè)敵機(jī)與飛機(jī)是否相撞 

  83.         :param plan: 飛機(jī)對(duì)象 

  84.         :param allow_crash_size: 允許飛機(jī)碰撞的大小,只有左右有效 

  85.         ''' 

  86.         pass 

  87.  

  88.  

  89.     def draw_plan(self, plan, time_passed): 

  90.         ''' 

  91.         繪制飛機(jī) 

  92.         :param plan: 飛機(jī)對(duì)象 

  93.         :param time_passed: 距離上次繪制的時(shí)間 

  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.         # 初始化一個(gè)飛機(jī)對(duì)象 

  117.         plan = Plan() 

  118.  

  119.         while True: 

  120.             # 如果飛機(jī)自毀完成, 游戲結(jié)束, 調(diào)用game_over函數(shù) 

  121.             pass 

  122.  

  123.             # 檢測(cè)監(jiān)聽事件 

  124.             pass 

  125.  

  126.             # 檢測(cè)上下左右的移動(dòng)案件. 

  127.             # w,a,s,d 和 上,下,左,右鍵都可以 

  128.             # 然后執(zhí)行plan.update函數(shù),改變飛機(jī)的位置 

  129.             pass 

  130.  

  131.             # 子彈和敵機(jī)的碰撞檢測(cè) 

  132.             self.bullet_and_enemy_crash_detection(plan.bullets) 

  133.             # 飛機(jī)與敵機(jī)的碰撞檢測(cè) 

  134.             self.plan_and_enemy_crash_detection(plan) 

  135.             # 設(shè)置屬性time_passed的值, 距離上次的時(shí)間,方便后面使用 

  136.             self.set_time_passed() 

  137.             # 繪制背景圖片 

  138.             self.draw_background() 

  139.             # 顯示分?jǐn)?shù) 

  140.             self.show_score() 

  141.             # 生成敵機(jī) 

  142.             self.create_enemy() 

  143.             # 繪制敵機(jī) 

  144.             self.draw_enemies(time_passed=self.time_passed, screen=self.screen) 

  145.             # 繪制飛機(jī) 

  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. 這里說(shuō)以下怎樣查看自己的系統(tǒng)中有哪些自帶的字體. 

  153. pygame.font.get_fonts(),這個(gè)函數(shù)就能夠得到系統(tǒng)中所有的自帶字體文件。不過(guò),當(dāng)我們游戲中有中文的時(shí)候,我們也得選擇支持中文的字體,否則的話是顯示不出中文的。 


怎么用Python寫個(gè)微信飛機(jī)大戰(zhàn)

實(shí)現(xiàn)DestroyAnimationMixin類,這個(gè)類主要是用來(lái)顯示飛機(jī)或敵機(jī)的自毀動(dòng)畫

# 顯示飛機(jī)自毀動(dòng)畫的Mixin類, 可用于飛機(jī)和敵機(jī)的自毀動(dòng)畫顯示 class DestroyAnimationMixin():      def show_destroy_animation(self, time_passed, destroy_time=200):         '''         顯示自毀動(dòng)畫         動(dòng)畫其實(shí)就是幾張圖片切換的比較快,我們的眼睛識(shí)別不出來(lái),所以認(rèn)為他是動(dòng)態(tài)的,也就是動(dòng)畫         :param time_passed: 距離上次繪制圖像到現(xiàn)在的時(shí)間,單位ms         :param destroy_time: 自毀動(dòng)畫總共顯示時(shí)間,單位ms         '''          # 因?yàn)槲覀兊淖詺D片有四張,需要依次顯示,首先動(dòng)畫的效果         # self.destroy_image_position 表示第幾章自毀圖片,從零開始         # 如果大于等于4了,說(shuō)明自毀動(dòng)畫顯示完成,設(shè)置self.destroyed變量為True, 方便別處調(diào)用         if self.destroy_image_position >= 4:             self.destroyed = True             return          # 依次加載自毀圖片         if self.time_passed >= destroy_time / 4:             self.image = pygame.image.load(os.path.join(source_dir, self.destroy_images[self.destroy_image_position])).convert_alpha()             self.destroy_image_position += 1             self.time_passed = 0         else:             self.time_passed += time_passed

怎么用Python寫個(gè)微信飛機(jī)大戰(zhàn)

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

# 飛機(jī)類,繼承DestroyAnimationMixin, 方便使用顯示自毀動(dòng)畫的函數(shù) class Plan(DestroyAnimationMixin):     def __init__(self, image_path=os.path.join(source_dir,'plan.png'), background_size=(480, 700)):         '''         :param image_path: 飛機(jī)圖片地址         :param background_size: 游戲窗口大小         '''         self.background_size = background_size         self.image = pygame.image.load(image_path).convert_alpha()         self.image_size = self.image.get_size()         self.position = [(background_size[0]-self.image_size[0]) / 2, 500]         # 飛機(jī)每次移動(dòng)的距離         self.every_time_move_distance = 0.5         # 飛機(jī)的子彈         self.bullets = []         # destroy association attributes, 自毀相關(guān)屬性         # 開始自毀         self.start_destroy = False         # 自毀結(jié)束         self.destroyed = False         # 自毀圖片         self.destroy_images = ['me_destroy_1.png', 'me_destroy_2.png', 'me_destroy_3.png', 'me_destroy_4.png']         # 自毀圖片位置         self.destroy_image_position = 0         # 距離上次繪制圖像到現(xiàn)在的時(shí)間         self.time_passed = 0      def update(self, direction):         '''         更新飛機(jī)位置         :param direction: 飛機(jī)移動(dòng)方向         '''         pass      def shut(self, image_path=os.path.join(source_dir,'bullet.png')):         '''         飛機(jī)發(fā)射子彈         :param image_path: 子彈圖片         '''         pass      def draw_bullets(self, time_passed, screen):         '''         繪制飛機(jī)的所有子彈         :param time_passed: 距離上次繪制圖像到現(xiàn)在的時(shí)間         :param screen: 繪制到哪一個(gè)窗口中         '''         pass

怎么用Python寫個(gè)微信飛機(jī)大戰(zhàn)

實(shí)現(xiàn)敵機(jī)類,完成敵機(jī)的主要操作。主要是用來(lái)更新位置。

# 敵機(jī)類,繼承DestroyAnimationMixin, 方便使用顯示自毀動(dòng)畫的函數(shù) class Enemy(DestroyAnimationMixin):     def __init__(self, image_path=os.path.join(source_dir, 'enemy1.png'), speed=2000, background_size=(480, 700)):         '''         :param image_path: 敵機(jī)圖片地址         :param speed: 敵機(jī)移動(dòng)整個(gè)窗口需要的時(shí)間,單位ms,也就是速度         :param background_size: 游戲窗口的尺寸         '''         self.image = pygame.image.load(image_path).convert_alpha()         self.speed = background_size[1] / speed         self.background_size = background_size         self.position = [random.randint(0, background_size[0]-self.image.get_size()[0]), -self.image.get_size()[1]]         # 開始自毀         self.start_destroy = False         # 自毀完成         self.destroyed = False         # 自毀圖片路徑         self.destroy_images = ['enemy1_down1.png', 'enemy1_down2.png', 'enemy1_down3.png', 'enemy1_down3.png']         # 距離上次繪制圖像到現(xiàn)在的時(shí)間         self.time_passed = 0         # 自毀圖片在self.destroy_images的位置         self.destroy_image_position = 0      def update(self, time_passed):         '''         更新敵機(jī)的位置         :param time_passed: 距離上次繪制圖像到現(xiàn)在的時(shí)間         :return:         '''         pass

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

# 飛機(jī)子彈類 class Bullet():     def __init__(self, image_path=os.path.join(source_dir,'bullet.png'), background_size=(480, 700), plan=None, speed=1000):         '''         :param image_path: 子彈的圖片地址         :param background_size: 游戲窗口大小         :param plan: 飛機(jī)對(duì)象         :param speed: 子彈飛行速度         '''         self.image = pygame.image.load(image_path).convert_alpha()         self.background_size = background_size         self.speed = background_size[1] / speed         # 子彈是否擊中敵機(jī)         self.destroyed = False         self.position = self._get_position(plan)      def _get_position(self, plan):         '''         根據(jù)plan得到子彈發(fā)出位置         :param plan: 飛機(jī)對(duì)象         '''         bullet_size = self.image.get_size()         plan_width = plan.image_size[0]         x = (plan_width-bullet_size[0]) / 2         return [plan.position[0] + x, plan.position[1]]      def update(self, time_passed):         '''         改變子彈位置         :param time_passed: 距離上次繪制圖像到現(xiàn)在的時(shí)間         '''         # 如果子彈超出屏幕或者擊中敵機(jī),就設(shè)置self.position[1]為-100,在plan.draw的時(shí)候就移除它         if self.position[1] + self.image.get_size()[1] <= 0 or self.destroyed:             self.position[1] = -100             return          # 改變的距離 = 時(shí)間 * 速率         self.position[1] -= time_passed * self.speed

怎么用Python寫個(gè)微信飛機(jī)大戰(zhàn)

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

看完了這篇文章,相信你對(duì)“怎么用Python寫個(gè)微信飛機(jī)大戰(zhàn)”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI