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()就可以了。
此時的執行效果為:
&;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()
此時執行,當點選接聽按鈕後,就應該出現以下畫面:
圖3。2點選接聽
注意:這裡是有bgm的,請自行腦補。
然後就需要編寫第二個介面需要展示的內容了,同樣是面向物件程式設計。先編寫蛋糕物件,由於不需要移動,所以只需要寫display()方法就可以了。
class Cake(object):
def display(self):
screen。blit(cake,(46,300))
c = Cake()
c。display()
此時執行效果為:
圖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代表抗鋸齒。
圖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個一動不動的煙花。
圖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),作者:江來洪
原文出處及轉載資訊見文內詳細說明,如有侵權,請聯絡 刪除。
本文參與騰訊雲自媒體分享計劃,歡迎正在閱讀的你也加入,一起分享。