Python学习笔记(飞机大战项目练习)---B站黑马程序员
生活随笔
收集整理的這篇文章主要介紹了
Python学习笔记(飞机大战项目练习)---B站黑马程序员
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
學習目標:
完整的一個小項目開發(fā)
提示:這里可以添加學習目標
例如:
- 一周Python入門項目實戰(zhàn)知識
學習內(nèi)容:
0 安裝pygame 模塊:
PS C:\Users\tanyugen\PycharmProjects\python_s3> py -m pip install -U pygame --user
01 使用pygame創(chuàng)建圖形窗口
1.1 游戲的初始化和退出pygame.init()pygame.quit()1.2 理解游戲中的坐標系(x, y) (width, height)import pygame# 描述矩形區(qū)域 Rect(x, y, width, height)hero_rect = pygame.Rect(100, 500, 120, 125)print("hero 0 point %d %d" % (hero_rect.x, hero_rect.y))print("hero size %d %d" % (hero_rect.width, hero_rect.height))print("%d %d" % hero_rect.size)1.3 創(chuàng)建游戲主窗口pygame.display 用于創(chuàng)建和管理窗口pygame.display.set_mode() # 初始化窗口pygame.display.update() # 刷新屏幕內(nèi)容顯示,稍后使用02 理解圖像,并實現(xiàn)圖像繪制
2.1 使用pygame.image.load() #加載圖像 2.2 使用blit方法,將圖像繪制到指定位置 2.3 使用pygame.display.update() 更新屏幕的顯示import pygamepygame.init()# create game display screen = pygame.display.set_mode((480, 650)) # set_mode(resolution(0, 0), flags=0, depth=0) # draw background picture # 1. load picture bg = pygame.image.load("./images/background.png") # 2. blit 繪制圖像 screen.blit(bg, (0, 0)) # 3. update screen pygame.display.update()# draw hero's plane hero = pygame.image.load("./images/me1.png") screen.blit(hero, (150, 500)) pygame.display.update()while True:pass pygame.quit()03 游戲循環(huán)和游戲時鐘
3.1 游戲時鐘:# 創(chuàng)建時鐘對象clock = pygame.time.Clock()i = 0while True:# 可以指定循環(huán)體內(nèi)部循環(huán)執(zhí)行的頻率clock.tick(60)print(i)pygame.display.update()i += 1# pass3.2 英雄的簡單動畫實現(xiàn)# 1. rect記錄飛機的初始位置hero_rect = pygame.Rect(150, 300, 102, 126)while True:# 可以指定循環(huán)體內(nèi)部循環(huán)執(zhí)行的頻率clock.tick(60)# 2. 修改飛機的位置hero_rect.y -= 1# 判斷飛機位置if hero_rect.y <= -126:hero_rect.y = 650# 3. blit 繪制圖像screen.blit(bg, (0, 0)) # 重新繪制背景,覆蓋原有殘影screen.blit(hero, hero_rect)# 4. uodate 更新顯示pygame.display.update()3.3 游戲循環(huán)中的監(jiān)聽事件事件 event代碼實現(xiàn):pygame.event.get() # 可以獲得用戶當前動作的事件列表# 捕獲事件event_list = pygame.event.get()if len(event_list) > 0:print(event_list)演練: import pygamepygame.init()# create game displayscreen = pygame.display.set_mode((480, 650)) # set_mode(resolution(0, 0), flags=0, depth=0)# draw background picture# 1. load picturebg = pygame.image.load("./images/background.png")# 2. blit 繪制圖像screen.blit(bg, (0, 0))# 3. update screen# pygame.display.update()# draw hero's planehero = pygame.image.load("./images/me1.png")# screen.blit(hero, (200, 500))# pygame.display.update()# 創(chuàng)建時鐘對象clock = pygame.time.Clock()# 1. rect記錄飛機的初始位置hero_rect = pygame.Rect(200, 300, 102, 126)while True:# 可以指定循環(huán)體內(nèi)部循環(huán)執(zhí)行的頻率clock.tick(60)# 事件監(jiān)聽for event in pygame.event.get():# 判讀事件類型是否是退出事件if event.type == pygame.QUIT:print("Game over!!!")# 卸載所有模塊pygame.quit()# 直接終止當前正在執(zhí)行的程序exit()# 不能使用break,只會退出while循環(huán),不會終止程序# break# 2. 修改飛機的位置hero_rect.y -= 1# 判斷飛機位置if hero_rect.y <= -126:hero_rect.y = 650# 3. blit 繪制圖像screen.blit(bg, (0, 0)) # 重新繪制背景,覆蓋原有殘影screen.blit(hero, hero_rect)# 4. uodate 更新顯示pygame.display.update()# passpygame.quit()04 精靈和精靈組
pygame 提供兩個類:
pygame.sprite.Sprite 存儲圖像數(shù)據(jù)image和位置rect的對象
pygame.sprite.Group
代碼實現(xiàn):
01 planes_sprites.py
import random # Python 標準模塊 import pygame # Python 第三方模塊# 屏幕大小常量 SCREEN_RECT = pygame.Rect(0, 0, 480, 650) # 刷新率常量 FRAME_PER_SEC = 60 # 創(chuàng)建敵機的定時器常量 CREATE_ENEMY_EVENT = pygame.USEREVENT # 英雄發(fā)射子彈事件 HERO_FIRE_EVENT = pygame.USEREVENT + 1class GameSprite(pygame.sprite.Sprite):"""飛機大戰(zhàn)游戲精靈"""def __init__(self, image_name, speed=1):# 調(diào)用一下父類的初始化方法super().__init__()# 定義對象的屬性self.image = pygame.image.load(image_name)self.rect = self.image.get_rect()self.speed = speeddef update(self):# 在屏幕垂直方向上移動self.rect.y += self.speedclass Background(GameSprite):"""游戲背景精靈"""def __init__(self, is_alt=False):# 調(diào)用父類方法,實現(xiàn)精靈實現(xiàn)super().__init__("./images/background.png")# 判斷是交替圖像,是則設(shè)置初始位置if is_alt:self.rect.y = -self.rect.heightdef update(self):# 1. 調(diào)用父類的方法實現(xiàn)super().update()# 2. 判斷圖像是否移出屏幕,移出則重新到屏幕上方if self.rect.y >= SCREEN_RECT.height:self.rect.y = -self.rect.heightclass Enemy(GameSprite):"""敵機精靈"""def __init__(self):# 1. 調(diào)用父類方法,創(chuàng)建敵機精靈,指定圖片super().__init__("./images/enemy1.png")# 2. 指定敵機的初始隨機速度(1-3)self.speed = random.randint(1, 3)# 3. 指定敵機的初始隨機位置self.rect.bottom = 0 # bottom=rect.y-rect.heightmax_x = SCREEN_RECT.width - self.rect.widthself.rect.x = random.randint(0, max_x)def update(self):# 1. 調(diào)用父類方法,保持垂直方向的飛行super().update()# 2. 判斷是否飛出屏幕,如果是則從精靈組刪除精靈(釋放內(nèi)存)if self.rect.y >= SCREEN_RECT.height:# print("飛出屏幕")# kill 方法可以將精靈從所有精靈組中移出,精靈就會自動銷毀self.kill()def __del__(self):# 驗證 銷毀敵機精靈的方法# print("Enemy is dead~~~ %s" % self.rect)passclass Hero(GameSprite):"""英雄"""def __init__(self):# 1. 調(diào)用父類方法,設(shè)置image&speedsuper().__init__("./images/me1.png", 0)# 2. 設(shè)置英雄的初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 120# 3. 創(chuàng)建子彈的精靈組self.bullets = pygame.sprite.Group()def update(self):# 英雄在水平方向移動self.rect.x += self.speed# 判斷英雄水平方向位置if self.rect.centerx < 0:self.rect.centerx = 0elif self.rect.centerx > SCREEN_RECT.width: # or SCREEN_RECT.rightself.rect.centerx = SCREEN_RECT.widthdef fire(self):print("Fire shoot----")for i in (0,1,2):# 1. 創(chuàng)建子彈精靈bullet = Bullet()# 2, 設(shè)置精靈的位置bullet.rect.bottom = self.rect.top-i*20bullet.rect.centerx = self.rect.centerx# 3. 將精靈添加到精靈組self.bullets.add(bullet)class Bullet(GameSprite):"""子彈精靈"""def __init__(self):# 調(diào)用父類方法,設(shè)置子彈圖片,設(shè)置初始速度super().__init__("./images/bullet1.png", -2)def update(self):# 調(diào)用父類方法,讓子彈沿垂直方向運行super().update()# 判斷子彈位置,飛出屏幕則刪除if self.rect.bottom < 0:self.kill()def __del__(self):print("子彈被銷毀")02 planes_sprites_group.py
import pygame # from 方法導(dǎo)入,可以直接使用 from planes_sprites import *pygame.init()# create game display screen = pygame.display.set_mode((480, 650)) # set_mode(resolution(0, 0), flags=0, depth=0) # draw background picture # 1. load picture bg = pygame.image.load("./images/background.png") # 2. blit 繪制圖像 screen.blit(bg, (0, 0)) # 3. update screen # pygame.display.update()# draw hero's plane hero = pygame.image.load("./images/me1.png") # screen.blit(hero, (200, 500)) # pygame.display.update()# 創(chuàng)建時鐘對象 clock = pygame.time.Clock()# 1. rect記錄飛機的初始位置 hero_rect = pygame.Rect(200, 300, 102, 126)# 創(chuàng)建敵機的精靈 enemy = GameSprite("./images/enemy1.png") enemy1 = GameSprite("./images/enemy1.png", 2) # 創(chuàng)建敵機精靈組 enemy_group = pygame.sprite.Group(enemy, enemy1)while True:# 可以指定循環(huán)體內(nèi)部循環(huán)執(zhí)行的頻率clock.tick(60)# 事件監(jiān)聽for event in pygame.event.get():# 判讀事件類型是否是退出事件if event.type == pygame.QUIT:print("Game over!!!")# 卸載所有模塊pygame.quit()# 直接終止當前正在執(zhí)行的程序exit()# 不能使用break,只會退出while循環(huán),不會終止程序# break# 2. 修改飛機的位置hero_rect.y -= 1# 判斷飛機位置if hero_rect.y <= -126:hero_rect.y = 650# 3. blit 繪制圖像screen.blit(bg, (0, 0)) # 重新繪制背景,覆蓋原有殘影screen.blit(hero, hero_rect)# 讓精靈組調(diào)用兩個方法:# update 方法--讓組中精靈更新位置enemy_group.update()# draw 方法--在屏幕上繪制所有精靈enemy_group.draw(screen)# 4. uodate 更新顯示pygame.display.update()# pass pygame.quit()03 plane_main.py
import pygame from planes_sprites import *class PlaneGame(object):"""飛機大戰(zhàn)主游戲"""def __init__(self):print("游戲初始化")# 1. 創(chuàng)建游戲窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)# 2. 創(chuàng)建游戲時鐘self.clock = pygame.time.Clock()# 3. 調(diào)用私有方法,精靈和精靈組的創(chuàng)建self.__create_sprites()# 4. 設(shè)置定時器事件-創(chuàng)建敵機 1spygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)pygame.time.set_timer(HERO_FIRE_EVENT, 500)def __create_sprites(self):# 創(chuàng)建背景精靈和精靈組# bg1 = Background("./images/background.png")# bg2 = Background("./images/background.png")# bg2.rect.y = -bg2.rect.heightbg1 = Background()bg2 = Background(True)self.back_group = pygame.sprite.Group(bg1, bg2)# 創(chuàng)建敵機的精靈組self.enemy_group = pygame.sprite.Group()# 創(chuàng)建英雄的精靈和精靈組self.hero = Hero() # 把英雄設(shè)置成了屬性,為后續(xù)碰撞檢測,調(diào)用發(fā)射子彈方法self.hero_group = pygame.sprite.Group(self.hero)def start_game(self):print("Start game")while True:# 1. 設(shè)置刷新率self.clock.tick(FRAME_PER_SEC)# 2. 事件監(jiān)聽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():# 監(jiān)聽退出與否if event.type == pygame.QUIT:PlaneGame.__game_over()elif event.type == CREATE_ENEMY_EVENT:# 創(chuàng)建敵機精靈enemy = Enemy()# 將敵機精靈加到敵機精靈組self.enemy_group.add(enemy)# print("Enemy is here!!!")elif event.type == HERO_FIRE_EVENT:self.hero.fire()# elif event.type == pygame.KEYDOWN and event.key == pygame.K_RIGHT:# print("向右移動。。。")# 使用鍵盤提供的方法獲取鍵盤按鍵keys_pressed = pygame.key.get_pressed()# 判斷元祖中對應(yīng)的按鍵索引值,1if keys_pressed[pygame.K_RIGHT]:self.hero.speed = 2elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -2else:self.hero.speed = 0# print("保持向右移動。。。")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)# 判斷列表是否有內(nèi)容if len(enemies) > 0:# 讓英雄犧牲self.hero.kill()# 游戲結(jié)束self.__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():print("Game over")pygame.quit()exit()if __name__ == '__main__':# 創(chuàng)建游戲?qū)ο?/span>game = PlaneGame()# 啟動游戲game.start_game()總結(jié)
以上是生活随笔為你收集整理的Python学习笔记(飞机大战项目练习)---B站黑马程序员的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PyTorch图神经网络实践(七)社区检
- 下一篇: python getopt argpar