Python|520表白神器

1前言

众所周知,5月20日为“520”情人节,这一天也是即将到来,大家都希望与自己的男神女神过一个浪漫的情人节。但是还有很多像小编这样的单身狗,不知道如何向自己的男神女神表达心意,所以今天小编就教大家用代码的方式给你的那个她(他)表白。

很多人学习python,不知道从何学起。
很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手。
很多已经做案例的人,却不知道如何去学习更加高深的知识。
那么针对这三类人,我给大家提供一个好的学习平台,免费领取视频教程,电子书籍,以及课程的源代码!
QQ群:1097524789

2准备

这个代码仍然是用简单的python编写的,用到的模块也只有小编以往多次使用pygame,其下载方式依然是用pip安装。只需要在命令行运行以下代码安装即可。

pip install pygame

3详细步骤

首先导入所需的模块以及初始化pygame

import pygame

from pygame import *

pygame.init()

然后设置主窗口以及引入所需要用到的资源文件。

fps = 60

fpsClock = pygame.time.Clock()

icon = pygame.image.load('resource/h-2.JPG')

love = pygame.image.load('resource/爱心.png')

font01 = pygame.font.Font('resource/繁星糖果.ttf',80)

font02 = pygame.font.Font('resource/繁星糖果.ttf',50)

screen = pygame.display.set_mode((1000,600))

pygame.display.set_caption('八里公路')

pygame.display.set_icon(icon)

注意:这里所有的资源文件都放在与代码文件同目录下的resource文件中。

这时运行的话会一闪而过。所以还需要写一个主循环来控制显示。

running = True

while running:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            exit()

    fpsClock.tick(fps)

    pygame.display.update()

其中的fpsClock,tick()函数为控制程序运行的帧率,也就是一秒运行多少次。作为一个pygame程序主窗口所必备的退出事件,自然是必不可少的,都是固定的用法,看过小编前几期的文章就知道了。

这时候的运行效果为:

图3.1主窗口

这样程序的背景就设置好了,但是一种颜色比较单调,所以可以在主循环处添加几行代码,让背景颜色随着rgb值不停的变化。修改后的代码应为:

running = True

r,g,b = 0,0,0

while running:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            exit()

    screen.fill((r,g,b))

    if r >= 255:

        b += 5

        r = 0

    if g >= 255:

        r += 5

        g = 0

    if b >= 125:

        b = 0

g += 5

fpsClock.tick(fps)

    pygame.display.update()

然后再次运行:

图3.2颜色变化1

图3.3颜色变化2

其中的颜色如何变化可以根据自己或男神女神的喜好来改变。

背景设置好后,就可以在上面布局了。对于每一个文字类型或是图片类型,小编都是用面向对象来编程的,这样的好处是方便处理,同时代码的可读性也比较好。首先编写的是爱心对象,它的属性有坐标,方法有移动、显示。这里先写显示的方法,具体先看代码。

class LoveStar(object):

    def __init__(self,x,y):

        self.x = x

        self.y = y

    def display(self):

        screen.blit(love,(self.x,self.y))

这只是一个爱心的对象,程序还需要多个爱心对象来组成一个大爱心,因为每一个爱心对象只是初始坐标属性不同,所以在初始化类的时候赋予不同位置参数。然后用一个列表来存储所有的爱心对象。最后再在主循环用for循环的方式调用每个爱心对象的移动和显示方法。

lovestars = []

lovestars.append(LoveStar(475,100))

lovestars.append(LoveStar(425,75))

lovestars.append(LoveStar(375,100))

lovestars.append(LoveStar(525,75))

lovestars.append(LoveStar(575,100))

lovestars.append(LoveStar(350,150))

lovestars.append(LoveStar(600,150))

lovestars.append(LoveStar(370,200))

lovestars.append(LoveStar(580,200))

lovestars.append(LoveStar(400,250))

lovestars.append(LoveStar(550,250))

lovestars.append(LoveStar(435,300))

lovestars.append(LoveStar(515,300))

lovestars.append(LoveStar(475,340))

lovestars.append(LoveStar(100,400))

lovestars.append(LoveStar(100,500))

lovestars.append(LoveStar(900,400))

lovestars.append(LoveStar(900,500))

lovestars.append(LoveStar(100,600))

lovestars.append(LoveStar(100,700))

lovestars.append(LoveStar(900,600))

lovestars.append(LoveStar(900,700))

    for lovestar in lovestars:

        lovestar.display()

注意这里每一爱心对象的初始坐标是需要通过自己计算的,小编也是先在纸上画了大概的布局位置的。运行效果如下:

图3.4爱心对象

