最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python?flappy?bird小游戲分步實(shí)現(xiàn)流程

 更新時(shí)間:2022年02月15日 16:29:53   作者:迢迢x  
哈嘍,哈嘍~今天小編又來(lái)分享小游戲了——flappy?bird(飛揚(yáng)的小鳥(niǎo)),這個(gè)游戲非常的經(jīng)典,游戲中玩家必須控制一只小鳥(niǎo),跨越由各種不同長(zhǎng)度水管所組成的障礙

導(dǎo)語(yǔ):

哈嘍,哈嘍~今天小編又來(lái)分享小游戲了——flappy bird(飛揚(yáng)的小鳥(niǎo)),這個(gè)游戲非常的經(jīng)典,游戲中玩家必須控制一只小鳥(niǎo),跨越由各種不同長(zhǎng)度水管所組成的障礙。這個(gè)游戲能對(duì)于小編來(lái)說(shuō)還是有點(diǎn)難度的。

笨鳥(niǎo)先飛電腦版(flappy bird)

開(kāi)發(fā)工具:

Python版本:3.6.4

相關(guān)模塊:

pygame模塊;

以及一些python自帶的模塊。

環(huán)境搭建

安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。

運(yùn)行視頻:

圖片

播放鏈接:https://live.csdn.net/v/embed/184490

正文:

首先,我們來(lái)寫(xiě)個(gè)開(kāi)始界面,讓他看起來(lái)更像個(gè)游戲一些。效果大概是這樣的:

圖片

原理也簡(jiǎn)單,關(guān)鍵點(diǎn)有三個(gè):

(1)下方深綠淺綠交替的地板不斷往左移動(dòng)來(lái)制造小鳥(niǎo)向前飛行的假象;

(2)每過(guò)幾幀切換一下小鳥(niǎo)的圖片來(lái)實(shí)現(xiàn)小鳥(niǎo)翅膀扇動(dòng)的效果:

圖片

(3)有規(guī)律地改變小鳥(niǎo)豎直方向上的位置來(lái)實(shí)現(xiàn)上下移動(dòng)的效果。

具體而言,代碼實(shí)現(xiàn)如下:

'''顯示開(kāi)始界面'''
def startGame(screen, sounds, bird_images, other_images, backgroud_image, cfg):
  base_pos = [0, cfg.SCREENHEIGHT*0.79]
  base_diff_bg = other_images['base'].get_width() - backgroud_image.get_width()
  msg_pos = [(cfg.SCREENWIDTH-other_images['message'].get_width())/2, cfg.SCREENHEIGHT*0.12]
  bird_idx = 0
  bird_idx_change_count = 0
  bird_idx_cycle = itertools.cycle([0, 1, 2, 1])
  bird_pos = [cfg.SCREENWIDTH*0.2, (cfg.SCREENHEIGHT-list(bird_images.values())[0].get_height())/2]
  bird_y_shift_count = 0
  bird_y_shift_max = 9
  shift = 1
  clock = pygame.time.Clock()
  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
        pygame.quit()
        sys.exit()
      elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
          return {'bird_pos': bird_pos, 'base_pos': base_pos, 'bird_idx': bird_idx}
    sounds['wing'].play()
    bird_idx_change_count += 1
    if bird_idx_change_count % 5 == 0:
      bird_idx = next(bird_idx_cycle)
      bird_idx_change_count = 0
    base_pos[0] = -((-base_pos[0] + 4) % base_diff_bg)
    bird_y_shift_count += 1
    if bird_y_shift_count == bird_y_shift_max:
      bird_y_shift_max = 16
      shift = -1 * shift
      bird_y_shift_count = 0
    bird_pos[-1] = bird_pos[-1] + shift
    screen.blit(backgroud_image, (0, 0))
    screen.blit(list(bird_images.values())[bird_idx], bird_pos)
    screen.blit(other_images['message'], msg_pos)
    screen.blit(other_images['base'], base_pos)
    pygame.display.update()
    clock.tick(cfg.FPS)

點(diǎn)擊空格鍵或者↑鍵進(jìn)入主程序。對(duì)于主程序,在進(jìn)行了必要的初始化工作之后,在游戲開(kāi)始界面中實(shí)現(xiàn)的內(nèi)容的基礎(chǔ)上,主要還需要實(shí)現(xiàn)的內(nèi)容有以下幾個(gè)部分:

(1) 管道和深綠淺綠交替的地板不斷往左移來(lái)實(shí)現(xiàn)小鳥(niǎo)向前飛行的效果;

(2) 按鍵檢測(cè),當(dāng)玩家點(diǎn)擊空格鍵或者↑鍵時(shí),小鳥(niǎo)向上做加速度向下的均減速直線(xiàn)運(yùn)動(dòng)直至向上的速度衰減為0,否則小鳥(niǎo)做自由落體運(yùn)動(dòng)(實(shí)現(xiàn)時(shí)為了方便,可以認(rèn)為在極短的時(shí)間段內(nèi)小鳥(niǎo)的運(yùn)動(dòng)方式為勻速直線(xiàn)運(yùn)動(dòng));

