歡迎關(guān)注我的專欄( つ??ω??)つ【人工智能通識(shí)】
素材文件,百度網(wǎng)盤下載鏈接 密碼:y1cp
中文字體
在上一節(jié)中我們只使用了英文字體踊赠,怎么顯示中文字體呢?
直接下載網(wǎng)盤里面的文件每庆,放在你的main.py
一起筐带,將原來的
score_font = pygame.font.SysFont('微軟雅黑', 30)
修改為:
score_font = pygame.font.Font('MicrosoftYaqiHeiLight-2.ttf', 30)
然后在render
里面使用中文就可以正常顯示了:
end_sur = score_font.render("你的得分:{}/{}!".format(score,times_max), False, (255, 0, 0))
另外缤灵,也可以使用系統(tǒng)的中文字體伦籍,但是我們不清楚系統(tǒng)里面到底裝了哪些字體蓝晒,可以用
print(pygame.font.get_fonts())
將所有系統(tǒng)字體都打印出來,然后只能從名字猜出哪些是中文字體了鸽斟,注意系統(tǒng)字體還是要用font.SysFont
而不只是font.Font
拔创。
顯示背景圖片
這是我們的背景圖片dds-map.jpg
:
我們可以用map=pygame.image.load('dds-map.jpg')
把圖片讀取到代碼里面利诺。
更多官方關(guān)于圖片的操作說明看這里
注意pygame.image.load()
得到的是一個(gè)表面surface
富蓄,我們可以直接把它blit
到窗口wind
,也可以把它blit
到慢逾。
這里是完整代碼:
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)
posAll = [[100, 150], [300, 150], [500, 150], [
200, 300], [400, 300]] # 六個(gè)位置
rad = 50
tick = 0 # 計(jì)數(shù)器
pos = posAll[0] # 外面記錄圓的位置
# 分?jǐn)?shù)
score = 0 # 分?jǐn)?shù)計(jì)數(shù)
pygame.font.init() # 初始化文字
score_font = pygame.font.Font('MicrosoftYaqiHeiLight-2.ttf', 30) # A⒈丁!設(shè)定字體和字號(hào)
score_sur = score_font.render(str(score), False, (255, 0, 0)) # B绿病口注!生成計(jì)數(shù)表面
# 鼠標(biāo)
pygame.mouse.set_visible(False) # !!隱藏鼠標(biāo)
mpos = [300, 200] # !!記錄鼠標(biāo)位置
times = 0 # 地鼠跳出的次數(shù)
times_max=10 #最多次數(shù)
tick_max=30 #地鼠每次跳多少幀
map=pygame.image.load('dds-map.jpg')#!君珠!讀取圖片
while 1:
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN: # 如果是鼠標(biāo)按下事件
dis = pygame.math.Vector2(
mpos[0]-pos[0], mpos[1]-pos[1]) # 計(jì)算坐標(biāo)差
len = pygame.math.Vector2.length(dis) # 計(jì)算距離
if len < rad:
tick = 1000 # 立即變換位置
score = score+1 # 計(jì)分增加
elif event.type == MOUSEMOTION: # 當(dāng)鼠標(biāo)移動(dòng)的時(shí)候
mpos = pygame.mouse.get_pos() # 更新鼠標(biāo)位置
if times >= times_max:
# 顯示結(jié)束畫面
sur.fill((0, 0, 0)) #G拗尽!結(jié)束時(shí)候仍然用黑色清空畫面
pygame.mouse.set_visible(True)
end_font = pygame.font.Font('MicrosoftYaqiHeiLight-2.ttf',48) # 2咛怼材部!設(shè)定字體和字號(hào)
end_sur = score_font.render("你的分?jǐn)?shù)是:{}/{}!".format(score,times_max), True, (255, 0, 0)) # Nㄖ瘛乐导!生成計(jì)數(shù)表面
window.blit(sur, (0, 0))
window.blit(end_sur, (100, 100)) # 增加分?jǐn)?shù)表面
else:
sur.blit(map, (0, 0)) #!浸颓!添加背景圖片
# 每幀循環(huán)執(zhí)行的代碼
if tick > tick_max: # 每50次刷新變換一次
times=times+1 #增加計(jì)次
score_sur = score_font.render(
"分?jǐn)?shù):{}/{}物臂!".format(score,times), False, (255, 0, 0)) # 重新生成分?jǐn)?shù)文字表面
a = random.randint(0, 4) # 隨機(jī)0到4
pos = posAll[a] # 更新外部記錄的圓的位置
tick = 0 # 重置計(jì)數(shù)器
else: # 不刷新變換的時(shí)候
tick = tick+1 # 增加計(jì)數(shù)器
# 繪制鼠標(biāo)
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)行后如下圖:
使用動(dòng)態(tài)圖片
地鼠和錘子各有兩個(gè)狀態(tài)棵磷,正常的地鼠和被擊打的地鼠,正常的錘子和砸下的錘子晋涣,如下圖所示(下圖無法直接使用泽本,請(qǐng)從網(wǎng)盤下載):
我們可以先把四個(gè)圖片都load
讀取進(jìn)來成為rat1,rat2,ham1,ham2
,然后我們使用ratsur
和hamsur
表示真正要使用的表面姻僧,當(dāng)鼠標(biāo)按下的時(shí)候我們?cè)O(shè)定hamsur=ham2
是砸下圖片规丽,當(dāng)鼠標(biāo)點(diǎn)擊位置距離地鼠小于地鼠半徑的時(shí)候我們使用ratsur=rat2
被砸中的圖片。最后我們?cè)俜謩e把地鼠和錘頭blit
到sur
上面撇贺。
改造后的代碼如下:
import pygame
import sys
import random
from pygame.locals import * # 引入鼠標(biāo)事件類型
import time
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 設(shè)定窗口
sur = pygame.Surface([600, 400]) # 繪制背景容器
clr = (0, 0, 255)
posAll = [[100, 150], [300, 150], [500, 150], [
200, 300], [400, 300]] # 六個(gè)位置
rad = 50
tick = 0 # 計(jì)數(shù)器
pos = posAll[0] # 外面記錄圓的位置
# 分?jǐn)?shù)
score = 0 # 分?jǐn)?shù)計(jì)數(shù)
pygame.font.init() # 初始化文字
score_font = pygame.font.Font('MicrosoftYaqiHeiLight-2.ttf', 30) # 6妮骸!設(shè)定字體和字號(hào)
score_sur = score_font.render(str(score), False, (255, 0, 0)) # K伤弧艘狭!生成計(jì)數(shù)表面
# 鼠標(biāo)
pygame.mouse.set_visible(False) # !!隱藏鼠標(biāo)
mpos = [300, 200] # !!記錄鼠標(biāo)位置
times = 0 # 地鼠跳出的次數(shù)
times_max=10 #最多次數(shù)
tick_max=30 #地鼠每次跳多少幀
map=pygame.image.load('dds-map.jpg')#!!讀取圖片
rat1=pygame.image.load('rat1.png')#3惨簟遵倦!讀取地鼠圖片
rat2=pygame.image.load('rat2.png')#!官撼!讀取被砸地鼠圖片
ham1=pygame.image.load('hammer1.png')#N嗵伞!讀取錘子圖片
ham2=pygame.image.load('hammer2.png')#0列濉掠哥!讀取砸下錘子圖片
while 1:
hamsur=ham1
ratsur=rat1
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN: # 如果是鼠標(biāo)按下事件
hamsur=ham2 #!秃诵!使用下落錘子
mpos = pygame.mouse.get_pos() # 獲取鼠標(biāo)位置
dis = pygame.math.Vector2(
mpos[0]-pos[0], mpos[1]-pos[1]) # 計(jì)算坐標(biāo)差
len = pygame.math.Vector2.length(dis) # 計(jì)算距離
if len < rad:
tick = 1000 # 立即變換位置
score = score+1 # 計(jì)分增加
ratsur=rat2 #P蟆!使用被砸地鼠
elif event.type == MOUSEMOTION: # 當(dāng)鼠標(biāo)移動(dòng)的時(shí)候
mpos = pygame.mouse.get_pos() # 更新鼠標(biāo)位置
if times >= times_max:
# 顯示結(jié)束畫面
sur.fill((0, 0, 0)) #結(jié)束時(shí)候仍然用黑色清空畫面
pygame.mouse.set_visible(True)
end_font = pygame.font.Font('MicrosoftYaqiHeiLight-2.ttf',48) # 2ぞ弧禁舷!設(shè)定字體和字號(hào)
end_sur = score_font.render("你的分?jǐn)?shù)是:{}/{}!".format(score,times_max), True, (255, 0, 0)) # R阃牵咙!生成計(jì)數(shù)表面
window.blit(sur, (0, 0))
window.blit(end_sur, (100, 100)) # 增加分?jǐn)?shù)表面
else:
sur.blit(map, (0, 0)) #添加背景圖片
# 每幀循環(huán)執(zhí)行的代碼
if tick > tick_max: # 每50次刷新變換一次
times=times+1 #增加計(jì)次
score_sur = score_font.render(
"分?jǐn)?shù):{}/{}!".format(score,times), False, (255, 0, 0)) # 重新生成分?jǐn)?shù)文字表面
a = random.randint(0, 4) # 隨機(jī)0到4
pos = posAll[a] # 更新外部記錄的圓的位置
tick = 0 # 重置計(jì)數(shù)器
else: # 不刷新變換的時(shí)候
tick = tick+1 # 增加計(jì)數(shù)器
sur.blit(ratsur,(pos[0]-50,pos[1]-70)) #繪制地鼠
sur.blit(hamsur,(mpos[0]-50,mpos[1]-100)) #繪制錘頭
# 刷新畫面
window.blit(sur, (0, 0))
window.blit(score_sur, (200, 10)) # 增加分?jǐn)?shù)表面
pygame.display.flip() #刷新畫面
time.sleep(0.04) #I诽А霜大!保持畫面一點(diǎn)時(shí)間
注意這里的import time
和time.sleep(0.04)
這是讓每一幀停留一點(diǎn)點(diǎn)時(shí)間,0.04秒革答,每秒25幀(假設(shè)每幀畫圖不需要時(shí)間的話)战坤。
另外我們?cè)?code>blit的時(shí)候使用了(pos[0]-50,pos[1]-50)
這樣的偏移,因?yàn)閳D片總是用左上角作為位置的起點(diǎn)残拐,這樣偏移之后就變到了圖片中心途茫,實(shí)際上我們又故意讓地鼠和錘子更高一些,就使用了(pos[0]-50,pos[1]-70)
溪食。
運(yùn)行之后的樣子如下圖:
讓游戲重新開始
每次顯示最終成績之后囊卜,能不能讓游戲3秒后重新開始呢?
我們?cè)O(shè)定一個(gè)gameover=0
错沃,游戲結(jié)束后每幀都增加這個(gè)數(shù)字栅组,如果gameover>100
,就是過了100幀枢析,那么我們就重新開始玉掸。
重新開始必須意味著各種數(shù)據(jù)(分?jǐn)?shù),計(jì)時(shí)什么的)和畫面都要重置到原來的狀態(tài)醒叁。
修改后的整體代碼如下:
import pygame
import sys
import random
from pygame.locals import * # 引入鼠標(biāo)事件類型
import time
pygame.init() # 初始化
window = pygame.display.set_mode([600, 400]) # 設(shè)定窗口
sur = pygame.Surface([600, 400]) # 繪制背景容器
clr = (0, 0, 255)
posAll = [[100, 150], [300, 150], [500, 150], [200, 300], [400, 300]] # 六個(gè)位置
rad = 50
tick = 0 # 計(jì)數(shù)器
pos = posAll[0] # 外面記錄圓的位置
# 分?jǐn)?shù)
score = 0 # 分?jǐn)?shù)計(jì)數(shù)
pygame.font.init() # 初始化文字
score_font = pygame.font.Font("MicrosoftYaqiHeiLight-2.ttf", 30) # K纠恕泊业!設(shè)定字體和字號(hào)
score_sur = score_font.render(str(score), False, (255, 0, 0)) # !啊易!生成計(jì)數(shù)表面
# 鼠標(biāo)
pygame.mouse.set_visible(False) # !!隱藏鼠標(biāo)
mpos = [300, 200] # !!記錄鼠標(biāo)位置
times = 0 # 地鼠跳出的次數(shù)
times_max = 10 # 最多次數(shù)
tick_max = 30 # 地鼠每次跳多少幀
map = pygame.image.load("dds-map.jpg") # S跛拧!讀取圖片
rat1 = pygame.image.load("rat1.png") # W馓浮篮奄!讀取地鼠圖片
rat2 = pygame.image.load("rat2.png") # !垦垂!讀取被砸地鼠圖片
ham1 = pygame.image.load("hammer1.png") # ;掳帷牙瓢!讀取錘子圖片
ham2 = pygame.image.load("hammer2.png") # =俎帧!讀取砸下錘子圖片
gameover = 0 #7恕页慷!結(jié)束計(jì)時(shí)
gameover_max = 100 #!胁附!結(jié)束計(jì)時(shí)最大值酒繁,超過這個(gè)值就重新開始
while 1:
hamsur = ham1
ratsur = rat1
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == MOUSEBUTTONDOWN: # 如果是鼠標(biāo)按下事件
hamsur = ham2 # !控妻!使用下落錘子
mpos = pygame.mouse.get_pos() # 獲取鼠標(biāo)位置
dis = pygame.math.Vector2(mpos[0] - pos[0], mpos[1] - pos[1]) # 計(jì)算坐標(biāo)差
len = pygame.math.Vector2.length(dis) # 計(jì)算距離
if len < rad:
tick = 1000 # 立即變換位置
score = score + 1 # 計(jì)分增加
ratsur = rat2 # V萏弧!使用被砸地鼠
elif event.type == MOUSEMOTION: # 當(dāng)鼠標(biāo)移動(dòng)的時(shí)候
mpos = pygame.mouse.get_pos() # 更新鼠標(biāo)位置
if times >= times_max:
# 顯示結(jié)束畫面
sur.fill((0, 0, 0)) # 結(jié)束時(shí)候仍然用黑色清空畫面
pygame.mouse.set_visible(True)
end_font = pygame.font.Font("MicrosoftYaqiHeiLight-2.ttf", 48) # 9颉郎哭!設(shè)定字體和字號(hào)
end_sur = score_font.render(
"你的分?jǐn)?shù)是:{}/{}!".format(score, times_max), True, (255, 0, 0)
) # 9酱妗夸研!生成計(jì)數(shù)表面
sur.blit(end_sur, (100, 150))
cd = int((gameover_max - gameover) / 10)
cd_sur = score_font.render(
"重新開始倒計(jì)時(shí){}".format(cd), True, (255, 0, 0)
) # !依鸥!生成計(jì)數(shù)表面
sur.blit(cd_sur, (100, 200)) # 增加分?jǐn)?shù)表面
gameover = gameover + 1 #:ブ痢!增加結(jié)束計(jì)時(shí)
else:
sur.blit(map, (0, 0)) # 添加背景圖片
score_sur = score_font.render(
"分?jǐn)?shù):{}/{}贱迟!".format(score, times + 1), False, (255, 0, 0)
) # 重新生成分?jǐn)?shù)文字表面
sur.blit(score_sur, (200, 10)) # 增加分?jǐn)?shù)表面
if tick > tick_max: # 每50次刷新變換一次
times = times + 1 # 增加計(jì)次
a = random.randint(0, 4) # 隨機(jī)0到4
pos = posAll[a] # 更新外部記錄的圓的位置
tick = 0 # 重置計(jì)數(shù)器
else: # 不刷新變換的時(shí)候
tick = tick + 1 # 增加計(jì)數(shù)器
if tick > 5: # 開始幾幀不顯示地鼠
sur.blit(ratsur, (pos[0] - 50, pos[1] - 70)) # 繪制地鼠
sur.blit(hamsur, (mpos[0] - 50, mpos[1] - 100)) # 繪制錘頭
# 刷新畫面
window.blit(sur, (0, 0))
pygame.display.flip() # 刷新畫面
time.sleep(0.04) # =惆纭!保持畫面一點(diǎn)時(shí)間
# R路汀茶敏!重置游戲
if gameover > gameover_max:
pygame.mouse.set_visible(False)
times = 0
score = 0
gameover = 0
運(yùn)行這個(gè)代碼就能反復(fù)玩游戲了。
到這里游戲看上去好了很多蒸播,但是還沒有背景音樂睡榆,打地鼠的時(shí)候也沒有音效萍肆,下一節(jié)我們繼續(xù)添加聲音。
【編程】零基礎(chǔ)Pygame小游戲開發(fā)(索引)
<未完待續(xù)>
歡迎關(guān)注我的專欄( つ??ω??)つ【人工智能通識(shí)】
每個(gè)人的智能新時(shí)代
如果您發(fā)現(xiàn)文章錯(cuò)誤胀屿,請(qǐng)不吝留言指正塘揣;
如果您覺得有用,請(qǐng)點(diǎn)喜歡宿崭;
如果您覺得很有用亲铡,歡迎轉(zhuǎn)載~
END