pygame实现找方块(色彩敏感度测试)游戏

前言

某人最近在手机上玩起了找方块游戏,给我发了好几个截图皮我,挺考验颜色辨别能力的,看得我眼都花了。游玩之余我产生了一个大胆的想法,这个游戏好像用Python来写应该不难,网上都是俄罗斯方块、战机、贪吃蛇、2048这类主题,还没人写过这个找方块,那我就写个试试。

ps: 就这个,看得在下头晕目眩。
在这里插入图片描述

编程构思

游戏主要结构设想

  1. 游戏区域拟定为正方形区域,填充底色,每回合底色会随机改变。
  2. 再随机生成一个颜色稍亮的小方块区域,我们只有正确点到小方块区域内才能过关。
  3. 为了增加难度,可以设定生命值或者倒计时之类的限制条件。

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循环里,我们要设定获取鼠标左键的操作,右键或者滚轮的操作忽略,然后对参数进行判断,执行相应的操作。

待改进的地方

  1. 文字刷新会重叠,还没搞得清怎么把上一次显示的文字删掉。只好给文字设定了背景色,每次刷新文字就把前一次的覆盖掉。
  2. 可以再整一个开始界面,不用一上来直接开始。
  3. 再做一个附带重新游玩按钮的结束界面。

完整代码

我用的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()

游戏截图

在这里插入图片描述

以上就是一个简单的找方块小游戏,靓仔你学废了吗?快和小伙伴们一起玩玩吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值