(3) 碰撞檢測(cè),當(dāng)小鳥(niǎo)與管道/游戲邊界碰撞到時(shí),游戲失敗并進(jìn)入游戲結(jié)束界面。注意,為了碰撞檢測(cè)更精確,我們使用:

pygame.sprite.collide_mask

管道: 

圖片

圖片

(4) 進(jìn)入游戲后,隨機(jī)產(chǎn)生兩對(duì)管道,并不斷左移,當(dāng)最左邊的管道快要因?yàn)榈竭_(dá)游戲界面的左邊界而消失時(shí),重新生成一對(duì)管道(注意不要重復(fù)生成);

(5) 當(dāng)小鳥(niǎo)穿越一個(gè)上下管道之間的缺口時(shí),游戲得分加一(注意不要重復(fù)記分)。

計(jì)分表

圖片

這里簡(jiǎn)單貼下主程序的源代碼吧:

# 進(jìn)入主游戲
score = 0
bird_pos, base_pos, bird_idx = list(game_start_info.values())
base_diff_bg = other_images['base'].get_width() - backgroud_image.get_width()
clock = pygame.time.Clock()
# --管道類(lèi)
pipe_sprites = pygame.sprite.Group()
for i in range(2):
  pipe_pos = Pipe.randomPipe(cfg, pipe_images.get('top'))
  pipe_sprites.add(Pipe(image=pipe_images.get('top'), position=(cfg.SCREENWIDTH+200+i*cfg.SCREENWIDTH/2, pipe_pos.get('top')[-1])))
  pipe_sprites.add(Pipe(image=pipe_images.get('bottom'), position=(cfg.SCREENWIDTH+200+i*cfg.SCREENWIDTH/2, pipe_pos.get('bottom')[-1])))
# --bird類(lèi)
bird = Bird(images=bird_images, idx=bird_idx, position=bird_pos)
# --是否增加pipe
is_add_pipe = True
# --游戲是否進(jìn)行中
is_game_running = True
while is_game_running:
  for event in pygame.event.get():
    if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
      pygame.quit()
      sys.exit()
    elif event.type == pygame.KEYDOWN:
      if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
        bird.setFlapped()
        sounds['wing'].play()
  # --碰撞檢測(cè)
  for pipe in pipe_sprites:
    if pygame.sprite.collide_mask(bird, pipe):
      sounds['hit'].play()
      is_game_running = False
  # --更新小鳥(niǎo)
  boundary_values = [0, base_pos[-1]]
  is_dead = bird.update(boundary_values, float(clock.tick(cfg.FPS))/1000.)
  if is_dead:
    sounds['hit'].play()
    is_game_running = False
  # --移動(dòng)base實(shí)現(xiàn)小鳥(niǎo)往前飛的效果
  base_pos[0] = -((-base_pos[0] + 4) % base_diff_bg)
  # --移動(dòng)pipe實(shí)現(xiàn)小鳥(niǎo)往前飛的效果
  flag = False
  for pipe in pipe_sprites:
    pipe.rect.left -= 4
    if pipe.rect.centerx < bird.rect.centerx and not pipe.used_for_score:
      pipe.used_for_score = True
      score += 0.5
      if '.5' in str(score):
        sounds['point'].play()
    if pipe.rect.left < 5 and pipe.rect.left > 0 and is_add_pipe:
      pipe_pos = Pipe.randomPipe(cfg, pipe_images.get('top'))
      pipe_sprites.add(Pipe(image=pipe_images.get('top'), position=pipe_pos.get('top')))
      pipe_sprites.add(Pipe(image=pipe_images.get('bottom'), position=pipe_pos.get('bottom')))
      is_add_pipe = False
    elif pipe.rect.right < 0:
      pipe_sprites.remove(pipe)
      flag = True
  if flag: is_add_pipe = True
  # --綁定必要的元素在屏幕上
  screen.blit(backgroud_image, (0, 0))
  pipe_sprites.draw(screen)
  screen.blit(other_images['base'], base_pos)
  showScore(screen, score, number_images)
  bird.draw(screen)
  pygame.display.update()
  clock.tick(cfg.FPS)

游戲結(jié)束

假如我們的主角真的一個(gè)不小心如我們所料的撞死在了鋼管上(往上翻,就在游戲開(kāi)始那里),那就表示gameOver();

