找不到“妹”字在哪?一款游戏看把你愁的,用我这个代码逻辑,不再被游戏困扰!

简介: 找不到“妹”字在哪?一款游戏看把你愁的,用我这个代码逻辑,不再被游戏困扰!

项目需求


  翻遍了4399小游戏网站,发现一款考察“眼力”的游戏:“找妹子”。这款游戏的游戏目标是用最短的时间找到所有妹字,游戏的具体内容为在众多字中找到唯一的字。


  现在需要一套程序,该程序需要完成自动寻找一堆袜字中的妹字并点击该字的坐标。




需求分析


  实验着玩“找妹字”游戏,我顺手随便截取了几张游戏时候的画面(如下罗列所示:),对游戏画面分析可得如下信息:


  1. 游戏界面size基本保持一致(看起来不是这样的因为我截图时候手残);


  1. 每次的字体的底色都是白色,外界颜色却不一样;


  1. 妹和袜字的字体是一样的;


  1. 妹和袜字的字体大小也是一样的;


  1. 每一关出现的字的总数也都不一样;


  1. 每次的妹字出现方式为随机出现。


image.png

  总结上述的游戏逻辑与游戏画面的分析就很清楚了我们需要怎样去实现如何找到“妹”字了。


逻辑步骤:


  1. 截取当前屏幕图像(获取源数据);


  1. 直接对截屏图像进行裁剪,裁剪出边界银色的方框(因为游戏界面size不变);


  1. 提取出白底的妹与袜字;


  1. 对提取出来的字进行归一化到相同大小的size;


  1. 对提取出来的字进行对比,得到与“妹”字相同的字并记录位置;


  1. 鼠标点击一次输出的位置


  需要注意的是这里我们需要添加一个触发机制:只有当指定按键被按下时才执行“找妹字”辅助,因为这游戏不是打地鼠,可以在同一个位置重复点击。




实验调试


  构建从上述中的逻辑步骤的第3步获取汉字:从这个里面能够获取到核心的几个汉字,但是多了一个图像,这里可以暂时先不用理会,我们可以在后续归一化计算相似度剔除(明显和妹字不一样,这样只是增加了计算量)

image.png

import cv2
import numpy as np
# 输入灰度图,返回hash
def getHash(image):
    avreage = np.mean(image)  # 计算像素平均值
    hash = []
    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            if image[i, j] > avreage:
                hash.append(1)
            else:
                hash.append(0)
    return hash
# 计算汉明距离  计算相似度越大越不相似
def Hamming_distance(hash1, hash2):
    num = 0
    for index in range(len(hash1)):
        if hash1[index] != hash2[index]:
            num += 1
    return num
img = cv2.imread("3.png")
# 灰度化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
h, w = gray.shape[:2]
m = np.reshape(gray, [1, w * h])  # 降维
mean = m.sum() / (w * h)  # 求均值
_, thresh1 = cv2.threshold(gray, mean, 255, cv2.THRESH_BINARY)  # 利用均值进行图像二值化
# 查找轮廓
_, contours, hierarchy = cv2.findContours(thresh1, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)
# 绘制轮廓
img2 = img.copy()
cv2.drawContours(img2, contours, -1, (0, 0, 255), 0)
# 记录裁剪的坐标 ,裁剪图像的时候使用
list_coor = []
# 计算轮廓面积
for i in range(len(contours)):
    if i == 0:
        continue
    area = cv2.contourArea(contours[i])
    if area > 3000 and area < 5000:
        rect = cv2.minAreaRect(contours[i])
        box = cv2.boxPoints(rect)
        box = np.int0(box)
        list_coor.append(box)
# 要进行对比的图像
Image = cv2.imread('mei.jpg')
# 灰度化
Image = cv2.cvtColor(Image, cv2.COLOR_BGR2GRAY)
hash_1 = getHash(Image)
# 随便设置一个大值
error = 100000.0
error_coor = []
# 计算分割好的图像hash
for i in range(len(list_coor)):
    x, y = list_coor[i][1]
    x1, y1 = list_coor[i][3]
    img_temp = gray[min(x, x1):max(x, x1), min(y, y1):max((y, y1))]
    img_temp = cv2.resize(img_temp, (80, 80))
    cv2.imwrite("./img/%s.jpg" % i, img_temp)
    hash_2 = getHash(img_temp)
    ret = Hamming_distance(hash_1, hash_2)
    # print(ret)
    if ret < error:
        error = ret
        error_coor.clear()
        error_coor.append([min(x, x1), max(x, x1)])
        error_coor.append([min(y, y1), max(y, y1)])
        print(ret)
print(error_coor)  # [array([146, 144]), array([215,  74])]
x, y = error_coor[0]
x1, y1 = error_coor[1]
cv2.rectangle(img, (x, y), (x1, y1), (0, 0, 255), 3)
cv2.imshow('paper', img)
cv2.waitKey(0)



相关文章
|
2月前
|
移动开发 JavaScript C#
总有一个是你想要的分享31个游戏源代码
该资源分享了31款游戏源代码,包括C#版植物大战僵尸、HTML5版五子棋等,均经过亲测可运行。下载链接中还包含13款游戏源码,适合游戏开发者和爱好者学习参考。作者辛苦整理,希望得到您的点赞与关注作为支持。
99 1
|
6月前
|
前端开发 JavaScript 程序员
程序员教你用代码制作3d爱心跳动特效,正好拿去送给女神给她个惊喜
使用HTML、CSS和JavaScript实现了一个三维网格采样器`MeshSurfaceSampler`,适用于任意浏览器,推荐谷歌。代码创建了一个类,从缓冲几何体的三角形网格中进行随机采样。提供了设置权重属性、构建分布和自定义随机数生成器的功能。用户只需将代码复制到文本文档并保存为HTML文件,即可运行。适合编程爱好者尝试,也可分享给他人。
218 1
|
5月前
|
前端开发 JavaScript
综合案例(前端代码练习):猜数字和表白墙
综合案例(前端代码练习):猜数字和表白墙
43 0
|
6月前
|
移动开发 JavaScript C#
分享31个游戏源代码总有一个是你想要的
分享31个游戏源代码总有一个是你想要的
188 0
|
6月前
|
开发者
当做的游戏没人玩时,还要不要继续做下去了
当做的游戏没人玩时,还要不要继续做下去了
38 0
|
存储 区块链
无聊猿大逃杀游戏卷轴模式系统开发逻辑步骤
区块链的去中心化,数据的防篡改,决定了智能合约更加适合于在区块链上来实现
|
Java 程序员 开发者
只用一行代码,你能玩出什么花样?
只用一行代码,你能玩出什么花样?
95 1
|
小程序 开发工具
彻底搞清微信小游戏开发中的循环的使用
本文主要内容为游戏开发中常用的循环的使用方法。 如果你没有任何的游戏开发经验,欢迎阅读我的“人人都能做游戏”系列教程,它会手把手的教你做出自己的第一个小游戏。
177 0
|
Java
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏13之英雄不要走出屏幕
手把手一步一步教你使用Java开发一个大型街机动作闯关类游戏13之英雄不要走出屏幕
140 0
|
Java 数据库连接 Spring
参数校验别再写满屏的 if/else 了,差点被劝退……(上)
参数校验别再写满屏的 if/else 了,差点被劝退…(上)
122 0
参数校验别再写满屏的 if/else 了,差点被劝退……(上)