520表白日,男人怎麼送禮物,就怎麼愛你
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICMyYTMvw1dvwlMvwlM3VWaWV2Zh1Wa-YWan5ierFzYzx2Zm9mevwVM0QzN0IDOtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.gif)
每個女孩都喜歡男孩對自己浪漫的表白,不過每個人性格不同,浪漫表白的方式也不盡相同。那麼520怎樣浪漫的表白好呢?程式員如何俘獲心儀女神的心呢?當然是要用程式員的方法了!
在2020年5月20日到來之際,作為一個愛看抖音的純小白的我也要跟跟風:用Python語言實作無法拒絕的音樂表白代碼并用QQ圖示方式打開!有想法的小夥伴們快快拿去向心愛的TA表白愛意吧!
目錄
Ⅰ Python語言實作概述
Ⅱ 代碼詳解
python庫的導入
顯示螢幕大小設定
添加文本資訊
設定按鈕相關資訊
生成随機位置坐标
點選YES後顯示的頁面
點選NO後顯示的頁面
main()函數
Ⅲ 基于QQ圖示搭載表白代碼實作方式
Ⅳ 完整版音樂表白代碼
Ⅴ 代碼運作效果展示
Ⅰ 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()
複制
Ⅴ 代碼運作效果展示
注:其實是含有音樂的,但這裡沒法展示,小夥伴們可以在自己電腦上跑一下