中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么用python實現flappy bird游戲

發布時間:2021-11-03 11:12:17 來源:億速云 閱讀:144 作者:iii 欄目:開發技術

本篇內容介紹了“怎么用python實現flappy bird游戲”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

程序大概流程:1.加載圖片素材文件 2.繪畫開始界面,等待程序開始(按空格) 3 .程序刷新,不斷while 循環(a.隨機生成柱子,并移動,然后繪制 b.小鳥自下落 c.檢測鍵盤方向按鍵) 4.程序結束,繪制結束界面,把分數記錄到txt文件

# -*- coding: utf-8 -*-
"""
Created on Thu Dec 15 00:27:17 2016
BY LINJUNJI SYSU 1360622136@qq.com
"""
import pygame
from sys import exit
import random
from pygame.locals import *
from pygame.font import *  
from gamerole import *
import os
import datetime
import numpy as np
import operator

#圖片路徑信息
BackGround_image_path2='./sources/background/day.png'          #背景圖片
BackGround_image_path3='./sources/background/night.png'

GetStart_image_path='./sources/guide/day/down.png'           #開始界面
GameOver_image_path='./sources/other/gameover.png'
Restart_image_path='./sources/other/restart.png'

Grade_blackball_path='./sources/other/grade_blackball.png'
white_gold_Medal_image_path='./sources/medal/white_gold_medal.png'  #獎牌圖片
gold_image_path='./sources/medal/gold_medal.png'
silver_medal_image_path='./sources/medal/silver_medal.png'
bronze_medal_image_path='./sources/medal/bronze_medal.png'

Ground_image_path='./sources/background/ground.png'         #地面圖片

pilar_image_up_path='./sources/pilar/up.png'                #柱子圖片
pilar_image_down_path='./sources/pilar/down.png'
Bird_image1_path='./sources/bird/up.png'                   #小鳥圖片
Bird_image2_path='./sources/bird/med.png'
Bird_image3_path='./sources/bird/down.png'

#游戲窗體設置
pygame.init()
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
pygame.display.set_caption('falppy_bird') 

#圖片載入      
background_day=pygame.image.load(BackGround_image_path2)
background_night=pygame.image.load(BackGround_image_path3)
ground=pygame.image.load(Ground_image_path)
pilar_image_up=pygame.image.load(pilar_image_up_path)
pilar_image_down=pygame.image.load(pilar_image_down_path)
get_start_image=pygame.image.load(GetStart_image_path)
gameover_image=pygame.image.load(GameOver_image_path)
medal_blackball_image=pygame.image.load(Grade_blackball_path)
restart_image=pygame.image.load(Restart_image_path)

bird_images=[]
bird_image_up=pygame.image.load(Bird_image1_path)
bird_image_med=pygame.image.load(Bird_image2_path)
bird_image_down=pygame.image.load(Bird_image3_path)
bird_images.append(bird_image_up)
bird_images.append(bird_image_med)
bird_images.append(bird_image_down)

medal_images=[]
medal1=pygame.image.load(white_gold_Medal_image_path)
medal2=pygame.image.load(gold_image_path)
medal3=pygame.image.load(silver_medal_image_path)
medal4=pygame.image.load(bronze_medal_image_path)
medal_images.append(medal1)
medal_images.append(medal2)
medal_images.append(medal3)
medal_images.append(medal4)

#新建小鳥
bird_pos=[190,190]  #小鳥初始位置
mybird=Bird(bird_images,bird_pos)

#柱子集合
pilar_set = pygame.sprite.Group()

#運行參數設置
pilar_frequency=0  #柱子更新參數
bird_frequency=0   #小鳥飛行頻率
clock = pygame.time.Clock()
running=False
score=0
flag=1

def collide_circle(pilar, mybird):  #碰撞檢測函數
    if mybird.rect.right > pilar.pilar1_rect.left and mybird.rect.left < pilar.pilar1_rect.right:
        if (mybird.rect.top >pilar.pilar1_rect.bottom and mybird.rect.bottom <pilar.pilar2_rect.top):
            return False
        else:
            return True
    else:
        if mybird.rect.bottom > 400:
            return True
        else:
            return False
    
