如果你喜歡自動化:一起學爬蟲(Python) — 19 年輕人,進來學自動化
如果你想學習爬蟲相關的知識,就關注一下下,點贊一下下,然后到小澤的主頁里,盡情遨游吧~
努力做日更博主!如果沒有日更,那就做兩日更博主,或者三日更,四日更,努力!

Flappy Bird
- 回歸一下吧
- 進來,一夜長大
- 何為鳥
- 進入鳥
- 成人禮
- 目前の全部代碼(無注釋)
回歸一下吧
如果你好好的從01看過來的話,就會發現我已經成功的水了兩篇博客 教了大家兩篇博客,

前面的基本上都沒有什么難度哦,那今天我們就整一點比較難的,當然這里的難是指比較難理解,畢竟只要捅破那一層薄薄的xxx,思路就很明確了,大家就成長了,

敲代碼上的成長,不是身體上的,
俗話說得好,男人最怕的,就是太快了!
所以我們就要慢慢的進入,不能一上來就直接把代碼扔各位臉上,這樣不光是不尊敬各位,而且還沒有什么可閱讀性,對吧,
畢竟道理大家都懂,不會真的有人是看小澤寫的博客在學習吧,不都是在看樂子嗎,不會吧不會吧…

啊,說了這么多,其實就是想讓各位點個贊嘛,生活不易,點贊雖然沒用,但是好看,
就當是各位付的學費吧,點贊點贊點贊,三連三連三連!

進來,一夜長大
上一篇呢,我們寫到了弄出來了一個背景圖,對吧,效果是下面這樣的:

可以看到呢,已經非常完美了,各位可以畢業了,

咳咳,開個玩笑,這樣子肯定是不可以的嘛,為什么呢?
Flappy 鳥,鳥呢?
那么我們今天就來弄鳥!
何為鳥
鳥就是…

又要再次感謝我的“合作伙伴”,
那我們知道這個有什么用呢?
沒有用,

進入鳥
來,進入到我們的鳥類,也就是:
class Bird():
def __init__(self):
pass
我們需要往里面寫什么呢?
回顧一下我們的背景圖片是怎么設定的:
我們在主行程類里寫了一個背景圖片的加載,又在主行程類里的run函式里寫了一個顯示背景,這就是我們對背景圖片的處理,
聽不懂我在說什么的,罰你去操場跑一百圈,跑不完不許啵上司嘴,

那我們也可以在主行程類里進行一個小鳥圖片的顯示吧,因為要在那里展示的嘛,但是具體的功能,還有數值,都寫在小鳥類里叭!
包括圖片的加載哦,
聽不懂沒關系,我們先把小鳥圖片加到小鳥類里:
class Bird():
def __init__(self):
# 加載圖片
self.image = pygame.image.load('./sprites/bluebird-midflap.png')
這樣的話,只要主行程一呼叫小鳥類,就會自動加載圖片吧,但是肯定是只呼叫一次嘛,主行程類里是一個死回圈的,我們要呼叫的話會把小鳥類放到死回圈外面去呼叫,
也就是初始化小鳥類,
不過這都是后話了,先來說小鳥類!
當然也可以說一下啦,就比如:
# 呼叫小鳥類
bird = Bird()
# 拿到小鳥這個圖片的物件
bird_image = bird.image
這樣我們就可以對這個圖片進行顯示,放置等等操作…隨便玩~
那么我們既然已經成功加載了圖片,現在我們需要給圖片進行一個引數的設定吧,
就比如我們上貨的時候也是要填大小,重量,數量等等的嘛~

class Bird():
def __init__(self):
# 加載圖片
self.image = pygame.image.load('./sprites/bluebird-midflap.png')
# 跳躍高度
self.jump = -9
# 重力加速度
self.ft = 1
# 下降的最大速度
self.max_speed = 10
# 當前速度
self.speed = 0
跳躍高度呢,就是我們每一次跳躍會讓y軸加上這個跳躍高度,

這樣我們的小鳥就能實作“向上飛”這個效果,
只要幀率重繪的夠快,就不會看出來是一點一點往上移的,就感覺像是飛起來的一樣,
重力加速度呢,是因為如果我們不進行跳躍,這個小鳥是會一直往下掉的,而且掉的速度是越來越快的,就是因為有這個重力加速度,
所以我們設定一個重力加速度,也就是一個每次下降速度增加多少的量,
這個游戲是只有一個跳躍鍵的哦,不是上下鍵!
下降的最大速度呢,是防止小鳥下降的太快,所以設定了一個閾值,不能超過這個速度,不然一小會不按唰一下就下去了,
當前速度就是小鳥當前的速度(廢話),剛開始設定為0,游戲一開始如果我們不按任何東西,小鳥就會慢慢往下降,

