Python|送給朋友的生日祝福

1前言

在上一週的文章中,小編給大家帶來了一個表白神奇,不知道大家有沒有過一個愉快的520。生活中除了給男神女神表白,還會遇到朋友過生日,所以小編今天就給大家帶來了一個送給朋友的生日祝福程式。

2準備

本次程式還是用python編寫,第三方庫用到了pygame。安裝方式在命令列執行以下程式碼即可。

pip install pygame

3主要步驟

首先是匯入所需模組以及初始化pygame:

#匯入模組

import random

import pygame

pygame。mixer。init()

from pygame。locals import *

pygame。init()

其中的pygame。mixer。init()為pygame播放器的初始化,因為小編為這個程式還添加了音樂。

在編寫程式之前,先縷一縷要達到的目的。首先是要有兩個介面,第一個介面模擬微信影片通話介面,第二個介面為主要介面,即生日祝福介面。然後再將所需的資原始檔放在與程式碼檔案同目錄下的

resource資料夾

中。

載入資原始檔

fps = 30

fpsClock =

pygame。time

。Clock()

icon = pygame。image。load(rp(‘resource/h-2。JPG’))

bali = pygame。image。load(rp(‘resource/baligonglu。png’))

cake = pygame。image。load(rp(‘resource/cake。png’))

fire1 = pygame。image。load(rp(‘resource/firework1。png’))

fire2 = pygame。image。load(rp(‘resource/firework2。png’))

fire3 = pygame。image。load(rp(‘resource/firework3。png’))

fire4 = pygame。image。load(rp(‘resource/firework4。png’))

font = pygame。font。Font(rp(‘resource/

繁星糖果

。ttf’),50)

font1 = pygame。font。Font(rp(‘resource/繁星糖果。ttf’),30)

boom_sound = pygame。mixer。Sound(rp(‘resource/爆炸。wav’))

資原始檔載入完成後,先寫第一個介面。

由於第一個介面為模擬微信影片通話,所以可以自己用手機影片通話然後截圖。這個介面也是一個迴圈,與之前的程式主迴圈一樣。先設定視窗。

screen = pygame。display。set_mode((340,700))

pygame。display。set_caption(‘生日快樂’)

pygame。display。set_icon(icon)

然後定義一個載入的類,沒有屬性,只有display這個方法。

#載入。。。

class Load(object):

def display(self):

screen。blit(bali,(0,0))

pygame。display。update()

l = Load()

載入物件寫好後,就直接用一個while迴圈,不停的呼叫該類的display方法。並在此時播放預先準備好的鈴聲。

pygame。mixer。music。load(rp(‘resource/鈴聲。wav’))

pygame。mixer。music。play(-1)

load = True

while load:

l。display()

這裡說一下pygame的播放器,它有兩種播放格式,一種是背景音樂播放的方式,即載入即用。另一種是載入好,需要定時播放的。比如一個遊戲中的

音效

,什麼發射子彈、擊中敵人、死亡等。這裡的

pygame。mixer。music。load(rp(‘resource/鈴聲。wav’))

pygame。mixer。music

。play(-1)

播放格式就為背景音樂,引數-1代表一直重複播放該音樂。另一種如上面匯入資源的

boom_sound

= pygame。mixer。Sound(rp(‘resource/爆炸。wav’)),是預先載入好,要用的時候直接bomm_sound。play()就可以了。

此時的執行效果為:

Python|送給朋友的生日祝福

&;lt;可以關注小編的專欄加入交流學習天地,有原始碼 教程&;gt;飛機大戰 坦克大戰 貪吃蛇等2d小遊戲

圖3。1第一個介面

第一個介面寫好後,就需要實現一個介面轉換,其原理就是透過pygame的事件處理和迴圈來實現的。一個介面的迴圈結束,就要進入下一個介面的迴圈,所以這裡可以為這個介面的迴圈加一個事件,比如滑鼠點選接聽按鈕,此時就需要結束這個迴圈,結束這個迴圈也很簡單,直接將引數load改為False即可。

但是pygame並不像以前用過的tkinter,有按鈕(Button)這一元件,所以不能直接新增按鈕,而是透過pygame中的

滑鼠事件

來模擬按鈕的。pygame的滑鼠事件分為三種,MOUSEBUTTONDOWN、MOUSEBUTTONUP、MOUSEMOTION分別代表滑鼠的按鈕按下、抬起、游標移動。

這三個事件都有一個pos()函式,能夠直接獲取當前滑鼠的游標的位置,透過元組的形式返回。所以就可以用pos[0]、pos[1]分別代表x、

