520表白日,男人怎麼送禮物,就怎麼愛你
每個女孩都喜歡男孩對自己浪漫的表白,不過每個人性格不同,浪漫表白的方式也不盡相同。那麼520怎樣浪漫的表白好呢?程序員如何俘獲心儀女神的心呢?當然是要用程序員的方法了!
在2020年5月20日到來之際,作爲一個愛看抖音的純小白的我也要跟跟風:用Python語言實現無法拒絕的音樂表白代碼並用QQ圖標方式打開!有想法的小夥伴們快快拿去向心愛的TA表白愛意吧!
目錄
Ⅰ Python語言實現概述
本文章代碼效果實現使用的是Python語言,編譯軟件用的是PyCharm 2018.1.2 ×64,Python環境選用的是3.7版本的。
用到的Python庫有利用SDL(Simple DirectMedia Layer)寫就的遊戲庫——pygame庫、海龜繪圖體系——turtle庫、使用隨機數的Python標準庫——random庫、python中處理時間的標準庫——time庫。
在Python第三方庫安裝方面還迷茫的小夥伴可參考我的另一篇博文——三招教你安遍所有Python第三方庫。
這裏給出鏈接:https://blog.csdn.net/IT_charge/article/details/105586808
Ⅱ 代碼詳解
python庫的導入
首先,導入我們需要的庫pygame庫、turtle庫、random庫、time庫
import pygame
import random
from turtle import *
import time
Pygame是一個利用SDL(Simple DirectMedia Layer,用C或C++進行開發的)庫的寫就的遊戲庫,是一組用來開發遊戲軟件的 Python 程序模塊。Pygame就是Python中使用它的一個庫。Pygame允許你在 Python 程序中創建功能豐富的遊戲和多媒體程序,是一個高可移植性的模塊可以支持多個操作系統,用它來開發小遊戲非常適合。在這裏,選用它撩動你心儀的女神實在是再好不過了。
random庫是使用隨機數的python的標準庫,random()是不能直接訪問的,需要導入 random 模塊,然後通過 random 靜態對象調用該方法。Python中產生隨機數使用隨機數種子來產生。(只要種子相同,產生的隨機序列,無論是每一個數,還是數與數之間的關係都是確定的,所以隨機數種子確定了隨機序列的產生)。
Turtle庫是Python語言中一個很流行的繪製圖像的函數庫,想象一個小烏龜,在一個橫軸爲x、縱軸爲y的座標系原點,(0,0)位置開始,它根據一組函數指令的控制,在這個平面座標系中移動,從而在它爬行的路徑上繪製了圖形。
time庫是Python中處理時間的標準庫計算機時間的表達。import time提供獲取系統時間並格式化輸出功能。time.<b>()提供系統級精確計時功能,用於程序性能分析time庫概述。
顯示屏幕大小設置
顯示長寬(WIDTH、HEIGHT)大小是依據你選定的背景圖片定的
pygame.display.set_mode() 用於初始化一個準備顯示的窗口或屏幕
pygame.display.set_caption() — Set the current window caption(設置當前窗口的標題欄)
WIDTH, HEIGHT = 1014, 605
screen = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('520 屬於你的表白日')
set_mode(resolution=(0,0), flags=0, depth=0) -> Surface
resolution 參數是一個二元組,表示寬和高。flags 參數是附件選項的集合。depth 參數表示使用的顏色深度。
set_caption(title, icontitle=None) -> None
如果顯示窗口擁有一個標題欄,這個函數將修改窗口標題欄的文本。一些操作系統支持最小化窗口時切換標題欄,通過設置 icontitle 參數實現。
添加文本信息
pygame.font.SysFont()從系統字體庫創建一個 Font 對象。
screen.blit()初始化文字座標,由於後面範圍scale是數組形式存儲,所以這裏採取數組下標方式取數進而確定初始位置座標
def title(text, screen, scale, color=(0, 0, 0)):
font = pygame.font.SysFont('KaiTi', 25)
textRender = font.render(text, True, color)
# 初始化文字的座標
screen.blit(textRender, (WIDTH / scale[0], HEIGHT / scale[1]))
SysFont(name, size, bold=False, italic=False) -> Font
從系統字體庫中加載並返回一個新的字體對象。該字體將會匹配 bold(加粗)和 italic(斜體)參數的要求。如果找不到一個合適的系統字體,該函數將會回退並加載默認的 pygame 字體。嘗試搜索的 name 參數可以是一個用逗號隔開的列表。
設置按鈕相關信息
pygame.draw.rect() — 繪製矩形
pygame.font.SysFont()從系統字體庫創建一個 Font 對象。
get_rect()是一個處理矩形圖像的方法,返回值包含矩形的居中屬性
screen.blit() 初始化按鈕顯示座標
def button(text, x, y, w, h, color, screen, color_text):
pygame.draw.rect(screen, color, (x, y, w, h))
font = pygame.font.SysFont('KaiTi', 25)
textRender = font.render(text, True, color_text)
textRect = textRender.get_rect()
textRect.center = ((x+w/2), (y+h/2))
screen.blit(textRender, textRect)
rect(Surface, color, Rect, width=0) -> Rect
在 Surface 對象上繪製一個矩形。Rect 參數指定矩形的位置和尺寸。width 參數指定邊框的寬度,如果設置爲 0 則表示填充該矩形。
當然,你也可以pygame.draw.polygon() — 繪製多邊形;pygame.draw.circle() — 根據圓心和半徑繪製圓形;pygame.draw.ellipse() — 根據限定矩形繪製一個橢圓形;pygame.draw.lines() — 繪製多條連續的線段;
pygame.draw.aalines() — 繪製多條連續的線段(抗鋸齒)
生成隨機位置座標
get_random_pos()分別在20·520之間生成隨機整數且賦值給x,y並返回x,y座標值
def get_random_pos():
x, y = random.randint(20, 520), random.randint(20, 520)
return x, y
在python中的random.randint(a,b)用於生成一個指定範圍內的整數。其中參數a是下限,參數b是上限,生成的隨機數n: a <= n <= b。
點擊YES後顯示的頁面
事實上,我們在這裏運用python中的海龜繪圖體系繪製出許多小愛心匯成大愛心,在大愛心內寫好我們要表白的對象名,並在左下角寫出情話,右下角寫出日期。
首先,定義了窗口大小、顏色、筆的粗細以及畫圖的速度等
screensize(1200, 900, '顏色')
pensize(3)
speed(12)
penup()
規定了開始畫圖時的起始位置,窗口中心爲0,0,繪製大小愛心,寄語、日期繪製等。
goto(0, -180)
r = h / 5
drawBigL(r, h)
drawBigArc(r, 140)
drawBigArc(r, 70)
drawBigR(r, h)
centerRange()
drawHope()
drawDate()
繪製這部分區域
def drawBigL(r, h):
colors = ['顏色1', '顏色2', '顏色3', '顏色4', '顏色5', '顏色6']
for i in range(int(數值 / h) + 1): # 這裏的數值要是後邊程序定的h的大小的4倍
seth(0)
color(colors[i], colors[i + 1]) # 第一個顏色指的是輪廓色,的第二個是內填充色
drawHeart(r)
seth(140)
fd(h)
繪製這部分區域
def drawBigArc(r, rad):
colors = ['顏色1', '顏色2', '顏色3', '顏色4', '顏色5', '顏色6']
for i in range(50):
if (i % 10 == 0): #在左上區域和右上區域要各畫5顆小愛心
color(colors[int(i / 10)], colors[int(i / 10) + 1]) #第一個顏色輪廓色,二爲內填充色
seth(0)
drawHeart(r)
seth(rad - (i + 1) * 4) # 達到愛心左上角和右上角弧度旋轉的效果,使其成爲小愛心匯聚成的真正的大愛心
rt(4) # 繪製方向向右旋轉4度(個位數字變爲0)
fd(10.5) # 畫筆向繪製方向的當前方向移動10.5距離
繪製這部分區域
def drawBigR(r, h):
colors = ['顏色1', '顏色2', '顏色3', '顏色4', '顏色5', '顏色6']
for i in range(int(數值 / h) + 1): # 這裏的數值要是後邊程序定的h的大小的4倍
color(colors[i], colors[i + 1]) # 顏色1爲愛心邊緣的輪廓顏色,顏色2爲內部填充顏色
seth(0)
drawHeart(r)
setheading(220) # 設置當前朝向爲220角度
fd(h) # 沿着海龜的前方向運行h
畫每一個小愛心,具體起筆落筆動畫見下圖
def drawHeart(r):
down() #落筆
begin_fill() #開始填充
factor = 180 #定義旋轉角度
seth(45) #以x軸方向爲起點將方向偏轉爲45度,逆時針爲正。只改變行進方向但不行進。
circle(-r, factor) #從當前位置以r爲半徑圓的180角度旋轉
fd(2 * r) #以當前方向,往前行進2r像素
right(90) #在當前行進方向的基礎上,向右旋轉90度
fd(2 * r) #以當前方向,往前行進2r像素
circle(-r, factor) #從當前位置以r爲半徑圓的180角度旋轉
end_fill() #結束填充
up() #提筆
循環次數設置,使得表白人的名字在大愛心中停留時間與稍後所述的顏色遍歷個數一致
def centerRange():
for i in range(遍歷個數):
drawCenter(i)
time.sleep(1) #停留時長與顏色轉換數保持一致
在位置座標(-147,0)位置處寫好像誰表白(如:love xxx,可對字體設置)並使用各種顏色渲染這幾個文字
def drawCenter(i):
goto(大心中的字描繪的起始位置)
colors = ['顏色1', '顏色2', '顏色3', '顏色4', '顏色5', '顏色6']
pencolor(colors[i])
write('love XXX', font=('gungsuh', 30,),)
up()
點擊NO後顯示的頁面
直接返回程序最開始重新執行
def show_unlike_interface(screen):
return main()
main()函數
init()初始化
pygame.time.Clock對象幫助我們確定程序要以多少最大的幀速率運行
pygame.init()
clock = pygame.time.Clock()
添加背景音樂
這裏推薦一個免費下載音樂的網址:http://www.gequdaquan.net/gqss/
pygame.mixer.music.load() —— 載入一個音樂文件用於播放
pygame.mixer.music.play() —— 開始播放音樂流
pygame.mixer.music.set_volume() —— 設置音量
pygame.mixer.music.load('mp3文件路徑,注意用符號/而不是\')
pygame.mixer.music.play(是否循環播放, 播放開始時間)
pygame.mixer.music.set_volume(速度設置,值在0~1之間)
play(loops=0, start=0.0) -> None
該函數用於播放已載入的音樂流。如果音樂已經開始播放,則將會重新開始播放。
loops 參數控制重複播放的次數,例如 play(5) 意味着被載入的音樂將會立即開始播放 1 次並且再重複 5 次,共 6 次。如果 loops = -1,則表示無限重複播放。
start 參數控制音樂從哪裏開始播放。開始的位置取決於音樂的格式。MP3 和 OGG 使用時間表示播放位置(以秒爲單位)。MOD使用模式順序編號表示播放位置。如果音樂文件無法設置開始位置,則傳遞了start參數後會產生一個NotImplementedError 錯誤。
set_volume(value) -> None
設置音樂的播放音量。
value 參數值範圍爲 0.0~1.0。當新的音樂文件被載入,音量會被重置。
爲了顯示出不許碰到效果,這裏設置了觸碰處在矩形大小長寬各加 x 像素大小(自己設定)的位置,就是爲了達到還沒觸碰到矩形就逃跑了的效果(就不讓你碰到,嘿嘿,以此來撩動女神)。
且在設計時,設計了最多拒絕次數的上限,根據稍後代碼可知,達拒絕峯值後,點擊拒絕按鈕將重新從main()函數重新執行
if pos[0] < unlike_pos_x + unlike_pos_width + 數值 and pos[0] > unlike_pos_x - 數值 and pos[1] < unlike_pos_y + unlike_pos_height + 數值 and pos[1] > unlike_pos_y - 數值:
while True:
if num > 拒絕次數峯值-1:
break
num += 1
unlike_pos_x, unlike_pos_y = get_random_pos()
if pos[0] < unlike_pos_x + unlike_pos_width + 數值 and pos[0] > unlike_pos_x - 數值 and pos[1] < unlike_pos_y + unlike_pos_height + 數值 and pos[1] > unlike_pos_y - 數值:
continue
break
pygame.display.flip() — 更新整個待顯示的 Surface 對象到屏幕上
pygame.display.update() — 更新部分軟件界面顯示
pygame.display.flip()
pygame.display.update()
clock.tick(60)
flip() -> None
這個函數將更新整個顯示界面的內容。如果你的顯示模式使用了 pygame.HWSURFACE(硬件加速)和 pygame.DOUBLEBUF(雙緩衝)標誌,那麼將等待垂直會掃並切換顯示界面。如果你使用不同類型的顯示模式,那麼它將簡單的更新整個顯示界面的內容。
update(rectangle=None) -> None
update(rectangle_list) -> None
這個函數可以看作是 pygame.display.flip() 函數在軟件界面顯示的優化版。它允許更新屏幕的部分內容,而不必完全更新。如果沒有傳入任何參數,那麼該函數就像 pygame.display.flip() 那樣更新整個界面。
time_passed = clock.tick(30)
在每一個循環中加上它,那麼給tick方法加上的參數就成爲了遊戲繪製的最大幀率,這樣的話,遊戲就不會用掉你所有的CPU資源了
Ⅲ 基於QQ圖標搭載表白代碼實現方式
先將寫好的py文件保存到桌面
File -> Save As... -> To directory -> C:/Users/用戶/Desktop
打開騰訊QQ屬性,將目標(T)中的內容Ctrl+C複製
創建 BiaoBai.py 文件的快捷方式
在 BiaoBai.py-快捷方式的屬性中選擇更改圖標並把剛剛複製的騰訊QQ目標(T)中的值粘貼過來
照上述做法後,點擊兩次確定,出現QQ圖標式的.py文件的快捷方式
將 BiaoBai-快捷方式重命名爲QQ
至此,你就可以雙擊QQ圖標體驗含有音樂的無法拒絕的表白代碼啦~
是不是感覺棒棒噠O(∩_∩)O哈哈~
Ⅳ 完整版音樂表白代碼
import pygame
import random
from turtle import *
import time
# 設置屏幕大小
WIDTH, HEIGHT = 1014, 605
screen = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)
pygame.display.set_caption('520 屬於你的表白日')
# 添加文本信息
def title(text, screen, scale, color=(0, 0, 0)):
font = pygame.font.SysFont('KaiTi', 25)
textRender = font.render(text, True, color)
screen.blit(textRender, (WIDTH / scale[0], HEIGHT / scale[1]))
# 設置按鈕信息
def button(text, x, y, w, h, color, screen, color_text):
pygame.draw.rect(screen, color, (x, y, w, h))
font = pygame.font.SysFont('KaiTi', 25)
textRender = font.render(text, True, color_text)
textRect = textRender.get_rect()
textRect.center = ((x+w/2), (y+h/2))
screen.blit(textRender, textRect)
# 生成隨機的位置座標
def get_random_pos():
x, y = random.randint(20, 620), random.randint(20, 460)
return x, y
# 點擊YES後顯示的頁面
def show_like_interface(screen):
def setTurtle():
screensize(1200, 900, 'pink')
pensize(3)
speed(12)
penup()
def getStart(h):
# 去到的座標,窗口中心爲0,0
goto(0, -180)
r = h / 5
drawBigL(r, h)
drawBigArc(r, 140)
drawBigArc(r, 70)
drawBigR(r, h)
centerRange()
drawHope()
drawName()
def drawBigL(r, h):
colors = ['red', 'orange', 'yellow', '#87CEEB', 'violet', 'red']
for i in range(int(240 / h) + 1):
seth(0)
color(colors[i], colors[i + 1])
drawHeart(r)
seth(140)
fd(h)
def drawBigArc(r, rad):
colors = ['red', 'orange', 'yellow', 'SkyBlue', 'violet', 'red']
for i in range(50):
if (i % 10 == 0):
color(colors[int(i / 10)], colors[int(i / 10) + 1])
seth(0)
drawHeart(r)
seth(rad - (i + 1) * 4)
rt(4)
fd(10.5)
def drawBigR(r, h):
colors = ['red', 'orange', 'yellow', 'SkyBlue', 'violet', 'red']
for i in range(int(240 / h) + 1):
color(colors[i], colors[i + 1])
seth(0)
drawHeart(r)
setheading(220)
fd(h)
def drawHeart(r):
down()
begin_fill()
factor = 180
seth(45)
circle(-r, factor)
fd(2 * r)
right(90)
fd(2 * r)
circle(-r, factor)
end_fill()
up()
# 在大心中寫字
def centerRange():
for i in range(6):
drawCenter(i)
time.sleep(1)
def drawCenter(i):
goto(-85, 0)
colors = ['red', 'orange', 'yellow', 'SkyBlue', 'violet', 'red']
pencolor(colors[i])
write('love 榮仔', font=('gungsuh', 30,), )
up()
# 寫情話
def drawHope():
pencolor('black')
goto(-310, -170)
showturtle()
write('情書給你一封', font=('華文行楷', 20,), move=True)
goto(-290, -200)
write('情話給你一句', font=('華文行楷', 20,), move=True)
goto(-260, -230)
write('餘生給你一人', font=('華文行楷', 20,), move=True)
# 寫日期
def drawName():
pencolor('black')
goto(150, -200)
showturtle()
write('2020年5月20日 ', font=('華文行楷', 20,), move=True)
setTurtle()
getStart(80)
# 點擊窗口關閉
window = Screen()
window.exitonclick()
# 點擊NO按鈕後返回程序開頭重新執行
def show_unlike_interface(screen):
return main()
def main():
num = 0
pygame.init()
clock = pygame.time.Clock()
# 添加背景音樂
pygame.mixer.music.load('F:/music.mp3')
pygame.mixer.music.play(-1, 40)
pygame.mixer.music.set_volume(0.5)
# 設置YES按鈕屬性
unlike_pos_x = 130
unlike_pos_y = 375
unlike_pos_width = 450
unlike_pos_height = 55
unlike_color = (115, 76, 243)
# 設置NO按鈕屬性
like_pos_x = 130
like_pos_y = 280
like_pos_width = 450
like_pos_height = 55
like_color = (115, 76, 243)
running = True
while running:
# 填充窗口
screen.fill((255, 255, 255))
# 添加背景圖
background = pygame.image.load('F:/love520.PNG').convert()
screen.blit(background, (0, 0))
# 獲取鼠標座標
pos = pygame.mouse.get_pos()
if pos[0] < unlike_pos_x + unlike_pos_width + 5 and pos[0] > unlike_pos_x - 5 and pos[1] < unlike_pos_y + unlike_pos_height + 5 and pos[1] > unlike_pos_y - 5:
while True:
if num > 5:
break
num += 1
unlike_pos_x, unlike_pos_y = get_random_pos()
if pos[0] < unlike_pos_x + unlike_pos_width + 5 and pos[0] > unlike_pos_x - 5 and pos[1] < unlike_pos_y + unlike_pos_height + 5 and pos[1] > unlike_pos_y - 5:
continue
break
# 設置撩動女生助你表白成功的話及按鈕內容信息等
title('你是不是喜歡我?', screen, scale=[8, 3])
button('YES', like_pos_x, like_pos_y, like_pos_width, like_pos_height, like_color, screen, (255, 255, 255))
# 設置一些套路
# 當拒絕次數小於6時,並未執行小矩形不動的程序,當將要觸碰時小矩形還可繼續隨機跳動
if num < 6:
button('NO', unlike_pos_x, unlike_pos_y, unlike_pos_width, unlike_pos_height, unlike_color, screen, (255, 255, 255))
if num > 5:
button('看來我只能接收喜歡你的事實咯', unlike_pos_x, unlike_pos_y, unlike_pos_width, unlike_pos_height, unlike_color, screen, (255, 255, 255))
# 設置知道她喜歡你事實的文本
if num == 1:
button('一看見你就對我傻笑', unlike_pos_x, unlike_pos_y - 50, unlike_pos_width, unlike_pos_height, (255, 255, 255), screen, (192, 0, 0))
if num == 2:
button('天天來看我的朋友圈', unlike_pos_x, unlike_pos_y - 50, unlike_pos_width, unlike_pos_height, (255, 255, 255), screen, (192, 0, 0))
if num == 3:
button('一抄作業就來找我', unlike_pos_x, unlike_pos_y - 50, unlike_pos_width, unlike_pos_height, (255, 255, 255), screen, (192, 0, 0))
if num == 4:
button('滾滾紅塵', unlike_pos_x, unlike_pos_y - 50, unlike_pos_width, unlike_pos_height, (255, 255, 255), screen, (192, 0, 0))
if num == 5:
button('我喜歡你的同時', unlike_pos_x, unlike_pos_y - 50, unlike_pos_width, unlike_pos_height, (255, 255, 255), screen, (192, 0, 0))
if num == 6:
button('正好你也喜歡我', unlike_pos_x, unlike_pos_y - 50, unlike_pos_width, unlike_pos_height, (255, 255, 255), screen, (192, 0, 0))
# 當拒絕次數達到峯值時,跳轉到NO指定程序,即回到main()函數重新執行,達到女神不得不答應你的目的
if num > 5:
if pos[0] < unlike_pos_x + unlike_pos_width + 5 and pos[0] > unlike_pos_x - 5 and pos[1] < unlike_pos_y + unlike_pos_height + 5 and pos[1] > unlike_pos_y - 5:
if event.type == pygame.MOUSEBUTTONDOWN:
show_unlike_interface(screen)
# 當點擊窗口關閉按鈕時,亦關閉不了,直到承認喜歡你的事實後方可結束程序
for event in pygame.event.get():
if event.type == pygame.QUIT:
return main()
# 點擊YES按鈕
if pos[0] < like_pos_x + like_pos_width + 5 and pos[0] > like_pos_x - 5 and pos[1] < like_pos_y + like_pos_height + 5 and pos[1] > like_pos_y - 5:
if event.type == pygame.MOUSEBUTTONDOWN:
show_like_interface(screen)
pygame.display.flip()
pygame.display.update()
clock.tick(60)
main()
Ⅴ 代碼運行效果展示
注:其實是含有音樂的,但這裏沒法展示,小夥伴們可以在自己電腦上跑一下