日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python学习-飞机大战

發布時間:2024/1/8 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python学习-飞机大战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、pygame正確安裝
1.安裝:pip install pygame
2.驗證安裝:python -m pygame.examples.aliens;安裝ok即會出現如下圖所示動畫

二、使用pygame創建圖像窗口
1.游戲的初始化和退出;要使用pygame提供的所有功能之前,必須先調用init方法;在游戲結束,需要調用quit方法

pygame.init()→游戲代碼→pygame.quit()

2.在游戲中,所有可見的元素都是以矩形區域來描述位置的;要描述一個矩形區域有4個要素(x,y(width,height));pygame.Rect用于專門描述矩形區域的
(pygame.Rect是一個比較特殊的類,內部只是封裝了一些數字計算,不需要執行pygame.init()方法就能直接使用)

舉個例子:

三.創建游戲主窗口;

模塊:pygame.display;用于創建、管理游戲窗口 方法:pygame.display.set_mode():初始化游戲顯示窗口pygame.display.update():刷新屏幕內容顯示,稍后使用set_moed(resolution=(0,0),flags=0,depth=0) →Surface

resolution:指定屏幕的寬和高;默認創建的窗口大小和屏幕大小一致
flags:指定屏幕的附加選項,例如是否全屏等等,默認不需要傳遞
depth:表示顏色的位置,默認自動匹配
Suface返回值;暫時可以理解為游戲的屏幕,游戲的元素都需要被繪制到游戲的屏幕上
注意:必須使用變量記錄set_mode方法的返回結果!(因為后續所有的圖像繪制都基于這個返回結果)
舉個例子:

import pygame pygame.init()#游戲代碼: screen = pygame.display.set_mode((480, 700)) #寬480,高700#游戲循環;為了做到游戲程序啟動后,不會立即退出, while True:passpygame.quit()

四.理解圖像并實現圖像繪制;
圖像文件初始是保存在磁盤上,如需使用,第一步就需要被加載到內存;要在屏幕上看到某一個圖像的內容,需要按照三個步驟:
①.使用pygame.image.load();加載圖像的數據 【load(file_path)】
②.使用游戲屏幕對象,調用blit方法將圖像繪制到指定位置怕【blit(圖像,位置)】
③.調用pygame.display.update()方法更新整個屏幕的顯示

舉個例子:

import pygame pygame.init()#游戲代碼: screen = pygame.display.set_mode((480, 700)) #寬480,高700#繪制背景圖像 """ ①.使用pygame.image.load();加載圖像的數據 ②.使用游戲屏幕對象,調用blit方法將圖像繪制到指定位置 ③.調用pygame.display.update()方法更新整個屏幕的顯示 """bg = pygame.image.load("./images/background.png") #load方法需要有返回值;將背景圖片的地址寫入 screen.blit(bg, (0, 0)) #blit方法里傳入倆個參數:圖像,位置 pygame.display.update() #必須要使用這個方法,才能更新到屏幕上 #游戲循環;為了做到游戲程序啟動后,不會立即退出, while True:passpygame.quit()

在游戲中,能夠看到的游戲元素大多是圖像;
圖像文件初始是保存在磁盤上的,如果需要使用,第一步就需要被加載到內存
要在屏幕上看到某一個圖像的內容,需要按照三個步驟:
①.使用pygame.image.load()加載圖像的數據
②.使用游戲屏幕對象,調用blit方法,將圖像繪制到指定位置
③.調用pygame.display.update()方法更新整個屏幕的顯示

五.繪制英雄圖像,并在屏幕上顯示

""" 需求: 1.加載me1.png圖像,創建英雄費飛機 2.將英雄飛機繪制在屏幕的(200,500)位置 3.調用屏幕更新顯示飛機圖像 """import pygame pygame.init()#游戲代碼: screen = pygame.display.set_mode((480, 700)) #寬480,高700#繪制背景圖像 """ ①.使用pygame.image.load();加載圖像的數據 ②.使用游戲屏幕對象,調用blit方法將圖像繪制到指定位置 ③.調用pygame.display.update()方法更新整個屏幕的顯示 """bg = pygame.image.load("./images/background.png") #load方法需要有返回值;將背景圖片的地址寫入 screen.blit(bg, (0, 0)) #blit方法里傳入倆個參數:圖像,位置 pygame.display.update() #必須要使用這個方法,才能更新到屏幕上 #游戲循環;為了做到游戲程序啟動后,不會立即退出# 繪制英雄的飛機并更新在屏幕上 hero = pygame.image.load("./images/me1.png") screen.blit(hero, (200, 500)) pygame.display.update() while True:passpygame.quit()

透明圖像:
png格式的圖像是支持透明的,在繪制圖像時,透明區域不會顯示任何內容,但是如果下方已經有內容,會透過透明區域顯示出來