def get_history_record(score):     #獲取記錄的得分
    record=[]
    index =0
    if os.path.isfile("record.txt"):      #存在:獲取記錄到的內容  
        f=open("record.txt")
        line=f.readline()
        line=f.readline()
        while line !="":
            record.append([int(line.strip().split(",")[0]),line.strip().split(",")[1]])
            line=f.readline()
        f.close()
    record.append([score,str(datetime.datetime.now())])
    record.sort(key=operator.itemgetter(0),reverse=True)
    print record
    while len(record)>10:
        record.pop()
    file_writer = open("record.txt", 'w')
    file_writer.writelines("time"+","+"grade"+"\n")
    for i in range(len(record)):
        file_writer.writelines(str(record[i][0])+","+str(record[i][1])+"\n")
        if int(record[i][0]) == int(score):
            index=i
    file_writer.close()
    if index >3:
        index=3
    return record[0][0],index
    
    
while not running:
    clock.tick(60)   
    screen.fill(0)
    screen.blit(get_start_image, (0, 0)) 
    pygame.display.update()
    x, y=pygame.mouse.get_pos()   
    for event in pygame.event.get():
        if event.type ==pygame.QUIT:
            pygame.quit()
            exit()
        elif event.type == pygame.MOUSEBUTTONDOWN:
            if y<380 and y>300 and x>180 and x <210:
                running=True
    
while True:
    clock.tick(60)   
    pilar_frequency +=1    
    #生成柱子
    if pilar_frequency %100==0:
        pilar_pos=[384,random.randint(130, 250)]
        new_pilar=Pilar(pilar_image_up, pilar_image_down, pilar_pos)
        pilar_set.add(new_pilar) 
    if pilar_frequency >=1000:
        pilar_frequency=0 
        flag=(-1)*flag       
    #移動柱子
    for pilar in pilar_set:
        pilar.move()
        if collide_circle(pilar, mybird):  #碰撞檢測代碼
            mybird.is_hit=True 
            for pilar in pilar_set:
                pilar.stop()
        if pilar.pilar1_rect.right <0:
            pilar_set.remove(pilar) 
    #小鳥降落
    mybird.SelfMoveDown() 
    # 繪制背景
    screen.fill(0)
        
    if flag==1:
        screen.blit(background_day, (0, 0)) 
    else:
        screen.blit(background_night, (0, 0))
    #繪制柱子
    for pilar in pilar_set:
        screen.blit(pilar.pilar1_image,pilar.pilar1_rect)
        screen.blit(pilar.pilar2_image,pilar.pilar2_rect)
    #繪制地面   
    screen.blit(ground,(0,384))
    #繪制玩家小鳥
    bird_frequency +=1   
    if not mybird.is_hit:  #未發生碰撞
        score +=10
        screen.blit(mybird.image[mybird.image_index],mybird.rect)
        mybird.image_index=bird_frequency % 3 
    else:  #發生碰撞
        running=False 
        mybird.SelfDiedDown()
        screen.blit(mybird.image[0],mybird.rect)
        has_log=False
        while not running and mybird.is_downtoground:     #畫面切換到結束界面           
            screen.blit(gameover_image,(64,30))
            screen.blit(medal_blackball_image,(42,100))
            screen.blit(restart_image,(122,270))
            if not has_log:                   
                bestscore,index=get_history_record(score/100) #獲取歷史記錄情況
                print score/100
                print bestscore,index
                has_log=True
            screen.blit(medal_images[index],(75,160))        #要讀取之前保存的信息,
            x, y=pygame.mouse.get_pos()  
            
            #目前得分
            score_font = pygame.font.Font(None, 36)
            score_text = score_font.render(str(score/100), True, (255,255,255))
            text_rect = score_text.get_rect()
            text_rect.midtop = [290, 145]
            screen.blit(score_text, text_rect)
            #歷史最佳得分
            score_font = pygame.font.Font(None, 36)
            score_text = score_font.render(str(bestscore), True, (255,255,255))
            text_rect = score_text.get_rect()
            text_rect.midtop = [290,200]
            screen.blit(score_text, text_rect)
            
            for event in pygame.event.get():
                if event.type ==pygame.QUIT:
                    pygame.quit()
                    exit()
                elif event.type == pygame.MOUSEBUTTONDOWN:
                    if y<360 and y>280 and x>150 and x <240:  #重新開始
                        pilar_set = pygame.sprite.Group()
                        mybird=Bird(bird_images,bird_pos)
                        score=0
                        running=True
            pygame.display.update()            
        
    # 繪制得分  
    score_font = pygame.font.Font(None, 36)
    score_text = score_font.render(str(score/100), True, (255,255,255))
    text_rect = score_text.get_rect()
    text_rect.midtop = [185, 30]
    screen.blit(score_text, text_rect)

    #屏幕更新
    pygame.display.update()
    #繪制按鍵執行代碼
    key_pressed=pygame.key.get_pressed()
    if not mybird.is_hit:
        if key_pressed[K_w] or key_pressed[K_UP]:
            mybird.moveUp()
        if key_pressed[K_s] or key_pressed[K_DOWN]:
            mybird.moveDown()
        
    for event in pygame.event.get():
        if event.type ==pygame.QUIT:
            pygame.quit()
            exit()