当然也可以根据自己的情况改变布局方式。爱心显示后然后让它们动起来,小编这里是通过循环滚动的方式来展示窗口中的内容,所以要注意爱心出界后,更新它的位置。

    def move(self):

        if self.y < -50:

            self.y = 600

        else:

            self.y -= 1

此时运行结果:

图3.5爱心的运动

有了图像后,还需添加文字,文字的内容看自己。这里要注意的是pygame中小编没有发现多行文字展示,不知道是不是pygame不支持。所以要想文字换行,只能多写几个文字对象。

例如:

class Goddess(object):

    def __init__(self):

        self.text01 = '女神'

        self.text02 = '每'

        self.text03 = '天'

        self.text04 = '都'

        self.text05 = '有'

        self.text06 = '喜'

        self.text07 = '欢'

        self.text08 = '你'

        self.text09 = '哦'

        self.text010 = '做我女朋友好吗'

        self.x01, self.y01 = 425, 150

        self.x02, self.y02 = 150, 250

        self.x03, self.y03 = 200, 300

        self.x04, self.y04 = 250, 350

        self.x05, self.y05 = 300, 400

        self.x06, self.y06 = 800, 250

        self.x07, self.y07 = 750, 300

        self.x08, self.y08 = 700, 350

        self.x09, self.y09 = 650, 400

        self.x010, self.y010 = 325, 600

        self.render01 = font01.render(self.text01, True, (128, 0, 0))

        self.render02 = font02.render(self.text02, True, (128, 128, 0))

        self.render03 = font02.render(self.text03, True, (128, 0, 128))

        self.render04 = font02.render(self.text04, True, (0, 128, 128))

        self.render05 = font02.render(self.text05, True, (0, 0, 128))

        self.render06 = font02.render(self.text06, True, (128, 128, 0))

        self.render07 = font02.render(self.text07, True, (128, 0, 128))

        self.render08 = font02.render(self.text08, True, (0, 128, 128))

        self.render09 = font02.render(self.text09, True, (0, 0, 128))

        self.render010 = font02.render(self.text010, True, (128, 128, 0))

    def move(self):

        if self.y01 < -50:

            self.y01 = 600

        else:

            self.y01 -= 1

        if self.y02 < -50:

            self.y02 = 600

        else:

            self.y02 -= 1

        if self.y03 < -50:

            self.y03 = 600

        else:

            self.y03 -= 1

        if self.y04 < -50:

            self.y04 = 600

        else:

            self.y04 -= 1

        if self.y05 < -50:

            self.y05 = 600

        else:

            self.y05 -= 1

        if self.y06 < -50:

            self.y06 = 600

        else:

            self.y06 -= 1

        if self.y07 < -50:

            self.y07 = 600

        else:

            self.y07 -= 1

        if self.y08 < -50:

            self.y08 = 600

        else:

            self.y08 -= 1

        if self.y09 < -50:

            self.y09 = 600

        else:

            self.y09 -= 1

        if self.y010 < -50:

            self.y010 = 600

        else:

            self.y010 -= 1

    def display(self):

        screen.blit(self.render01, (self.x01, self.y01))

        screen.blit(self.render02, (self.x02, self.y02))

        screen.blit(self.render03, (self.x03, self.y03))

        screen.blit(self.render04, (self.x04, self.y04))

        screen.blit(self.render05, (self.x05, self.y05))

        screen.blit(self.render06, (self.x06, self.y06))

        screen.blit(self.render07, (self.x07, self.y07))

        screen.blit(self.render08, (self.x08, self.y08))

        screen.blit(self.render09, (self.x09, self.y09))

        screen.blit(self.render010, (self.x010, self.y010))

goddess = Goddess()

如果嫌麻烦,也可以直接写横排文字。同样,文字对象的属性有坐标、内容、render类型,颜色自定。方法也是有移动和显示。然后到这里,程序就写完了。

4最终效果

完整代码如下:

import pygame

from pygame import *

pygame.init()

fps = 60

fpsClock = pygame.time.Clock()

icon = pygame.image.load('resource/h-2.JPG')

love = pygame.image.load('resource/爱心.png')

font01 = pygame.font.Font('resource/繁星糖果.ttf',80)

font02 = pygame.font.Font('resource/繁星糖果.ttf',50)

screen = pygame.display.set_mode((1000,600))

pygame.display.set_caption('八里公路')

pygame.display.set_icon(icon)

class LoveStar(object):

    def __init__(self,x,y):

        self.x = x

        self.y = y

    def move(self):

        if self.y < -50:

            self.y = 600

        else:

            self.y -= 1

    def display(self):

        screen.blit(love,(self.x,self.y))

