文/IT可达鸭

图/IT可达鸭、网络

前言

还记得几年前非常火的一个科学真人秀节目《最强大脑》吗?它的第一个挑战项目是魔方墙,魔方墙长什么样子?它有哪些规则?

首先,它是一个“找茬游戏”的升级版,就是从两幅一样魔方墙中,找出其中不一样的色块所在的位置

为了方便大家更清楚的认识这个游戏,我们就称它为“魔方墙找茬”游戏。(看到这里的朋友,不要着急哈,认真看下去,最后有彩蛋。)

最强大脑数学训练方法(让最强大脑运动起来)(1)

图片来自网络

魔方墙找茬

其实,我们普通人经过训练,也可以做到从两面魔方墙中寻找到不一样的色块。那么该怎么做呢?

我们先从基础做起,先来个简单版的“魔方墙找茬”。

最强大脑数学训练方法(让最强大脑运动起来)(2)

初级魔方墙找茬

是不是非常简单,只要一眼扫过去,就能发现第三行,第四列的色块不一样。

最强大脑数学训练方法(让最强大脑运动起来)(3)

中级魔方墙找茬

这个时候,就没那么简单了。那有的朋友就说,只要我细心,就一定可以看出来。是的,一行一行地扫描下来,细心的朋友会发现,最后一行,第六列的色块不一样。

最强大脑数学训练方法(让最强大脑运动起来)(4)

高级魔方墙找茬

这个花时间去看容易看花,那么我们就应该重新审视这个游戏,寻找一个可以解决的可靠方法。

不过,在此之前,你可能会问,我想研究“魔方墙找茬”,但是这个“魔方墙找茬”游戏去哪里下载呀?

不用担心,小编刚好会一点点编程,给你写一个魔方墙找茬的游戏软件,来,直接上代码。

python版本: 3.6.0

编辑器: pycharm

项目所需要的环境安装包

pip install numpy pip install opencv-python

要先安装numpy,再安装opencv-python

# encoding:utf-8 import cv2 import numpy as np import random color_list = [(255, 0, 0), (0, 255, 0), (0, 0, 255), (255, 255, 0), (0, 255, 255), (255, 0, 255)

cv2: 是一个强大的图像处理库 opencv, 据说人脸识别、视频处理等操作都可以做到

numpy: 是一个扩展包,支持大量的维度数组与矩阵运算,包含大量数学函数。

color_list: 是魔方墙找茬游戏的出现的所有色块,这里小编只给了六种颜色,大家可以根据自己的需求,增加新的颜色,颜色越多,难度越大哟。

最强大脑数学训练方法(让最强大脑运动起来)(5)

def show_mixed(row, col, min_cube_size, windows_name = 'bgr_img'): """ 展示两个颜色矩阵 :param row: :param col: :param windows_name: :return: """ img = np.ones((min_cube_size*row, min_cube_size*col), dtype=np.uint8) img2 = np.ones((min_cube_size * row, min_cube_size * col), dtype=np.uint8) bgr_img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) bgr_img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR) for i in range(row): tmp_row_start, tmp_row_end = i * min_cube_size, (i 1) * min_cube_size for j in range(col): tmp_col_start, tmp_col_end = j * min_cube_size, (j 1) * min_cube_size tmp_color = random.choice(color_list) # 随机选一个颜色 bgr_img[tmp_row_start:tmp_row_end, tmp_col_start:tmp_col_end] = tmp_color bgr_img2[tmp_row_start:tmp_row_end, tmp_col_start:tmp_col_end] = tmp_color # 随机选一个坐标 x, y = random.randint(0, row-1), random.randint(0, col-1) tmp_row_start, tmp_row_end = x * min_cube_size, (x 1) * min_cube_size tmp_col_start, tmp_col_end = y * min_cube_size, (y 1) * min_cube_size while True: tmp_color = random.choice(color_list) # 随机选一个颜色 if bgr_img2[tmp_row_start 5, tmp_col_start 5][0] == tmp_color[0] and \ bgr_img2[tmp_row_start 5, tmp_col_start 5][1] == tmp_color[1] and \ bgr_img2[tmp_row_start 5, tmp_col_start 5][2] == tmp_color[2]: continue else: bgr_img2[tmp_row_start:tmp_row_end, tmp_col_start:tmp_col_end] = tmp_color break cv2.imshow(windows_name "01", bgr_img ) cv2.imshow(windows_name "02", bgr_img2 ) return x 1, y

利用numpy矩阵切片操作,给每个色块进行上色。同时利用随机函数,随即选定一个坐标,藏入找茬游戏的答案。

最强大脑数学训练方法(让最强大脑运动起来)(6)

if __name__ == '__main__': grade_dict = {"超简单":5, "简单": 15, "中等": 30, "难": 60} # 魔方墙的大小 cube_size_dict = {"超简单":40, "简单":25, "中等": 18, "难": 15} # 每个色块的像素大小 grade_name = '中等' x, y = show_mixed(grade_dict[grade_name], grade_dict[grade_name], cube_size_dict[grade_name], 'bg_01') print( "x=%d, y=%d" % (x, y) ) cv2.waitKey(

在主函数中,自定义难度参数,这里因为屏幕大小的限制,我把最难的设置为60*60的色块魔方墙。如果你的屏幕够大,可以设置成《最强大脑》里的魔方墙尺寸。

最强大脑数学训练方法(让最强大脑运动起来)(7)

至此,生成魔方墙的软件就做好了,你可以随时生成多个“魔方墙找茬”的图,进行训练。

结语

最后,相信很多朋友会问,有什么方法可以快速找到答案?其实,很简单,使用裸眼3D眼。就是小时候大家经常玩的“斗鸡眼”。

使用“3D”眼,把两幅图重叠在一起,刚开始的时候,会比较模糊,这个时候需要盯住,图片慢慢清晰起来。这时候,你会发现“魔方墙”中有一个色块一直在闪,而这个色块,就是你要找的答案。


如果有疑问想获取源码,可以关注后,在后台私信我,回复:python魔方墙。 我把源码发你。持续关注"IT可达鸭"每天除了分享有趣Python源码,还会介绍NLP算法。最后,感谢大家的阅读,祝大家工作生活愉快!

,