歡迎關(guān)注我的專欄( つ??ω??)つ【人工智能通識】
記錄分?jǐn)?shù)
上一篇文章【編程】零基礎(chǔ)Pygame小游戲開發(fā)-03中我們開發(fā)的打地鼠游戲還沒有實(shí)現(xiàn)計分機(jī)制,我們來繼續(xù)欣鳖。
計算數(shù)字增加很容易延届,設(shè)定一個score=0
式矫,然后擊中地鼠的時候增加1就可以了。但是弱匪,如何把它顯示到屏幕上呢柠逞?
可以百度搜索【pygame 顯示文字】然后就可以找到大致方法昧狮,我們先進(jìn)行一些測試:
import pygame
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 設(shè)定窗口
# 顯示文字
pygame.font.init() # !板壮!初始化文字
font = pygame.font.SysFont('微軟雅黑', 30) # 6好!設(shè)定字體和字號
sur = font.render("Hello World!!{}".format(999), False, (255, 0, 0)) # 4戮慕购!生成w文字表面
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
window.blit(sur, (200, 10)) # !茬底!增加分?jǐn)?shù)表面
pygame.display.flip()
這段代碼中可以看到pygame繪制文字分三步:
-
pygame.font.init()
先要初始化 -
pygame.font.SysFont('微軟雅黑', 30)
設(shè)定字體和字號大小 -
font.render("Hello World!!{}".format(999), False, (255, 0, 0))
生成一個Surface表面
當(dāng)然,最后別忘了把表面放到窗口里window.blit(sur, (200, 10))
運(yùn)行上面的代碼得到一個窗口如下:
我們根據(jù)這個經(jīng)驗(yàn)改進(jìn)上一篇的代碼:
import pygame
import sys
import random
from pygame.locals import * # 引入鼠標(biāo)事件類型
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 設(shè)定窗口
sur = pygame.Surface([600, 400]) # 繪制背景容器
clr = (0, 0, 255)
pos6 = [[200, 200], [300, 200], [400, 200], [
200, 300], [300, 300], [400, 300]] # 六個位置
rad = 50
tick = 0 # 計數(shù)器
pos = pos6[0] # 外面記錄圓的位置
# 分?jǐn)?shù)
score = 0 # ;裰蕖阱表!分?jǐn)?shù)計數(shù)
pygame.font.init() # !贡珊!初始化文字
score_font = pygame.font.SysFont('微軟雅黑', 30) # W钆馈!設(shè)定字體和字號
score_sur = score_font.render(str(score), False, (255, 0, 0)) # C挪怼爱致!生成計數(shù)表面
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN: # 如果是鼠標(biāo)按下事件
mpos = pygame.mouse.get_pos() # 獲取鼠標(biāo)位置
dis = pygame.math.Vector2(
mpos[0]-pos[0], mpos[1]-pos[1]) # 計算坐標(biāo)差
len = pygame.math.Vector2.length(dis) # 計算距離
if len < rad:
tick = 1000 # 立即變換位置
score = score+1 # 計分增加
# 每幀循環(huán)執(zhí)行的代碼
if tick > 50: # 每50次刷新變換一次
score_sur = score_font.render(
str(score), False, (255, 0, 0)) # !寒随!重新生成分?jǐn)?shù)文字表面
sur.fill((0, 0, 0)) # 用黑色覆蓋前一幀的畫面糠悯,實(shí)現(xiàn)刷新
a = random.randint(0, 5) # 隨機(jī)0到5
pos = pos6[a] # 更新外部記錄的圓的位置
pygame.draw.circle(sur, clr, pos, 50) # 使用隨機(jī)位置
tick = 0 # 重置計數(shù)器
else: # 不刷新變換的時候
tick = tick+1 # 增加計數(shù)器
# 刷新畫面
window.blit(sur, (0, 0))
window.blit(score_sur, (200, 10)) # !妻往!增加分?jǐn)?shù)表面
pygame.display.flip()
運(yùn)行上面的代碼互艾,可以用鼠標(biāo)點(diǎn)擊跳動的藍(lán)色圓,每次擊中就能獲得1分讯泣,實(shí)時顯示在頂部纫普。
關(guān)于文字的更多內(nèi)容可以參考官方文檔說明。
鼠標(biāo)指針變錘子
現(xiàn)在窗口中顯示的仍然是鼠標(biāo)好渠,而不是錘子昨稼,下面我們來看如何把鼠標(biāo)變?yōu)橐粋€特定的圖形节视。
pygame關(guān)于鼠標(biāo)控制的模塊是pygame.mouse
,官方說明文檔看這里假栓。
我們可以用pygame.mouse.set_visible(False)
來隱藏鼠標(biāo)寻行,但這樣一來我們就看不到鼠標(biāo)無法操作了。
不過不要緊但指,我們之前還記得當(dāng)鼠標(biāo)點(diǎn)擊的時候有一個mpos = pygame.mouse.get_pos()
可以獲取當(dāng)前鼠標(biāo)的位置寡痰,同樣我們可以在鼠標(biāo)移動的時候獲取鼠標(biāo)的位置,然后在這個位置上畫一個紅色圓圈代表鼠標(biāo)棋凳。
測試下面的代碼:
import pygame
from pygame.locals import *
pygame.init()
window = pygame.display.set_mode([600, 400])
pygame.mouse.set_visible(False) # 隱藏鼠標(biāo)
sur = pygame.Surface([600, 400])
mpos = [300, 200] # 記錄鼠標(biāo)位置
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEMOTION: # 當(dāng)鼠標(biāo)移動的時候
mpos = pygame.mouse.get_pos() # 更新鼠標(biāo)位置
sur.fill((0, 0, 0)) # 填充黑色
pygame.draw.circle(sur, (255, 0, 0), mpos, 10) # 在鼠標(biāo)位置畫紅色圓
window.blit(sur, (0, 0))
pygame.display.flip()
運(yùn)行這個代碼將拦坠,當(dāng)鼠標(biāo)劃到窗口上面的時候就會有一個紅點(diǎn)跟著鼠標(biāo)移動,紅點(diǎn)代替了原來的指針剩岳。
我們把這個紅點(diǎn)鼠標(biāo)代碼放入到游戲中贞滨,得到下面的代碼:
import pygame
import sys
import random
from pygame.locals import * # 引入鼠標(biāo)事件類型
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 設(shè)定窗口
sur = pygame.Surface([600, 400]) # 繪制背景容器
clr = (0, 0, 255)
pos6 = [[200, 200], [300, 200], [400, 200], [
200, 300], [300, 300], [400, 300]] # 六個位置
rad = 50
tick = 0 # 計數(shù)器
pos = pos6[0] # 外面記錄圓的位置
# 分?jǐn)?shù)
score = 0 # 分?jǐn)?shù)計數(shù)
pygame.font.init() # 初始化文字
score_font = pygame.font.SysFont('微軟雅黑', 30) # !拍棕!設(shè)定字體和字號
score_sur = score_font.render(str(score), False, (255, 0, 0)) # O!生成計數(shù)表面
# 鼠標(biāo)
pygame.mouse.set_visible(False) # !!隱藏鼠標(biāo)
mpos = [300, 200] # !!記錄鼠標(biāo)位置
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN: # 如果是鼠標(biāo)按下事件
mpos = pygame.mouse.get_pos() # 獲取鼠標(biāo)位置
dis = pygame.math.Vector2(
mpos[0]-pos[0], mpos[1]-pos[1]) # 計算坐標(biāo)差
len = pygame.math.Vector2.length(dis) # 計算距離
if len < rad:
tick = 1000 # 立即變換位置
score = score+1 # 計分增加
elif event.type == MOUSEMOTION: # !!當(dāng)鼠標(biāo)移動的時候
mpos = pygame.mouse.get_pos() # !!更新鼠標(biāo)位置
# 每幀循環(huán)執(zhí)行的代碼
if tick > 50: # 每50次刷新變換一次
score_sur = score_font.render(
str(score), False, (255, 0, 0)) # 重新生成分?jǐn)?shù)文字表面
a = random.randint(0, 5) # 隨機(jī)0到5
pos = pos6[a] # 更新外部記錄的圓的位置
tick = 0 # 重置計數(shù)器
else: # 不刷新變換的時候
tick = tick+1 # 增加計數(shù)器
# 繪制鼠標(biāo)
sur.fill((0, 0, 0)) # !用黑色覆蓋前一幀的畫面绰播,實(shí)現(xiàn)刷新
pygame.draw.circle(sur, clr, pos, 50) # !使用隨機(jī)位置畫地鼠
pygame.draw.circle(sur, (255, 0, 0), mpos, 10) # !!在鼠標(biāo)位置畫紅色圓
# 刷新畫面
window.blit(sur, (0, 0))
window.blit(score_sur, (200, 10)) # 增加分?jǐn)?shù)表面
pygame.display.flip()
主義者了把sur.fill
和原來畫地鼠藍(lán)圓的代碼移到了下面骄噪,和畫鼠標(biāo)紅點(diǎn)的代碼放在了一起,這樣把繪圖內(nèi)容放在一起更加合理蠢箩。
限定每局時間
我們有很多辦法限定每局的長度链蕊,比如計時限定1分鐘,或者限定地鼠跳出總計100次谬泌。我們這里使用第二種限制滔韵,跳出100次就結(jié)束并統(tǒng)計分?jǐn)?shù)。
添加一個計數(shù)器times=0
掌实,然后每次隨機(jī)位置都給它增加1陪蜻,當(dāng)times>100
的時候,我們就結(jié)束游戲并顯示結(jié)束畫面統(tǒng)計戰(zhàn)果贱鼻。
具體的代碼沒有新的內(nèi)容宴卖,不多解釋,直接上結(jié)果:
import pygame
import sys
import random
from pygame.locals import * # 引入鼠標(biāo)事件類型
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 設(shè)定窗口
sur = pygame.Surface([600, 400]) # 繪制背景容器
clr = (0, 0, 255)
pos6 = [[200, 200], [300, 200], [400, 200], [
200, 300], [300, 300], [400, 300]] # 六個位置
rad = 50
tick = 0 # 計數(shù)器
pos = pos6[0] # 外面記錄圓的位置
# 分?jǐn)?shù)
score = 0 # 分?jǐn)?shù)計數(shù)
pygame.font.init() # 初始化文字
score_font = pygame.font.SysFont('微軟雅黑', 30) # A谛嘱腥!設(shè)定字體和字號
score_sur = score_font.render(str(score), False, (255, 0, 0)) # !拘悦!生成計數(shù)表面
# 鼠標(biāo)
pygame.mouse.set_visible(False) # !!隱藏鼠標(biāo)
mpos = [300, 200] # !!記錄鼠標(biāo)位置
times = 0 # 地鼠跳出的次數(shù)
times_max=10 #最多次數(shù)
tick_max=15 #地鼠每次跳多少幀
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN: # 如果是鼠標(biāo)按下事件
mpos = pygame.mouse.get_pos() # 獲取鼠標(biāo)位置
dis = pygame.math.Vector2(
mpos[0]-pos[0], mpos[1]-pos[1]) # 計算坐標(biāo)差
len = pygame.math.Vector2.length(dis) # 計算距離
if len < rad:
tick = 1000 # 立即變換位置
score = score+1 # 計分增加
elif event.type == MOUSEMOTION: # !!當(dāng)鼠標(biāo)移動的時候
mpos = pygame.mouse.get_pos() # !!更新鼠標(biāo)位置
if times > times_max:
# 顯示結(jié)束畫面
sur.fill((0, 0, 0))
pygame.mouse.set_visible(True)
sur.fill((0, 0, 0))
end_font = pygame.font.SysFont('微軟雅黑', 80) # 3萃谩!設(shè)定字體和字號
end_sur = score_font.render("Your Score is:{}/{}!".format(score,times_max), False, (255, 0, 0)) # 7治添诉!生成計數(shù)表面
window.blit(sur, (0, 0))
window.blit(end_sur, (100, 100)) # 增加分?jǐn)?shù)表面
pygame.display.flip()
else:
# 每幀循環(huán)執(zhí)行的代碼
if tick > tick_max: # 每50次刷新變換一次
times=times+1 #增加計次
score_sur = score_font.render(
str(score), False, (255, 0, 0)) # 重新生成分?jǐn)?shù)文字表面
a = random.randint(0, 5) # 隨機(jī)0到5
pos = pos6[a] # 更新外部記錄的圓的位置
tick = 0 # 重置計數(shù)器
else: # 不刷新變換的時候
tick = tick+1 # 增加計數(shù)器
# 繪制鼠標(biāo)
sur.fill((0, 0, 0)) # !用黑色覆蓋前一幀的畫面,實(shí)現(xiàn)刷新
pygame.draw.circle(sur, clr, pos, 50) # !使用隨機(jī)位置畫地鼠
pygame.draw.circle(sur, (255, 0, 0), mpos, 10) # !!在鼠標(biāo)位置畫紅色圓
# 刷新畫面
window.blit(sur, (0, 0))
window.blit(score_sur, (200, 10)) # 增加分?jǐn)?shù)表面
pygame.display.flip()
運(yùn)行這個代碼医寿,用鼠標(biāo)點(diǎn)擊藍(lán)圓栏赴,藍(lán)圓跳動10次之后結(jié)束,然后顯示擊中的次數(shù)靖秩。你可以通過調(diào)整tick_max
的數(shù)字讓圓跳動的更快或更慢须眷,調(diào)整times_max=100
來讓地鼠跳動100次后再結(jié)束。
現(xiàn)在我們的地鼠游戲已經(jīng)有些模樣了沟突,但還都是藍(lán)色紅色的圓圈和圓點(diǎn)花颗,下一篇我們來改變成為圖片。
【編程】零基礎(chǔ)Pygame小游戲開發(fā)(索引)
<未完待續(xù)>
歡迎關(guān)注我的專欄( つ??ω??)つ【人工智能通識】
每個人的智能新時代
如果您發(fā)現(xiàn)文章錯誤惠拭,請不吝留言指正扩劝;
如果您覺得有用,請點(diǎn)喜歡职辅;
如果您覺得很有用棒呛,歡迎轉(zhuǎn)載~
END