class Goddess(object):

    def __init__(self):

        self.text01 = '女神'

        self.text02 = '每'

        self.text03 = '天'

        self.text04 = '都'

        self.text05 = '有'

        self.text06 = '喜'

        self.text07 = '欢'

        self.text08 = '你'

        self.text09 = '哦'

        self.text010 = '做我女朋友好吗'

        self.x01, self.y01 = 425, 150

        self.x02, self.y02 = 150, 250

        self.x03, self.y03 = 200, 300

        self.x04, self.y04 = 250, 350

        self.x05, self.y05 = 300, 400

        self.x06, self.y06 = 800, 250

        self.x07, self.y07 = 750, 300

        self.x08, self.y08 = 700, 350

        self.x09, self.y09 = 650, 400

        self.x010, self.y010 = 325, 600

        self.render01 = font01.render(self.text01, True, (128, 0, 0))

        self.render02 = font02.render(self.text02, True, (128, 128, 0))

        self.render03 = font02.render(self.text03, True, (128, 0, 128))

        self.render04 = font02.render(self.text04, True, (0, 128, 128))

        self.render05 = font02.render(self.text05, True, (0, 0, 128))

        self.render06 = font02.render(self.text06, True, (128, 128, 0))

        self.render07 = font02.render(self.text07, True, (128, 0, 128))

        self.render08 = font02.render(self.text08, True, (0, 128, 128))

        self.render09 = font02.render(self.text09, True, (0, 0, 128))

        self.render010 = font02.render(self.text010, True, (128, 128, 0))

    def move(self):

        if self.y01 < -50:

            self.y01 = 600

        else:

            self.y01 -= 1

        if self.y02 < -50:

            self.y02 = 600

        else:

            self.y02 -= 1

        if self.y03 < -50:

            self.y03 = 600

        else:

            self.y03 -= 1

        if self.y04 < -50:

            self.y04 = 600

        else:

            self.y04 -= 1

        if self.y05 < -50:

            self.y05 = 600

        else:

            self.y05 -= 1

        if self.y06 < -50:

            self.y06 = 600

        else:

            self.y06 -= 1

        if self.y07 < -50:

            self.y07 = 600

        else:

            self.y07 -= 1

        if self.y08 < -50:

            self.y08 = 600

        else:

            self.y08 -= 1

        if self.y09 < -50:

            self.y09 = 600

        else:

            self.y09 -= 1

        if self.y010 < -50:

            self.y010 = 600

        else:

            self.y010 -= 1

    def display(self):

        screen.blit(self.render01, (self.x01, self.y01))

        screen.blit(self.render02, (self.x02, self.y02))

        screen.blit(self.render03, (self.x03, self.y03))

        screen.blit(self.render04, (self.x04, self.y04))

        screen.blit(self.render05, (self.x05, self.y05))

        screen.blit(self.render06, (self.x06, self.y06))

        screen.blit(self.render07, (self.x07, self.y07))

        screen.blit(self.render08, (self.x08, self.y08))

        screen.blit(self.render09, (self.x09, self.y09))

        screen.blit(self.render010, (self.x010, self.y010))

goddess = Goddess()

lovestars = []

lovestars.append(LoveStar(475,100))

lovestars.append(LoveStar(425,75))

lovestars.append(LoveStar(375,100))

lovestars.append(LoveStar(525,75))

lovestars.append(LoveStar(575,100))

lovestars.append(LoveStar(350,150))

lovestars.append(LoveStar(600,150))

lovestars.append(LoveStar(370,200))

lovestars.append(LoveStar(580,200))

lovestars.append(LoveStar(400,250))

lovestars.append(LoveStar(550,250))

lovestars.append(LoveStar(435,300))

lovestars.append(LoveStar(515,300))

lovestars.append(LoveStar(475,340))

lovestars.append(LoveStar(100,400))

lovestars.append(LoveStar(100,500))

lovestars.append(LoveStar(900,400))

lovestars.append(LoveStar(900,500))

lovestars.append(LoveStar(100,600))

lovestars.append(LoveStar(100,700))

lovestars.append(LoveStar(900,600))

lovestars.append(LoveStar(900,700))

running = True

r,g,b = 0,0,0

while running:

    for event in pygame.event.get():

        if event.type == pygame.QUIT:

            exit()

    screen.fill((r,g,b))

    if r >= 255:

        b += 5

        r = 0

    if g >= 255:

        r += 5

        g = 0

    if b >= 125:

        b = 0

    g += 5

    for lovestar in lovestars:

        lovestar.display()

        lovestar.move()

    goddess.display()

    goddess.move()

    fpsClock.tick(fps)

    pygame.display.update()

最终的运行效果:

图4.1最终效果1

图4.2最终效果2

5总结

不知道大家看了这个表白程序有没有想表白的冲动呢?小编希望大家都能俘获自己女神的芳心。

猜你喜欢

转载自www.cnblogs.com/shannian999/p/12916372.html