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

基于Python制作flappybird游戲的詳細步驟

 更新時間:2022年05月18日 11:39:26   作者:biyezuopinvip  
python中pygame模塊能讓我們很方便的編寫游戲,下面這篇文章主要給大家介紹了關于如何基于Python制作flappybird游戲的詳細步驟,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

導語

因為疫情無奈只能在家宅了好多天,隨手玩了下自己以前做的一些小游戲,說真的,有幾個游戲做的是真的劣質,譬如 flappybird 真的讓我難以忍受,于是重做了一波分享給大家~

開發(fā)工具

**Python****版本:**3.6.4

相關模塊:

pygame 模塊;

以及一些 python 自帶的模塊

環(huán)境搭建

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

先睹為快

在 cmd 窗口運行如下命令即可:

python Game6.py

原理簡介

因為是重寫的,所以就重新介紹一下實現原理唄。

首先,我們來寫個開始界面,讓他看起來更像個游戲一些。效果大概是這樣的:

原理也簡單,關鍵點有三個:(1)下方深綠淺綠交替的地板不斷往左移動來制造小鳥向前飛行的假象;(2)每過幾幀切換一下小鳥的圖片來實現小鳥翅膀扇動的效果:

(3)有規(guī)律地改變小鳥豎直方向上的位置來實現上下移動的效果。

具體而言,代碼實現如下:

'''顯示開始界面'''
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)

點擊空格鍵或者 ↑ 鍵進入主程序。對于主程序,在進行了必要的初始化工作之后,在游戲開始界面中實現的內容的基礎上,主要還需要實現的內容有以下幾個部分:

(1) 管道和深綠淺綠交替的地板不斷往左移來實現小鳥向前飛行的效果;

(2) 按鍵檢測,當玩家點擊空格鍵或者 ↑ 鍵時,小鳥向上做加速度向下的均減速直線運動直至向上的速度衰減為 0,否則小鳥做自由落體運動(實現時為了方便,可以認為在極短的時間段內小鳥的運動方式為勻速直線運動);

(3) 碰撞檢測,當小鳥與管道/游戲邊界碰撞到時,游戲失敗并進入游戲結束界面。注意,為了碰撞檢測更精確,我們使用:

pygame.sprite.collide_mask

來代替之前的:

pygame.sprite.collide_rect

(4) 進入游戲后,隨機產生兩對管道,并不斷左移,當最左邊的管道快要因為到達游戲界面的左邊界而消失時,重新生成一對管道(注意不要重復生成);

(5) 當小鳥穿越一個上下管道之間的缺口時,游戲得分加一(注意不要重復記分)。

這里簡單貼下主程序的源代碼吧:

# 進入主游戲
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()
# --管道類
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類
bird = Bird(images=bird_images, idx=bird_idx, position=bird_pos)
# --是否增加pipe
is_add_pipe = True
# --游戲是否進行中
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()
  # --碰撞檢測
  for pipe in pipe_sprites:
    if pygame.sprite.collide_mask(bird, pipe):
      sounds['hit'].play()
      is_game_running = False
  # --更新小鳥
  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
  # --移動base實現小鳥往前飛的效果
  base_pos[0] = -((-base_pos[0] + 4) % base_diff_bg)
  # --移動pipe實現小鳥往前飛的效果
  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)

游戲結束后,進入游戲界面。沒找到對應的游戲素材,所以只是讓游戲界面靜止了,然后小鳥做自由落體運行直到掉到地面上。代碼實現如下:

'''游戲結束界面'''
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)

再點擊一下空格鍵或者 ↑ 鍵即可重新開始游戲。

All done 完整源代碼詳見相關文件

se_pos)
showScore(screen, score, number_images)
bird.draw(screen)
pygame.display.update()
clock.tick(cfg.FPS)

再點擊一下空格鍵或者 ↑ 鍵即可重新開始游戲。

總結

到此這篇關于基于Python制作flappybird游戲的文章就介紹到這了,更多相關Python制作flappybird游戲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 使用Python進行批量操作PPT的示例詳解

    使用Python進行批量操作PPT的示例詳解

    將一份PPT的每一頁字體、大小、是否加粗都統(tǒng)一,是一個常見需求,本文將使用Python實現批量操作PPT,感興趣的小伙伴可以跟隨小編一起學習一下
    2025-04-04
  • Python實現二維曲線擬合的方法

    Python實現二維曲線擬合的方法

    今天小編就為大家分享一篇Python實現二維曲線擬合的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • tensorflow模型的save與restore,及checkpoint中讀取變量方式

    tensorflow模型的save與restore,及checkpoint中讀取變量方式

    這篇文章主要介紹了tensorflow模型的save與restore,及checkpoint中讀取變量方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 微信公眾號腳本-獲取熱搜自動新建草稿并發(fā)布文章

    微信公眾號腳本-獲取熱搜自動新建草稿并發(fā)布文章

    本來想寫一個自動化發(fā)布微信公眾號的小綠書的腳本,但是微信公眾號官網沒有小綠書的接口,那就寫一個獲取熱搜微信普通文章的腳本吧,這篇文章主要介紹了微信公眾號腳本-獲取熱搜自動新建草稿并發(fā)布文章
    2025-04-04
  • PyCharm MySQL可視化Database配置過程圖解

    PyCharm MySQL可視化Database配置過程圖解

    這篇文章主要介紹了PyCharm MySQL可視化Database配置過程圖解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-06-06
  • 詳解Python time庫的使用

    詳解Python time庫的使用

    這篇文章主要介紹了Python time庫的使用,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • python在命令行中使用?pdb?實現斷點調試功能

    python在命令行中使用?pdb?實現斷點調試功能

    在命令行中設置斷點通常需要使用調試工具來實現,下面以 Python 為例介紹如何在命令行中使用pdb實現斷點調試,這篇文章主要介紹了python在命令行中使用pdb實現斷點調試,需要的朋友可以參考下
    2023-06-06
  • Pytorch DataLoader 變長數據處理方式

    Pytorch DataLoader 變長數據處理方式

    今天小編就為大家分享一篇Pytorch DataLoader 變長數據處理方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python使用PIL庫將PNG圖片轉換為ICO圖標的示例代碼

    Python使用PIL庫將PNG圖片轉換為ICO圖標的示例代碼

    在軟件開發(fā)和網站設計中,ICO圖標是一種常用的圖像格式,特別適用于應用程序圖標、網頁收藏夾圖標等場景,本文將介紹如何使用Python的PIL庫將PNG圖片轉換為ICO格式的圖標文件,需要的朋友可以參考下
    2025-03-03
  • Python?os和os.path模塊詳情

    Python?os和os.path模塊詳情

    這篇文章主要介紹了Python?os和os.path模塊詳情,文章圍繞主題展開詳細的相關內容,具有一定的參考價值,需要的小伙伴可以參考一下,希望對你的學習有所幫助
    2022-04-04

最新評論

乐山市| 隆安县| 威宁| 苍梧县| 巫山县| 贵南县| 都昌县| 枣阳市| 汉中市| 赣州市| 长治市| 镇宁| 道真| 左贡县| 七台河市| 修水县| 仪征市| 宜阳县| 洪泽县| 台前县| 阳信县| 资中县| 苏尼特右旗| 宽城| 桂东县| 武威市| 霸州市| 莱西市| 长汀县| 葫芦岛市| 溧水县| 民勤县| 乾安县| 建昌县| 保德县| 宝坻区| 板桥市| 华坪县| 青阳县| 酉阳| 龙川县|