Python 恐龍跑跑小游戲?qū)崿F(xiàn)流程
導(dǎo)語:
谷歌瀏覽器中有個(gè)很有名的彩蛋:當(dāng)你網(wǎng)絡(luò)出現(xiàn)問題時(shí),就會(huì)出現(xiàn)一個(gè)“小恐龍游戲”。??

相信很多人都玩過 chrome 上提供的恐龍跑跑游戲,在我們斷網(wǎng)或者直接在瀏覽器輸入地址“chrome://dino/”都可以進(jìn)入游戲。

今天我們就來給大家演示下,用Python來自己做一個(gè)仿制的“小恐龍游戲”!??
廢話不多說,讓我們愉快地開始吧~先給你們看一下運(yùn)你效果??????

正文:
開發(fā)工具:
Python版本:3.6.4
相關(guān)模塊:
pygame模塊;以及一些python自帶的模塊。
環(huán)境搭建
安裝Python并添加到環(huán)境變量,pip安裝需要的相關(guān)模塊即可。
在終端運(yùn)行如下命令即可:
python Game7.py
素材準(zhǔn)備
首先我們準(zhǔn)備下游戲所需的素材,比如恐龍圖片,仙人掌圖片,天空,地面等等,我們統(tǒng)一放到 dino 文件夾下

游戲邏輯
我們使用 Pygame 來制作游戲,先進(jìn)行游戲頁面的初始化
import pygame
# 初始化
pygame.init()
pygame.mixer.init()
# 設(shè)置窗口大小
screen = pygame.display.set_mode((900, 200))
# 設(shè)置標(biāo)題
pygame.display.set_caption("恐龍?zhí)?)
# 使用系統(tǒng)自帶的字體
my_font = pygame.font.SysFont("arial", 20)
score = 0
# 背景色
bg_color = (218,220,225)
接下來,我們來考慮一下,游戲中有哪些游戲元素:
小恐龍:由玩家控制以躲避路上的障礙物;
路面:游戲的背景;
云:游戲的背景;
仙人掌:路上的障礙物之一,小恐龍碰上就會(huì)死掉;
記分板:記錄當(dāng)前的分?jǐn)?shù)和歷史最高分。
接下來我們將各種素材加載進(jìn)內(nèi)存



