1前言
众所周知,5月20日为“520”情人节,这一天也是即将到来,大家都希望与自己的男神女神过一个浪漫的情人节。但是还有很多像小编这样的单身狗,不知道如何向自己的男神女神表达心意,所以今天小编就教大家用代码的方式给你的那个她(他)表白。
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总结
不知道大家看了这个表白程序有没有想表白的冲动呢?小编希望大家都能俘获自己女神的芳心。
这个程序并不难,只是代码比较麻烦,当然你还可以继续编写,让这个程序更好看。如果大家对这些有趣的程序比较感兴趣,就下周同一时间请关注号内文章,届时,小编还会给大家带来有趣的程序。
END
主 编 | 王文星
责 编 | 江来洪
where2go 团队