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

歡迎訪問 生活随笔!

生活随笔

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

python

Python学习笔记(飞机大战项目练习)---B站黑马程序员

發布時間:2023/12/20 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python学习笔记(飞机大战项目练习)---B站黑马程序员 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

學習目標:

完整的一個小項目開發
提示:這里可以添加學習目標

例如:

  • 一周Python入門項目實戰知識

學習內容:

0 安裝pygame 模塊:
PS C:\Users\tanyugen\PycharmProjects\python_s3> py -m pip install -U pygame --user

# 驗證是否安裝成功 PS C:\Users\tanyugen\PycharmProjects\python_s3> python -m pygame.examples.aliens

01 使用pygame創建圖形窗口

1.1 游戲的初始化和退出pygame.init()pygame.quit()1.2 理解游戲中的坐標系![在這里插入圖片描述](https://img-blog.csdnimg.cn/700122357c1d487b8b33541a2dbf931a.png)(x, y) (width, height)import pygame# 描述矩形區域 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 創建游戲主窗口pygame.display 用于創建和管理窗口pygame.display.set_mode() # 初始化窗口pygame.display.update() # 刷新屏幕內容顯示,稍后使用

02 理解圖像,并實現圖像繪制

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 游戲循環和游戲時鐘

3.1 游戲時鐘:# 創建時鐘對象clock = pygame.time.Clock()i = 0while True:# 可以指定循環體內部循環執行的頻率clock.tick(60)print(i)pygame.display.update()i += 1# pass3.2 英雄的簡單動畫實現# 1. rect記錄飛機的初始位置hero_rect = pygame.Rect(150, 300, 102, 126)while True:# 可以指定循環體內部循環執行的頻率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 游戲循環中的監聽事件事件 event代碼實現: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()# 創建時鐘對象clock = pygame.time.Clock()# 1. rect記錄飛機的初始位置hero_rect = pygame.Rect(200, 300, 102, 126)while True:# 可以指定循環體內部循環執行的頻率clock.tick(60)# 事件監聽for event in pygame.event.get():# 判讀事件類型是否是退出事件if event.type == pygame.QUIT:print("Game over!!!")# 卸載所有模塊pygame.quit()# 直接終止當前正在執行的程序exit()# 不能使用break,只會退出while循環,不會終止程序# 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 存儲圖像數據image和位置rect的對象
pygame.sprite.Group

創建游戲精靈派生類import pygameclass 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使用from導入plane_sprites模塊from 導入模塊可以直接使用import 導入的模塊需要通過 模塊名. 來使用

代碼實現:

01 planes_sprites.py

import random # Python 標準模塊 import pygame # Python 第三方模塊# 屏幕大小常量 SCREEN_RECT = pygame.Rect(0, 0, 480, 650) # 刷新率常量 FRAME_PER_SEC = 60 # 創建敵機的定時器常量 CREATE_ENEMY_EVENT = pygame.USEREVENT # 英雄發射子彈事件 HERO_FIRE_EVENT = pygame.USEREVENT + 1class 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.speedclass Background(GameSprite):"""游戲背景精靈"""def __init__(self, is_alt=False):# 調用父類方法,實現精靈實現super().__init__("./images/background.png")# 判斷是交替圖像,是則設置初始位置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.heightclass Enemy(GameSprite):"""敵機精靈"""def __init__(self):# 1. 調用父類方法,創建敵機精靈,指定圖片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. 調用父類方法,保持垂直方向的飛行super().update()# 2. 判斷是否飛出屏幕,如果是則從精靈組刪除精靈(釋放內存)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. 調用父類方法,設置image&speedsuper().__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):# 英雄在水平方向移動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. 創建子彈精靈bullet = Bullet()# 2, 設置精靈的位置bullet.rect.bottom = self.rect.top-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("子彈被銷毀")

02 planes_sprites_group.py

import pygame # from 方法導入,可以直接使用 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()# 創建時鐘對象 clock = pygame.time.Clock()# 1. rect記錄飛機的初始位置 hero_rect = pygame.Rect(200, 300, 102, 126)# 創建敵機的精靈 enemy = GameSprite("./images/enemy1.png") enemy1 = GameSprite("./images/enemy1.png", 2) # 創建敵機精靈組 enemy_group = pygame.sprite.Group(enemy, enemy1)while True:# 可以指定循環體內部循環執行的頻率clock.tick(60)# 事件監聽for event in pygame.event.get():# 判讀事件類型是否是退出事件if event.type == pygame.QUIT:print("Game over!!!")# 卸載所有模塊pygame.quit()# 直接終止當前正在執行的程序exit()# 不能使用break,只會退出while循環,不會終止程序# 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)# 讓精靈組調用兩個方法:# 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):"""飛機大戰主游戲"""def __init__(self):print("游戲初始化")# 1. 創建游戲窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)# 2. 創建游戲時鐘self.clock = pygame.time.Clock()# 3. 調用私有方法,精靈和精靈組的創建self.__create_sprites()# 4. 設置定時器事件-創建敵機 1spygame.time.set_timer(CREATE_ENEMY_EVENT, 1000)pygame.time.set_timer(HERO_FIRE_EVENT, 500)def __create_sprites(self):# 創建背景精靈和精靈組# 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)# 創建敵機的精靈組self.enemy_group = pygame.sprite.Group()# 創建英雄的精靈和精靈組self.hero = Hero() # 把英雄設置成了屬性,為后續碰撞檢測,調用發射子彈方法self.hero_group = pygame.sprite.Group(self.hero)def start_game(self):print("Start game")while True:# 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:# 創建敵機精靈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()# 判斷元祖中對應的按鍵索引值,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)# 判斷列表是否有內容if len(enemies) > 0:# 讓英雄犧牲self.hero.kill()# 游戲結束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__':# 創建游戲對象game = PlaneGame()# 啟動游戲game.start_game()

總結

以上是生活随笔為你收集整理的Python学习笔记(飞机大战项目练习)---B站黑马程序员的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产精品一区二区三区久久 | 134vcc影院免费观看 | 九色亚洲| 一出一进一爽一粗一大视频 | 日韩人妻无码精品综合区 | 欧美另类高清videos的特点 | 韩国性猛交╳xxx乱大交 | 玖玖视频网 | 极品另类| 久久天天操 | 精品国产午夜福利在线观看 | 亚洲AV成人无码网站天堂久久 | 精品久久久久中文慕人妻 | 在线亚洲区 | 在线不卡视频 | 亚洲人成色777777老人头 | 人人爱人人看 | 奇米四色在线视频 | 亚洲一区二区免费在线观看 | 黄色在线免费视频 | 日本成人福利视频 | 久久综合色婷婷 | 亚洲自拍偷拍第一页 | 国产伦精品一区二区三区网站 | 国产日韩成人 | 韩国黄色网址 | 国产私人影院 | 久久国产福利 | 一级艳片新婚之夜 | 性xxxx另类xxⅹ | 三级网站| xxxx69国产| 国产91综合一区在线观看 | 欧美壮男野外gaytube | 亚洲性图一区二区 | 香蕉在线视频播放 | 翔田千里一区二区 | 蜜桃91麻豆精品一二三区 | 男生操女生在线观看 | 精品日日夜夜 | 亚洲国产乱 | 人体裸体bbbbb欣赏 | 亚洲精品123区 | 久久午夜无码鲁丝片午夜精品 | 亚洲成人av在线 | 国产午夜精品一区 | 亚洲高清毛片一区二区 | 免费在线视频观看 | 少妇性l交大片免费观看 | 精品国产乱码久久久久久久软件 | 永久免费成人 | 成人性色生活片 | 泷泽萝拉在线播放 | 国产午夜精品久久久久 | 农村妇女愉情三级 | 亚洲永久精品一区 | 又粗又大又硬又长又爽 | 美女扒开尿口给男人看 | 国产一区二区三区黄片 | 伊人福利在线 | 亚洲特级毛片 | 大度亲吻原声视频在线观看 | 日韩大胆视频 | 九九在线观看高清免费 | 91 在线视频| 三级电影在线看 | 草在线 | 18禁肉肉无遮挡无码网站 | 一级人爱视频 | 国产原创在线 | 免费又黄又爽又猛大片午夜 | 高潮在线视频 | 波多野结衣在线视频免费观看 | 国产在线精| 亚洲精品午夜国产va久久成人 | 欧美久久久久久又粗又大 | 国产日产精品一区二区三区四区 | 一起草视频在线播放 | 精品国产一二区 | 久久精品一二三区 | 日本夜夜操 | 国产丝袜一区二区三区 | a在线天堂 | 国产成人无码一区二区三区在线 | 2024av视频 | av av在线| 99精品久久久久久中文字幕 | 久久亚洲精品小早川怜子 | 欧美乱大交xxxxx潮喷l头像 | 外国av在线 | 精品中文字幕在线 | 日日夜夜爽 | 乳色吐息在线看 | 神马久久久久久久久久久 | 狠狠干影院 | 老女人毛片 | 欧美色图88 | 一卡二卡久久 | 强开小嫩苞一区二区三区网站 |