收不到贊,木有更新的動力了,害,
白嫖黨太多了,雖然我曾經也是一名同好吧,但是求求了,各位點個贊吧,本篇點贊過100,立馬更新!
不過分吧,畢竟一千個粉絲,只要十分之一不是白嫖的就好了,嗚嗚嗚T-T

那我們接著寫吧,接下來就需要把這些引數給用上,也就是用上這些引數,
class Bird():
def __init__(self):
# 加載圖片
self.image = pygame.image.load('./sprites/bluebird-midflap.png')
# 跳躍高度
self.jump = -9
# 重力加速度
self.ft = 1
# 下降的最大速度
self.max_speed = 10
# 當前速度
self.speed = 0
def updata(self):
# 如果當前速度小于最大速度,就讓當前速度加上重力加速度
if self.speed < self.max_speed:
self.speed += self.ft
大意了,還要再加兩個引數,
是小鳥的坐標,
x軸是可以固定不變的,只有y軸是變化的,
x軸就是橫著的那一條,小鳥只能上下移動的,

還不點贊???看什么看,快去點贊,點完再回來看,
點完贊了?
快回來繼續學吧~
# 寬度是固定的
self.x = 288 * 0.2
self.y = 512 * 0.5
把這兩個引數呢,放到鳥類的主函式下面,
x和y就是小鳥的坐標啦,288是游戲視窗的寬度,512是游戲視窗的高度,
這里我們用乘以一個小數的方式來放到合適的位置,當然這個是根據個人喜好的,你也可以設定成你覺得ok的位置!

由于寬度是不變的,也就是小鳥是只能上下動的,所以x是不變的吧,那我們只要讓y一直變化,就能實作小鳥的上下摩擦!
class Bird():
def __init__(self):
# 加載圖片
self.image = pygame.image.load('./sprites/bluebird-midflap.png')
# 跳躍高度
self.jump = -9
# 重力加速度
self.ft = 1
# 下降的最大速度
self.max_speed = 10
# 當前速度
self.speed = 0
# 寬度是固定的
self.x = 288 * 0.2
self.y = 512 * 0.5
def updata(self):
# 如果當前速度小于最大速度,就讓當前速度加上重力加速度
if self.speed < self.max_speed:
self.speed += self.ft
# 讓小鳥的y軸坐標加上速度
self.y += self.speed
這樣我們的小鳥系就寫的差不多啦!
剩下的就是到主行程類里,初始化小鳥系,呼叫里面的起飛方法,就可以啦~
def run(self):
# 初始化小鳥系,也就是呼叫小鳥系
bird = Bird()
while True:
# 檢測發生的事件
for event in pygame.event.get():
# 如果事件的型別等等于點擊關閉按鈕,也就是視窗右上角的X
if event.type == pygame.QUIT:
# 中止運行
sys.exit()
# 按下w鍵時,速度等于-9,也就是讓y軸加上了-9,就是往上移了9個像素
if event.type == pygame.KEYDOWN and event.key == pygame.K_w:
bird.speed = bird.jump
# 小鳥移動,因為是一直要移動的,所以放到死回圈里
bird.updata()
# 顯示背景
self.screen.blit(self.background, (0, 0))
# 顯示小鳥,bird.image是小鳥類里的image,也就是self.image
# 因為我們是在小鳥類里加載的小鳥圖片
# bird.x和bird.y是self.x和self.y,也就是我們設定的坐標
self.screen.blit(bird.image, (bird.x,bird.y))
# 重繪視窗
pygame.display.update()
但是這樣寫的話,你會發現打開游戲視窗并看不到小鳥,這是為什么呢?

還是那句話,男人最怕的,就是太快了!
當小鳥下落的頻率比我們能看到的頻率還快的時候,我們就看不到小鳥下落了,
這里為了方便看,我們給小鳥設定一個最低下落的高度,也就是不能比視窗的高度減去小鳥的高度還要低,
視窗的高度減去小鳥的高度就是小鳥在視窗最下面的上面的高度,
沒錯,你聽懂了,