六.update方法的作用
可以在所有繪制工作完成后,統一調用update方法

7.游戲循環

游戲循環的作用:
①.保證游戲不會直接退出
②.變化圖像位置-動畫效果 (每隔1/60s移動一下所有圖像的位置,調用pygame.display.update()更新屏幕顯示)
③.檢測用戶交互 ——按鍵,鼠標等

游戲由2個部分組成:游戲初始化 + 游戲循環
而游戲循環的開始,才意味著游戲的正式開始
游戲初始化:
①.設置游戲窗口
②.繪制圖像初始位置
③.設置游戲時鐘

游戲循環:
①.設置刷新幀率
②.檢測用戶交互
③.更新所有圖像位置
④.更新屏幕顯示

游戲時鐘(利用時鐘設置游戲循環的刷新幀率):
pygame專門提供了一個類:pygame.time.Clock()可以非常方便的設置屏幕繪制速度)刷新幀率;要使用時鐘對象,需要倆步
1)在游戲初始化創建一個時鐘對象
2)在游戲循環中讓時鐘對象調用tick(幀率)方法
tick方法會根據上次被調用的時間,自動設置游戲循環中的延時

英雄動畫效果實現:

""" 需求: 1.在游戲初始化定時一個pygame.Rect的變量記錄英雄的初始位置 2.在游戲循環中每次讓英雄的y-1(向上移動) 3.y<=0將英雄移動到屏幕的底部 """import pygame pygame.init()#游戲代碼: screen = pygame.display.set_mode((480, 700)) #寬480,高700#繪制背景圖像 """ ①.使用pygame.image.load();加載圖像的數據 ②.使用游戲屏幕對象,調用blit方法將圖像繪制到指定位置 ③.調用pygame.display.update()方法更新整個屏幕的顯示 """bg = pygame.image.load("./images/background.png") #load方法需要有返回值;將背景圖片的地址寫入 screen.blit(bg, (0, 0)) #blit方法里傳入倆個參數:圖像,位置 #游戲循環;為了做到游戲程序啟動后,不會立即退出# 繪制英雄的飛機并更新在屏幕上 hero = pygame.image.load("./images/me1.png") screen.blit(hero, (200, 500)) pygame.display.update()#創建游戲時鐘對象 clock = pygame.time.Clock()#定義rect記錄飛機的初始位置 hero_rect = pygame.Rect(200, 500, 102, 126)#游戲循環:意味著游戲的正式開始 while True:clock.tick(60)#2.修改飛機的位置hero_rect.y -=50#判斷飛機的位置if hero_rect.y <=0:hero_rect.y = 700#3.調用blit方法繪制圖像screen.blit(bg, (0, 0))#繪制游戲背景; 為了飛機回到原點,沒有殘影screen.blit(hero, hero_rect)#4.調用update方法更新顯示pygame.display.update()pygame.quit()

在游戲中監聽事件:

………………………………省略,沒有詳細的說明了~附帶代碼
plane_main.py

import pygame from plane_sprites import *""" 該文件為游戲的主程序;封裝主游戲類;創建游戲對象;啟動游戲 """class PlaneGame(object):"""飛機大戰主游戲"""def __init__(self):#1.創建游戲的窗口#self.screen = pygame.display.set_mode((480, 700)) #這個屏幕的大小值不固定,可以使用常量,在plane_sprites.py中設置常量,這邊引用即可self.screen = pygame.display.set_mode(SCREEN_RECT.size)#2.創建游戲的時鐘self.clock = pygame.time.Clock()#3.調用私有方法,精靈和精靈組的創建self.__creat_sprites()#設置定時器,創建敵機1~秒pygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)pygame.time.set_timer(HERO_FIRE_EVENT, 500)#創建私有方法(精靈和精靈組的創建)def __creat_sprites(self):#創建背景精靈和精靈組bg1 = BackGround()bg2 = BackGround(True)self.back_group = pygame.sprite.Group(bg1, bg2) #背景精靈組self.enemy_group = pygame.sprite.Group() #敵機精靈組self.hero = Hero()self.hero_group = pygame.sprite.Group(self.hero) #英雄精靈組#開始游戲,且循環游戲def start_time(self):while True:#print("開始游戲了……")#1.設置刷新幀率self.clock.tick(FRAME_PER_SEC)#2.事件監聽self.__event_handler()#3.碰撞檢測self.__check_collide()#4.更新精靈組self.__update_sprites()#5.更新屏幕顯示pygame.display.update()#事件監聽def __event_handler(self):for event in pygame.event.get():#判斷是否退出游戲if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:print("敵機出場……")enemy = Enemy()self.enemy_group.add(enemy)elif event.type == HERO_FIRE_EVENT:self.hero.fire()#使用鍵盤提供的方法獲取鍵盤按鍵(按鍵元組)keys_pressed = pygame.key.get_pressed()#判斷元組中對應的按鍵索引值 1if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2else:self.hero.speed = 0#碰撞檢測def __check_collide(self):#1.子彈摧毀敵機pygame.sprite.groupcollide(self.hero.bullets, self.enemy_group, True, True)#2.敵機撞毀英雄enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)#3.判斷列表有內容if len(enemies) > 0:#讓英雄犧牲self.hero.kill()#游戲結束PlaneGame.__game_over()#更新精靈組def __update_sprites(self):self.back_group.update()self.back_group.draw(self.screen)self.enemy_group.update()self.enemy_group.draw(self.screen)self.hero_group.update()self.hero_group.draw(self.screen)self.hero.bullets.update()self.hero.bullets.draw(self.screen)@staticmethoddef __game_over():pygame.quit()exit()if __name__ == '__main__':"""創建游戲對象"""game = PlaneGame()"""開始游戲"""game.start_time()

