【編程】零基礎(chǔ)Pygame小游戲開發(fā)-05

歡迎關(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,然后我們使用ratsurhamsur表示真正要使用的表面姻僧,當(dāng)鼠標(biāo)按下的時(shí)候我們?cè)O(shè)定hamsur=ham2是砸下圖片规丽,當(dāng)鼠標(biāo)點(diǎn)擊位置距離地鼠小于地鼠半徑的時(shí)候我們使用ratsur=rat2被砸中的圖片。最后我們?cè)俜謩e把地鼠和錘頭blitsur上面撇贺。

改造后的代碼如下:

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 timetime.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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市葡兑,隨后出現(xiàn)的幾起案子奖蔓,更是在濱河造成了極大的恐慌,老刑警劉巖讹堤,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吆鹤,死亡現(xiàn)場離奇詭異,居然都是意外死亡洲守,警方通過查閱死者的電腦和手機(jī)疑务,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來梗醇,“玉大人知允,你說我怎么就攤上這事⌒鸾鳎” “怎么了温鸽?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長手负。 經(jīng)常有香客問我涤垫,道長,這世上最難降的妖魔是什么虫溜? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任雹姊,我火速辦了婚禮,結(jié)果婚禮上衡楞,老公的妹妹穿的比我還像新娘吱雏。我一直安慰自己,他們只是感情好瘾境,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布歧杏。 她就那樣靜靜地躺著,像睡著了一般迷守。 火紅的嫁衣襯著肌膚如雪犬绒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天兑凿,我揣著相機(jī)與錄音凯力,去河邊找鬼茵瘾。 笑死,一個(gè)胖子當(dāng)著我的面吹牛咐鹤,可吹牛的內(nèi)容都是我干的拗秘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼祈惶,長吁一口氣:“原來是場噩夢啊……” “哼雕旨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捧请,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤凡涩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后疹蛉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體活箕,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年氧吐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了讹蘑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片末盔。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筑舅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陨舱,到底是詐尸還是另有隱情翠拣,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布游盲,位于F島的核電站误墓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏益缎。R本人自食惡果不足惜谜慌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莺奔。 院中可真熱鬧欣范,春花似錦、人聲如沸令哟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽屏富。三九已至晴竞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狠半,已是汗流浹背噩死。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工颤难, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人已维。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓乐严,卻偏偏與公主長得像,于是被迫代替她去往敵國和親衣摩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昂验,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容