本文章代码效果实现使用的是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
首先,导入我们需要的库pygame库、turtle库、random库、time库
import pygameimport randomfrom 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.()提供系统级精确计时功能,用于程序性能分析time库概述。
显示长宽(WIDTH、HEIGHT)大小是依据你选定的背景图片定的
pygame.display.set_mode() 用于初始化一个准备显示的窗口或屏幕
pygame.display.set_caption() — Set the current window caption(设置当前窗口的标题栏)
WIDTH, HEIGHT = 1014, 605screen = pygame.display.set_mode((WIDTH, HEIGHT), 0, 32)pygame.display.set_caption('520 属于你的表白日')
set_mode(resolution=(0,0), flags=0, depth=0) -> Surfaceresolution 参数是一个二元组,表示宽和高。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。
事实上,我们在这里运用python中的海龟绘图体系绘制出许多小爱心汇成大爱心,在大爱心内写好我们要表白的对象名,并在左下角写出情话,右下角写出日期。
首先,定义了窗口大小、颜色、笔的粗细以及画图的速度等
screensize(1200, 900, '颜色')pensize(3)speed(12)penup()
规定了开始画图时的起始位置,窗口中心为0,0,绘制大小爱心,寄语、日期绘制等。
goto(0, -180)r = h / 5drawBigL(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()
直接返回程序最开始重新执行
def show_unlike_interface(screen): return 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) -> Noneupdate(rectangle_list) -> None这个函数可以看作是 pygame.display.flip() 函数在软件界面显示的优化版。它允许更新屏幕的部分内容,而不必完全更新。如果没有传入任何参数,那么该函数就像 pygame.display.flip() 那样更新整个界面。
time_passed = clock.tick(30) 在每一个循环中加上它,那么给tick方法加上的参数就成为了游戏绘制的最大帧率,这样的话,游戏就不会用掉你所有的CPU资源了
先将写好的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 pygameimport randomfrom turtle import *import time # 设置屏幕大小WIDTH, HEIGHT = 1014, 605screen = 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()
注:其实是含有音乐的,但这里没法展示,小伙伴们可以在自己电脑上跑一下
需要打包源文件 加源码群:1136192749