# 加載正??铸?
dino_list = []
temp = ""
for i in range(1, 7):
temp = pygame.image.load(f"dino/dino_run{i}.png")
dino_list.append(temp)
dino_rect = temp.get_rect()
index = 0
# x 初始值
dino_rect.x = 100
# y 初始值
dino_rect.y = 150
# print(dino_rect)
# 設(shè)置y軸上的初速度為0
y_speed = 0
# 起跳初速度
jumpSpeed = -20
# 模擬重力
gravity = 2
加載地面
ground = pygame.image.load("dino/ground.png")
# 加載仙人掌
cactus = pygame.image.load("dino/cactus1.png")
cactus_rect = cactus.get_rect()
cactus_rect.x,cactus_rect.y = 900,140
# 加載重新再來
restart = pygame.image.load("dino/restart.png")
restart_rect = restart.get_rect()
restart_rect.x,restart_rect.y = (900-restart.get_rect().width)/2,(200-restart.get_rect().height)/2+50
# 加載 gameover
gameover = pygame.image.load("dino/gameover.png")
gameover_rect = gameover.get_rect()
gameover_rect.x, gameover_rect.y = (
900-gameover.get_rect().width)/2, (200-gameover.get_rect().height)/2
# 地面移動(dòng)速度與距離
ground_speed = 10
ground_move_distance = 0
# 時(shí)鐘
clock = pygame.time.Clock()
# 重新再來一次
is_restart = False
text_color = (0,0,0)
再接下來,我們通過一個(gè) while 死循環(huán)來保持游戲進(jìn)程
while True:
# 每秒30次
clock.tick(30)
...
在上面的循環(huán)當(dāng)中,我們需要兩個(gè)檢測(cè)機(jī)制,事件檢測(cè)和碰撞檢測(cè)
事件檢測(cè)
# 事件偵測(cè)
for event in pygame.event.get():
if event.type == pygame.QUIT:
if result_flag:
with open("result.ini", "w+") as f:
f.write(str(best))
sys.exit()
# 空格鍵偵測(cè)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE and dino_rect.y==150:
y_speed = jumpSpeed
主要檢測(cè)退出事件和空格鍵事件
碰撞檢測(cè)
# 碰撞檢測(cè)
if dino_rect.colliderect(cactus_rect):
while not is_restart:
# 事件偵測(cè)
for event in pygame.event.get():
if event.type == pygame.QUIT:
if result_flag:
with open("result.ini", "w+") as f:
f.write(str(best))
sys.exit()
# 空格鍵偵測(cè)
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
is_restart = True
bg_color = (218,220,225)
ground_speed = 10
# 設(shè)置重新再來圖片
screen.blit(restart, restart_rect)
screen.blit(gameover, gameover_rect)
pygame.display.update()
對(duì)于碰撞,只要恐龍碰撞到了仙人掌,那么游戲結(jié)束,展示重新再來圖片
由于我們希望游戲可以記錄我們的最好成績(jī),所以這里使用了本地文件存儲(chǔ)游戲記錄的方式,當(dāng)游戲結(jié)束的時(shí)候,根據(jù)當(dāng)前游戲成績(jī)來判斷是否將新的成績(jī)寫入文件當(dāng)中
下面是計(jì)算跑動(dòng)距離和最好成績(jī)的代碼
# 統(tǒng)計(jì)距離
score += ground_speed
score_surface = my_font.render("Distance: "+str(score), True, text_color)
# 計(jì)算最好成績(jī)
result_flag = False
if score >= best:
best = score
result_flag = True
best_result = my_font.render("Best Result: " + str(best), True, text_color)
我們還需要給不同距離增加不同的游戲難度,畢竟跑起來,肯定距離越遠(yuǎn),難度越大嘛
# 更換背景色,成績(jī)大于4000
if score > 4000:
bg_color = (55,55,55)
ground_speed = 15
text_color = (255,255, 255)
# 更換背景色,成績(jī)大于8000
if score > 8000:
bg_color = (220,20,60)
ground_speed = 20
text_color = (255, 255, 255)
# 更換背景色,成績(jī)大于12000
if score > 12000:
bg_color = (25,25,112)
ground_speed = 25
text_color = (255, 255, 255)
# 設(shè)置背景色
screen.fill(bg_color)
最后我們將所有加載到內(nèi)存當(dāng)中的元素都呈現(xiàn)在 screen 上
# 設(shè)置地面圖片1
screen.blit(ground, (0-ground_move_distance, 180))
# 設(shè)置地面圖片2,在右邊邊界外
screen.blit(ground, (900-ground_move_distance, 180))
# 設(shè)置恐龍圖片
screen.blit(dino_list[index % 6], dino_rect)
# 設(shè)置仙人掌圖片
screen.blit(cactus, cactus_rect)
# 設(shè)置分?jǐn)?shù)
screen.blit(score_surface,(780,20))
# 設(shè)置最好成績(jī)
screen.blit(best_result, (20, 20))
pygame.display.update()
為了增加游戲性,我們?cè)僭黾颖尘耙魳泛吞S音效
pygame.mixer.music.load("background.mp3")
pygame.mixer.music.play(-1, 0)
sound = pygame.mixer.Sound('preview.mp3')
結(jié)尾:
這樣,一個(gè)簡(jiǎn)單易用的恐龍跑跑游戲就完成了,今天的分享就到這里,喜歡就點(diǎn)個(gè)贊吧!
到此這篇關(guān)于Python 恐龍跑跑小游戲?qū)崿F(xiàn)流程的文章就介紹到這了,更多相關(guān)Python 恐龍跑跑內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python爬蟲利用cookie實(shí)現(xiàn)模擬登陸實(shí)例詳解
這篇文章主要介紹了Python爬蟲利用cookie實(shí)現(xiàn)模擬登陸實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-01-01
Python3按一定數(shù)據(jù)位數(shù)格式處理bin文件的方法
今天小編就為大家分享一篇Python3按一定數(shù)據(jù)位數(shù)格式處理bin文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01
Pytorch實(shí)現(xiàn)Fashion-mnist分類任務(wù)全過程
這篇文章主要介紹了Pytorch實(shí)現(xiàn)Fashion-mnist分類任務(wù)全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12
Python實(shí)現(xiàn)監(jiān)控遠(yuǎn)程主機(jī)實(shí)時(shí)數(shù)據(jù)的示例詳解
這篇文章主要為大家詳細(xì)介紹了Python如何使用Socket庫和相應(yīng)的第三方庫來監(jiān)控遠(yuǎn)程主機(jī)的實(shí)時(shí)數(shù)據(jù),比如CPU使用率、內(nèi)存使用率、網(wǎng)絡(luò)帶寬等,感興趣的可以了解一下2023-04-04
Flask運(yùn)用Xterm實(shí)現(xiàn)交互終端的示例詳解
Xterm是一個(gè)基于X Window System的終端仿真器(Terminal Emulator),Xterm最初由MIT開發(fā),它允許用戶在X Window環(huán)境下運(yùn)行文本終端程序,本文給大家介紹了Flask運(yùn)用Xterm實(shí)現(xiàn)交互終端的示例詳解,文中有詳細(xì)的代碼講解,需要的朋友可以參考下2023-11-11
幫你快速上手Jenkins并實(shí)現(xiàn)自動(dòng)化部署
在未學(xué)習(xí)Jenkins之前,只是對(duì)Jenkins有一個(gè)比較模糊的理解,即Jenkins是一個(gè)自動(dòng)化構(gòu)建項(xiàng)目發(fā)布的工具,可以實(shí)現(xiàn)代碼->github或者gitlab庫->jenkins自動(dòng)部署->訪問的整體的過程,而無需人為重新打包,今天就帶大家詳細(xì)了解一下,幫你快速上手Jenkins,需要的朋友可以參考下2021-06-06
Python并發(fā)編程之進(jìn)程間通信原理及實(shí)現(xiàn)解析
這篇文章主要為大家介紹了Python并發(fā)編程之進(jìn)程間通信原理及實(shí)現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01