第二個文件,gamerole.py 定義兩個類,一個是柱子類,定義柱子的生成規則和移動規則 一個是小鳥類,定義小鳥位置信息,加載圖片信息以及小鳥的飛行控制

# -*- coding: utf-8 -*-
"""
Created on Thu Dec 15 00:27:17 2016

@author: LINJUNJI 
"""
import pygame
import random

SCREEN_WIDTH =384
SCREEN_HEIGHT=448
INTERVEL=120         #兩個障礙之間的間隔
UP_LIMIT=60
DOWN_LIMIT=360

#小鳥類
class Bird(pygame.sprite.Sprite):
    def __init__(self,bird_imgs,init_pos):
        pygame.sprite.Sprite.__init__(self)
        self.image=bird_imgs
        self.rect=self.image[0].get_rect()
        self.rect.midbottom=init_pos
        self.up_speed = 5
        self.down_speed=2
        self.selfdown_speed=2
        self.image_index=0          #圖片索引參數,控制小鳥飛行姿態變化
        self.is_hit=False 
        self.is_downtoground=False
    
    def SelfMoveDown(self):
        self.rect.top += self.selfdown_speed
    
    def SelfDiedDown(self):
        self.up_speed = 0
        self.down_speed=0
        self.rect.bottom +=self.selfdown_speed*2
        if self.rect.bottom >=400:
            self.rect.bottom =400
            self.is_downtoground=True
        
    def moveUp(self):
        if self.rect.top<=0:
            self.rect.top=0
        else:
            self.rect.top -=self.up_speed
            
    def moveDown(self):
        if self.rect.top>=SCREEN_HEIGHT-self.rect.height:
            self.rect.top = SCREEN_HEIGHT-self.rect.height
        else:
            self.rect.top += self.down_speed
    '''        
    def moveLeft(self):
        if self.rect.left <= 0:
            self.rect.left = 0
        else:
            self.rect.left -= self.speed

    def moveRight(self):
        if self.rect.left >= SCREEN_WIDTH - self.rect.width:
            self.rect.left = SCREEN_WIDTH - self.rect.width
        else:
            self.rect.left += self.speed
    '''
#柱子類
class Pilar(pygame.sprite.Sprite):
    def __init__(self,pilar_image_up,pilar_image_down,init_pos):
        pygame.sprite.Sprite.__init__(self)
        self.pilar1_image=pilar_image_up
        self.pilar2_image=pilar_image_down
        self.pilar1_rect=self.pilar1_image.get_rect()
        self.pilar2_rect=self.pilar2_image.get_rect()
        self.pilar1_rect.bottomleft=init_pos
        self.pilar2_rect.topleft=[init_pos[0],init_pos[1]+INTERVEL]
        self.horizontal_speed=2  #柱子平移的速度
        self.vertical_speed=0.3    #柱子上下移動的速度
        self.direction=random.randint(0,1)  #柱子上下移動的方向
        
    def move(self):
        self.pilar1_rect.left -=self.horizontal_speed   #柱子左右移動
        self.pilar2_rect.left -=self.horizontal_speed
        if self.direction == 1:                           #控制柱子上下移動
            self.pilar1_rect.bottom +=self.vertical_speed        
            self.pilar2_rect.top +=self.vertical_speed
            if self.pilar2_rect.top > DOWN_LIMIT:
                self.direction=0
        else:
            self.pilar1_rect.bottom -=self.vertical_speed        
            self.pilar2_rect.top -=self.vertical_speed
            if self.pilar1_rect.bottom < UP_LIMIT:
                self.direction=1
    def stop(self):
        self.horizontal_speed=0
        self.vertical_speed=0

游戲的素材圖片

怎么用python實現flappy bird游戲

“怎么用python實現flappy bird游戲”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宣武区| 益阳市| 德庆县| 关岭| 大庆市| 留坝县| 东乌珠穆沁旗| 永川市| 嘉荫县| 略阳县| 普兰店市| 呼图壁县| 临沭县| 井研县| 宜兴市| 汉寿县| 佛坪县| 宽甸| 温州市| 沅陵县| 碌曲县| 清苑县| 京山县| 民权县| 福清市| 梁山县| 舟山市| 桐城市| 陈巴尔虎旗| 揭东县| 靖安县| 木兰县| 西安市| 德保县| 昌图县| 西藏| 津市市| 晋江市| 镇坪县| 海阳市| 云南省|