y軸座標

。這樣就可以設定條件,如果滑鼠的座標在接聽按鈕範圍內,而且發生了滑鼠按鈕按下事件,這時,就認為滑鼠點選了接聽按鈕。然後就load=False結束迴圈。

for event in pygame。event。get():

if event。type == pygame。MOUSEBUTTONDOWN:

if event。pos[0]

in range

(248,315) and event。pos[1] in range(540,600):

load = False

第一個介面的迴圈結束後,馬上就要進入第二個介面的迴圈。並播放第二個背景音樂。然後用黑色填充背景。(顏色根據自己的喜好選擇)

pygame。mixer。music。load(rp(‘resource/生日快樂。wav’))

pygame。mixer。music。play(-1)

running = True

while running:

for event in pygame。event。get():

if event。type == pygame。QUIT:

exit()

screen。fill((0, 0, 0))

fpsClock。tick(fps)

pygame。display。update()

此時執行,當點選接聽按鈕後,就應該出現以下畫面:

Python|送給朋友的生日祝福

圖3。2點選接聽

注意:這裡是有bgm的,請自行腦補。

然後就需要編寫第二個介面需要展示的內容了,同樣是面向物件程式設計。先編寫蛋糕物件,由於不需要移動,所以只需要寫display()方法就可以了。

class Cake(object):

def display(self):

screen。blit(cake,(46,300))

c = Cake()

c。display()

此時執行效果為:

Python|送給朋友的生日祝福

圖3。3

生日蛋糕

然後是生日祝福語的文字物件。屬性有文字內容、字型渲染。方法為display()。

#祝福語的文字物件

class Birth(object):

def __init__(self):

self。text1 = ‘生’

self。text2 = ‘日’

self。text3 = ‘快’

self。text4 = ‘樂’

self。text5 = ‘歷經千帆’

self。text6 = ‘歸來依舊’

self。text7 = ‘19’

self。render1 = font。render(self。text1,True,(128,128,0))

self。render2 = font。render(self。text2, True, (128, 0, 128))

self。render3 = font。render(self。text3, True, (0, 128, 128))

self。render4 = font。render(self。text4, True, (255, 255, 255))

self。render5 = font1。render(self。text5, True, (128, 0, 0))

self。render6 = font1。render(self。text6, True, (255, 255, 255))

self。render7 = font1。render(self。text7, True, (128, 0, 128))

def display(self):

screen。blit(self。render1,(155,20))

screen。blit

(self。render2,(155,80))

screen。blit(self。render3,(155,160))

screen。blit(self。render4,(155,220))

screen。blit(self。render5, (110,550))

screen。blit(self。render6, (110,590))

screen。blit(self。render7,(155,630))

b = Birth()

b。display()

其中的祝福語可根據自己情況更改,render()函式中的第二個引數True代表抗鋸齒。

Python|送給朋友的生日祝福

圖3。4生日祝福

最後再來一個煙花物件,讓螢幕上充滿煙花。煙花的座標是需要變化的,而且煙花的樣子也要隨機引數,所以屬性有座標、圖片物件。方法有display()。為了使煙花看起來更真實,所以讓煙花的座標用random在指定範圍內隨機產生。還有煙花的樣式,可以先用一個列表來儲存所有的煙花圖片。然後再用random。choice()函式從列表中隨機選取。最後再預設煙花的數量,控制煙花同時出現在螢幕上的數量。具體看程式碼。

#預設煙花數量

fires = []

fire_num = 6

fire = False

#煙花

class Firework(object):

def __init__(self):

self。x = random。randint(20,220)

self。y = random。randint(20,280)

self。fire = random。choice(firesImg)

def display(self):

global fires

screen。blit(self。fire,(self。x,self。y))

boom_sound。play()

f = Firework()

for i in range(

fire_num

):

fires。append(Firework())

for f in fires:

f。display()

預設煙花數量的方式是用一個列表將它們全部儲存起來,然後用for迴圈遍歷呼叫display()方法。如果只是這樣執行的話,發現螢幕上只有6個一動不動的煙花。

Python|送給朋友的生日祝福

圖3。5不動的煙花

而要讓煙花動起來,並且是要沒有規律的動,則需要在display()方法中新增以下程式碼:

fires。remove(random。choice(fires))

fires。append(Firework())

每迴圈一次就從列表中隨機拿走一個煙花,然後再隨機產生煙花,這樣看起來就非常的真實了。

4完整程式

此程式的完整程式碼為:

#匯入模組。。。

import random

import pygame,sys,os

pygame。mixer。init()

from pygame。locals import *

pygame。init()

fps = 30

fpsClock = pygame。time。Clock()

icon = pygame。image。load(‘resource/h-2。JPG’)

bali =

pygame。image

。load(‘resource/baligonglu。png’)

cake = pygame。image。load(‘resource/cake。png’)

fire1 = pygame。image。load(‘resource/firework1。png’)

fire2 = pygame。image。load(‘resource/firework2。png’)

fire3 = pygame。image。load(‘resource/firework3。png’)

fire4 = pygame。image。load(‘resource/firework4。png’)

firesImg = [fire1,fire2,fire3,fire4]

font = pygame。font。Font(‘resource/繁星糖果。ttf’,50)

font1 = pygame。font。Font(‘resource/繁星糖果。ttf’,30)

boom_sound = pygame。mixer。Sound(‘resource/爆炸。wav’)

pygame。mixer。music。load(‘resource/鈴聲。wav’)

pygame。mixer。music。play(-1)

screen = pygame。display。set_mode((340,700))

pygame。display。set_caption(‘生日快樂’)

pygame。display。set_icon(icon)

#載入。。。

class Load(object):

def display(self):

screen。blit(bali,(0,0))

pygame。display。update()

l = Load()

#蛋糕

class Cake(object):

def display(self):

screen。blit(cake,(46,300))

c = Cake()

#預設煙花數量

fires = []

fire_num = 6

fire = False

#煙花

class Firework(object):

def __init__(self):

self。x = random。randint(20,220)

self。y = random。randint(20,280)

self。fire = random。choice(firesImg)

def display(self):

global fires

screen。blit(self。fire,(self。x,self。y))

boom_sound。play()

fires。remove(random。choice(fires))

fires。append(Firework())

f = Firework()

for i in range(fire_num):

fires。append(Firework())

#祝福語的文字物件

class Birth(object):

def __init__(self):

self。text1 = ‘生’

self。text2 = ‘日’

self。text3 = ‘快’

self。text4 = ‘樂’

self。text5 = ‘歷經千帆’

self。text6 = ‘歸來依舊’

self。text7 = ‘19’

self。render1 = font。render(self。text1,True,(128,128,0))

self。render2 = font。render(self。text2, True, (128, 0, 128))

self。render3 = font。render(self。text3, True, (0, 128, 128))

self。render4 = font。render(self。text4, True, (255, 255, 255))

self。render5 = font1。render(self。text5, True, (128, 0, 0))

self。render6 = font1。render(self。text6, True, (255, 255, 255))

self。render7 = font1。render(self。text7, True, (128, 0, 128))

def display(self):

screen。blit(self。render1,(155,20))

screen。blit(self。render2,(155,80))

screen。blit(self。render3,(155,160))

screen。blit(self。render4,(155,220))

screen。blit(self。render5, (110,550))

screen。blit(self。render6, (110,590))

screen。blit(self。render7,(155,630))

b = Birth()

load = True

while load:

l。display()

for event in pygame。event。get():

if event。type == pygame。MOUSEBUTTONDOWN:

if event。pos[0] in range(248,315) and event。pos[1] in range(540,600):

load = False

pygame。mixer。music。load(‘resource/生日快樂。wav’)

pygame。mixer。music。play(-1)

running = True

while running:

for event in pygame。event。get():

if event。type == pygame。QUIT:

exit()

screen。fill((0, 0, 0))

b。display()

for f in fires:

f。display()

c。display()

fpsClock。tick(fps)

pygame。display。update()

完整的執行效果為:

5總結

送給朋友生日祝福就做好了,由於是2D效果,所以整體不是很美觀。不過此程式僅供學習交流,送給朋友也不錯,但是該送點實際的禮物還是送點。否則,後果自負哦。

學完這個程式後,其實你就已經具備寫一個貪吃蛇、飛機大戰、坦克大戰等經典2D遊戲的能力了,所以可以試著自己去做一下。

<可以關注小編的專欄加入交流學習天地,有原始碼 教程>

最後小編還是想說,感謝大家的關注,你們的關注就是小編們的動力,以後小編將繼續給大家帶來更多好玩有趣的程式。

本文分享自微信公眾號 - 演算法與程式設計之美(algo_coding),作者:江來洪

原文出處及轉載資訊見文內詳細說明,如有侵權,請聯絡 刪除。

本文參與騰訊雲自媒體分享計劃,歡迎正在閱讀的你也加入,一起分享。