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

歡迎關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市域携,隨后出現(xiàn)的幾起案子簇秒,更是在濱河造成了極大的恐慌,老刑警劉巖秀鞭,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趋观,死亡現(xiàn)場離奇詭異,居然都是意外死亡气筋,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進(jìn)店門旋圆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宠默,“玉大人,你說我怎么就攤上這事灵巧〔蠼茫” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵刻肄,是天一觀的道長瓤球。 經(jīng)常有香客問我,道長敏弃,這世上最難降的妖魔是什么卦羡? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上绿饵,老公的妹妹穿的比我還像新娘欠肾。我一直安慰自己,他們只是感情好拟赊,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布刺桃。 她就那樣靜靜地躺著,像睡著了一般吸祟。 火紅的嫁衣襯著肌膚如雪瑟慈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天屋匕,我揣著相機(jī)與錄音葛碧,去河邊找鬼。 笑死炒瘟,一個胖子當(dāng)著我的面吹牛吹埠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播疮装,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼缘琅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了廓推?” 一聲冷哼從身側(cè)響起刷袍,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎樊展,沒想到半個月后呻纹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡专缠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年雷酪,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片涝婉。...
    茶點(diǎn)故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡哥力,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墩弯,到底是詐尸還是另有隱情吩跋,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布渔工,位于F島的核電站锌钮,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏引矩。R本人自食惡果不足惜梁丘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一侵浸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兰吟,春花似錦通惫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至惭嚣,卻和暖如春遵湖,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背晚吞。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工延旧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人槽地。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓迁沫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捌蚊。 傳聞我的和親對象是個殘疾皇子集畅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評論 2 349

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