前言
某人最近在手机上玩起了找方块游戏,给我发了好几个截图皮我,挺考验颜色辨别能力的,看得我眼都花了。游玩之余我产生了一个大胆的想法,这个游戏好像用Python来写应该不难,网上都是俄罗斯方块、战机、贪吃蛇、2048这类主题,还没人写过这个找方块,那我就写个试试。
ps: 就这个,看得在下头晕目眩。
编程构思
游戏主要结构设想
- 游戏区域拟定为正方形区域,填充底色,每回合底色会随机改变。
- 再随机生成一个颜色稍亮的小方块区域,我们只有正确点到小方块区域内才能过关。
- 为了增加难度,可以设定生命值或者倒计时之类的限制条件。
pygame
说起图形界面类的Python库,一下就想到tk、pyqt、pygame,之前都随便写了点小程序玩,个人觉得前两个做那种按钮文本界面比较合适,游戏类的还是选择pygame,这也是非常有名的一个Python游戏库。
random
random模块肯定是要使用的,随机操作都靠它了。
颜色设定
每回合界面都会刷新成不同的颜色,那颜色一般都是RGB,有三个参数,我打开了PS的调色板,看看这个随机颜色该怎么写。
我把取色器移动到右上角,然后把色标从上往下拉,观察RGB三个参数的变化,找到了规律:
R、G、B三个数字中一定有一个255、一个0,还有一个在0-255之间变换。
我就用random库里的函数,定义一个列表存0、255和0-255的随机数,然后随机顺序抽取,变成元组,就成了每次背景的RGB颜色了。
不光有背景颜色,还有上面要点击的方块颜色,方块颜色是比背景色亮一点点的。
写代码对RGB三个参数做加减控制固定的亮度变化貌似不太容易,也没找到什么规律,不如就在界面上蒙上一个半透明的白色方块,这样覆盖的部分不就颜色变亮了嘛。
方块的坐标在左上角,我们根据方块尺寸还有界面大小,定义一下方块位置的范围。
整体流程
先把界面定义好,初始化,然后各个参数定义好。
我设定有10个等级,1个等级10个回合,每过1回合加10分,满100分升1级,也就是加到1000分就通关了。
每升1级肯定是要提高难度的,我们把pygame中设定半透明的参数alpha减10,这样要找的方块就越来越不明显不好找了。
再限定点错的次数,每次游戏只给3条命,如果第4次点错,游戏结束。
我们定义3个函数,分别是刷背景、刷方块、刷文本(显示生命、等级、得分)。
每次成功过关,背景、方块和文本都会刷新,但如果操作错误,只会刷新文本,显示生命值减少。
pygame是依靠循环刷新机制的,在While循环里,我们要设定获取鼠标左键的操作,右键或者滚轮的操作忽略,然后对参数进行判断,执行相应的操作。
待改进的地方
- 文字刷新会重叠,还没搞得清怎么把上一次显示的文字删掉。只好给文字设定了背景色,每次刷新文字就把前一次的覆盖掉。
- 可以再整一个开始界面,不用一上来直接开始。
- 再做一个附带重新游玩按钮的结束界面。
完整代码
我用的Python 3.7.3+PyCharm2020开发,pygame版本2.0.0。
import pygame, sys
from pygame.locals import *
import random
def change_color():
color = tuple(random.sample([0,255,random.randint(0,255)],3))
s = pygame.Surface((400,400),pygame.SRCALPHA)
s.fill(color)
screen.blit(s,(0,50))
def make_rec():
global x
global y
global alpha
x = random.randint(0,361)
y = random.randint(50,411)
aim = pygame.Surface((40,40),pygame.SRCALPHA)
aim.fill((255,255,255,alpha))
screen.blit(aim,(x,y))
# 测试用的作弊器
# cheater = pygame.Surface((20,20))
# cheater.fill((255,255,255))
# screen.blit(cheater,(x+10,y+10))
def refresh_text():
global level
global score
global round
lifetext = font1.render('Life: ' + str(life), False, (255, 255, 255), (0,0,0))
leveltext = font1.render('Level:' + str(level) + '-' + str(round) + ' ', False, (255, 255, 255), (0,0,0))
scoretext = font2.render('Score:' + str(score), False, (255, 255, 255), (0,0,0))
screen.blit(lifetext,(0,0))
screen.blit(leveltext, (0, 25))
screen.blit(scoretext, (210, 10))
if __name__ == '__main__':
pygame.init()
screen = pygame.display.set_mode((400, 450))
window = pygame.display.set_caption('Python找方块')
life = 3 # 允许错误次数
score = 0 # 得分
alpha = 100 # 透明度
level = 1 # 等级
round = 1 # 回合
font1 = pygame.font.SysFont('Courier', 20)
font2 = pygame.font.SysFont('Courier', 30)
font3 = pygame.font.SysFont('Courier', 40)
refresh_text()
change_color()
make_rec()
pygame.display.flip()
while True:
if score == 1000:
text = font3.render('Congratulations!', False, (255, 255, 255), (0, 0, 0))
screen.blit(text, (8, 220))
pygame.display.update()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
pygame.quit()
sys.exit()
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
elif event.type == MOUSEBUTTONDOWN:
if pygame.mouse.get_pressed() == (1,0,0):
pos = pygame.mouse.get_pos()
if x <= pos[0] <= x+40 and y <= pos[1] <= y+40:
change_color()
make_rec()
score += 10
round += 1
refresh_text()
pygame.display.update()
else:
life -= 1
if life >= 0:
refresh_text()
pygame.display.update()
else:
pygame.quit()
sys.exit()
# 升级
if score%100 == 0 and score > 0:
alpha -= 10
level += 1
round = 1
refresh_text()
pygame.display.update()
游戏截图
以上就是一个简单的找方块小游戏,靓仔你学废了吗?快和小伙伴们一起玩玩吧!