'''游戲結(jié)束界面'''
def endGame(screen, sounds, showScore, score, number_images, bird, pipe_sprites, backgroud_image, other_images, base_pos, cfg):
  sounds['die'].play()
  clock = pygame.time.Clock()
  while True:
    for event in pygame.event.get():
      if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
        pygame.quit()
        sys.exit()
      elif event.type == pygame.KEYDOWN:
        if event.key == pygame.K_SPACE or event.key == pygame.K_UP:
          return
    boundary_values = [0, base_pos[-1]]
    bird.update(boundary_values, float(clock.tick(cfg.FPS))/1000.)
    screen.blit(backgroud_image, (0, 0))
    pipe_sprites.draw(screen)
    screen.blit(other_images['base'], base_pos)
    showScore(screen, score, number_images)
    bird.draw(screen)
    pygame.display.update()
    clock.tick(cfg.FPS)

結(jié)尾:

這期游戲分享就到這結(jié)束啦喜歡的友友們動(dòng)手試試看哦!家人們的支持是小編更新最大的動(dòng)力

到此這篇關(guān)于python flappy bird小游戲分布實(shí)現(xiàn)流程的文章就介紹到這了,更多相關(guān)python flappy bird內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python支持同時(shí)存在多個(gè)版本的操作步驟

    python支持同時(shí)存在多個(gè)版本的操作步驟

    這篇文章主要介紹了python支持同時(shí)存在多個(gè)版本的操作步驟,在已有Python 3.8的情況下,安裝新的Python 3.9版本,感興趣的小伙伴可以參考文中步驟,文章中介紹的非常詳細(xì),需要的朋友可以參考下
    2024-03-03
  • Python3.7中安裝openCV庫(kù)的方法

    Python3.7中安裝openCV庫(kù)的方法

    這篇文章主要介紹了Python3.7中安裝openCV庫(kù)的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • 在Python中使用gRPC的方法示例

    在Python中使用gRPC的方法示例

    這篇文章主要介紹了在Python中使用gRPC的方法示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • win10安裝tesserocr配置 Python使用tesserocr識(shí)別字母數(shù)字驗(yàn)證碼

    win10安裝tesserocr配置 Python使用tesserocr識(shí)別字母數(shù)字驗(yàn)證碼

    這篇文章主要介紹了win10安裝tesserocr配置 Python使用tesserocr識(shí)別字母數(shù)字驗(yàn)證碼,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-01-01
  • python單例模式的應(yīng)用場(chǎng)景實(shí)例講解

    python單例模式的應(yīng)用場(chǎng)景實(shí)例講解

    在本篇文章里小編給大家整理的是一篇關(guān)于python單例模式的應(yīng)用場(chǎng)景實(shí)例講解內(nèi)容,有興趣的朋友們可以學(xué)習(xí)下。
    2021-02-02
  • Python 寫(xiě)了個(gè)新型冠狀病毒疫情傳播模擬程序

    Python 寫(xiě)了個(gè)新型冠狀病毒疫情傳播模擬程序

    這篇文章主要介紹了Python 寫(xiě)了個(gè)新型冠狀病毒疫情傳播模擬程序,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-02-02
  • python字符串拼接和列表拼接方式

    python字符串拼接和列表拼接方式

    這篇文章主要介紹了python字符串拼接和列表拼接方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • 2021年最新版Python安裝及使用教學(xué)

    2021年最新版Python安裝及使用教學(xué)

    今天帶大家學(xué)習(xí)的是Python的相關(guān)知識(shí),文章圍繞著Python的安裝及使用展開(kāi),文中有非常詳細(xì)的圖文示例及介紹,需要的朋友可以參考下
    2021-06-06
  • python遍歷 truple list dictionary的幾種方法總結(jié)

    python遍歷 truple list dictionary的幾種方法總結(jié)

    下面小編就為大家?guī)?lái)一篇python遍歷 truple list dictionary的幾種方法總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-09-09
  • Python如何使用帶有?for?循環(huán)的?Lambda?函數(shù)

    Python如何使用帶有?for?循環(huán)的?Lambda?函數(shù)

    這篇文章主要介紹了如何在?Python?中使用帶有?for?循環(huán)的?Lambda?函數(shù),使用?Lambda?函數(shù)配合?for?循環(huán)可以讓代碼變得更加簡(jiǎn)潔,但需要注意的是,Lambda?函數(shù)在語(yǔ)法上有一些限制,如果需要更復(fù)雜的邏輯,還需要使用普通函數(shù),感興趣的朋友跟隨小編一起學(xué)習(xí)吧
    2023-05-05

最新評(píng)論

农安县| 苏州市| 稻城县| 西乡县| 白玉县| 乌苏市| 阜康市| 仲巴县| 吴江市| 开鲁县| 磴口县| 扶余县| 分宜县| 景谷| 镇雄县| 益阳市| 许昌市| 呼和浩特市| 镇赉县| 兴安盟| 富顺县| 安新县| 太湖县| 鄢陵县| 古浪县| 保康县| 安丘市| 隆德县| 高淳县| 新晃| 股票| 乌拉特前旗| 淳化县| 安泽县| 自治县| 鞍山市| 韩城市| 阿合奇县| 漳浦县| 聂荣县| 温泉县|