plane_sprites.py

import random import pygame # 屏幕大小的常量 SCREEN_RECT = pygame.Rect(0, 0, 480, 700)#刷新的幀率 FRAME_PER_SEC =60#定義敵機定時器的事件常量 CREATE_ENEMY_EVENT = pygame.USEREVENT#英雄發射子彈事件 HERO_FIRE_EVENT = pygame.USEREVENT + 1""" 該文件是封裝游戲中所有需要使用的精靈子類;提供游戲的相關工具;(比如屏幕尺寸大小,游戲精靈子類) """#創建游戲精靈基類;并繼承pygame.sprite.Sprite class GameSprite(pygame.sprite.Sprite):def __init__(self, image_name, speed=1):#調用父類的初始化方法super().__init__()#加載圖像self.image = pygame.image.load(image_name)#設置尺寸self.rect = self.image.get_rect()#記錄速度self.speed = speeddef update(self):#默認在垂直方向移動self.rect.y += self.speed#創建游戲背景精靈 class BackGround(GameSprite):def __init__(self, is_alt=False):# 1. 調用父類方法實現精靈的創建(image/rect/speed)super().__init__("./images/background.png")# 2. 判斷是否是交替圖像,如果是,需要設置初始位置if is_alt:self.rect.y = -self.rect.heightdef update(self):# 1. 調用父類的方法實現super().update()# 2. 判斷是否移出屏幕,如果移出屏幕,將圖像設置到屏幕的上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.height#創建敵機精靈 class Enemy(GameSprite):def __init__(self):#1.調用父類的方法,創建敵機精靈,并且指定敵機的圖像super().__init__("./images/enemy1.png")#2.設置敵機的隨機初始速度self.speed = random.randint(1, 3)#3.設置敵機的隨機初始位置self.rect.bottom = 0max_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0, max_x)def update(self, *args):#1.調用父類的方法,讓敵機在垂直方向運動super().update()#2.判斷是否飛出屏幕,如果是,需要將敵機從精靈組刪除if self.rect.y >= SCREEN_RECT.height:# print("敵機飛出屏幕")# kill方法可以將精靈從所有精靈組中移出,精靈就會被自動銷毀self.kill()def __del__(self):pass#創建英雄精靈 class Hero(GameSprite):def __init__(self):#1.調用父類方法,設置圖像和速度super().__init__("./images/me1.png", 0)#2.設置英雄的初始位置self.rect.centerx =SCREEN_RECT.centerxself.rect.bottom =SCREEN_RECT.bottom - 120#3.創建子彈的精靈組self.bullets = pygame.sprite.Group()def update(self):#1.英雄在水平方向移動self.rect.x += self.speed#控制英雄不能離開屏幕if self.rect.x < 0:self.rect.x = 0elif self.rect.right > SCREEN_RECT.right:self.rect.right = SCREEN_RECT.rightdef fire(self):print("發射子彈……")for i in (0, 1, 2):#1.創建子彈精靈bullet = Bullet()#2.設置精靈的位置bullet.rect.bottom = self.rect.y - i * 20bullet.rect.centerx = self.rect.centerx#3.將精靈添加到精靈組self.bullets.add(bullet)#創建子彈精靈類 class Bullet(GameSprite):def __init__(self):#調用父類方法,設置子彈圖片和設置初始速度super().__init__("./images/bullet1.png", -2)def update(self):#調用父類方法,讓子彈沿垂直方向飛行super().update()#判斷子彈是否飛出屏幕if self.rect.bottom < 0:self.kill()def __del__(self):print("子彈被銷毀……")

總結

以上是生活随笔為你收集整理的python学习-飞机大战的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。