def updata(self):
# 如果當前速度小于最大速度
if self.speed < self.max_speed:
# 當前速度加上重力加速度
self.speed += self.ft
# 如果小鳥的y坐標大于等于 視窗的高度 - 小鳥圖片的高度
if self.y >= 512-self.image.get_height():
# 就讓他們保持相等,也就是不能掉下去
self.y = 512-self.image.get_height()
self.y += self.speed
加上這個之后,我們來試一下吧!

可以看到小鳥是在這里了,而且我們按w是可以往上跳的,但是按得再快也不能讓它起飛,
這是因為螢屏重繪的太快啦,所以男人有的時候太慢也是不好的,
如果你的手速能達到每秒按個幾百下,估計就可以起飛了~

這里呢,就要用到我們的fps啦!
就是設定一下每秒多少幀,不至于我們的手速反應不過來~
class Game():
def __init__(self):
# 初始化
pygame.init()
# 設定頻率
self.fps = pygame.time.Clock()
# 設定長和寬(根據背景圖片來設定)
self.screen = pygame.display.set_mode((288, 512))
# 加載背景圖片,使用self的話,在這個類中可以任意呼叫
self.background = pygame.image.load('./sprites/background-day.png')
可以看到,主行程類里多了一個設定頻率,這樣我們就可以呼叫fps里面的方法了,也就是pygame.time.Clock()里面的方法!
在哪里呼叫呢?
在我們的重繪螢屏的后面呼叫就好啦!
def run(self):
bird = Bird()
while True:
# 檢測發生的事件
for event in pygame.event.get():
# 如果事件的型別等等于點擊關閉按鈕,也就是視窗右上角的X
if event.type == pygame.QUIT:
# 中止運行
sys.exit()
# 向上時,小鳥上移
if event.type == pygame.KEYDOWN and event.key == pygame.K_w:
bird.speed = bird.jump
# 小鳥移動
bird.updata()
# 顯示背景
self.screen.blit(self.background, (0, 0))
# 顯示小鳥
self.screen.blit(bird.image, (bird.x,bird.y))
pygame.display.update()
# 設定最大幀率
self.fps.tick(30)
這樣我們的小鳥就可以被我們玩來玩去啦~
小鳥醬?小鳥醬!
成人禮
如果有哪里沒有搞懂呢,就在留言里或者群里私聊問哦!
那就…因為我也不知道有沒有人看這個系列,所以等01,02,03三篇加起來有200贊,就更新下一期!
不難吧,不要白嫖啦T-T

各位姥爺886~
目前の全部代碼(無注釋)
import sys
import pygame
class Game():
def __init__(self):
# 初始化
pygame.init()
# 設定頻率
self.fps = pygame.time.Clock()
# 設定長和寬(根據背景圖片來設定)
self.screen = pygame.display.set_mode((288, 512))
# 加載背景圖片,使用self的話,在這個類中可以任意呼叫
self.background = pygame.image.load('./sprites/background-day.png')
def run(self):
bird = Bird()
while True:
# 檢測發生的事件
for event in pygame.event.get():
# 如果事件的型別等等于點擊關閉按鈕,也就是視窗右上角的X
if event.type == pygame.QUIT:
# 中止運行
sys.exit()
# 向上時,小鳥上移
if event.type == pygame.KEYDOWN and event.key == pygame.K_w:
bird.speed = bird.jump
# 小鳥移動
bird.updata()
# 顯示背景
self.screen.blit(self.background, (0, 0))
# 顯示小鳥
self.screen.blit(bird.image, (bird.x,bird.y))
pygame.display.update()
self.fps.tick(30)
class Bird():
def __init__(self):
# 加載圖片
self.image = pygame.image.load('./sprites/bluebird-midflap.png')
# 跳躍高度
self.jump = -9
# 重力加速度
self.ft = 1
# 下降的最大速度
self.max_speed = 10
# 當前速度
self.speed = 0
# 寬度是固定的
self.x = 288 * 0.2
self.y = 512 * 0.5
def updata(self):
if self.speed < self.max_speed:
self.speed += self.ft
if self.y >= 512-self.image.get_height():
self.y = 512-self.image.get_height()
self.y += self.speed
if __name__ == '__main__':
game = Game()
game.run()
那就…
200贊見嘍!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/246232.html
標籤:其他
上一篇:Unity使用UGUI劃線
