python连连看小游戏_连连看小游戏

news/2024/11/30 9:48:48/

python制作连连看外挂

前几天看到github上的用python写的连连看外挂,最近几天一直在琢磨这个事情,昨天晚上弄到凌晨两点,终于把程序全部调通了,其中的关键部分算法全部重新写了一遍,其实原理非常简单。程序启动时,会自动从屏幕中进行截屏,找到连连看游戏窗口的起始坐标,根据坐标偏移,然后找到连连看的游戏区域.连连看最多可以放置的图片为19*11张。

按照约定图片的大小,游戏区域全部切分为31*35的小图片,然后将小图片按照不同的类别进行标记,具体的标记算法可以看源代码。我们设定empty背景为基准图片,然后计算所有图片与基准图片的像素之差的曼哈顿距离之和,按照距离的数值进行类别划分,且我们标记empty图片的类别为0。

将图片转换为标记矩阵后,我们就可以根据我们之前所知道的识别算法,来找到矩阵中的所有配对的坐标,然后驱动鼠标进行点击连接即可。

视频如下:

源代码: github地址:

import sys, time

import math, random

import cv2

import win32api

import win32gui

import win32con

from PIL import ImageGrab

import time

WINDOW_TITLE = "QQ游戏 - 连连看角色版"

MARGIN_LEFT = 14

MARGIN_HEIGHT = 181

COL_NUM = 19

ROW_NUM = 11

SQUARE_WIDTH = 31

SQUARE_HEIGHT = 35

SUB_LT_X = 4

SUB_LT_Y = 4

SUB_RB_X = 25

SUB_RB_Y = 29

CLICK_POS_X = 15

CLICK_POS_Y = 18

def TIME_INTERVAL():

return 0.001

#return 0.375+random.uniform(-0.075, 0.075)+0.13*progress

def TIME_INTERVAL_1():

return 0.001

#return 0.375+random.uniform(-0.075, 0.075)

def getGameWindowPosition():

window = win32gui.FindWindow(None, WINDOW_TITLE)

while not window:

print('unable to find window, try in 3 secs...')

time.sleep(3)

window = win32gui.FindWindow(None, WINDOW_TITLE)

win32gui.SetForegroundWindow(window)

pos = win32gui.GetWindowRect(window)

print("Window found at:" + str(pos))

return pos[0], pos[1]

def getScreenImage():

print('capturing screenshot...')

scim = ImageGrab.grab()

scim.save('screen.png')

return cv2.imread("screen.png")

def getAllSquare(screen_image, game_pos):

print('cutting pics...')

game_x = game_pos[0] + MARGIN_LEFT

game_y = game_pos[1] + MARGIN_HEIGHT

all_square = []

print("width:",len(screen_image))

print("height:",len(screen_image[0]))

for x in range(0, COL_NUM):

for y in range(0, ROW_NUM):

square = screen_image[game_y + y*SQUARE_HEIGHT:

game_y + (y+1)*SQUARE_HEIGHT,

game_x + x*SQUARE_WIDTH:

game_x + (x+1)*SQUARE_WIDTH]

all_square.append(square)

return list(map(lambda square:

square[SUB_LT_Y:SUB_RB_Y, SUB_LT_X:SUB_RB_X], all_square))

def subImageSquare(img1,img2):

res = 0

for i in range(len(img1)):

for j in range(len(img1[0])):

res += abs(int(img1[i][j][0]) - int(img2[i][j][0])) + \

abs(int(img1[i][j][1]) - int(img2[i][j][1])) + \

abs(int(img1[i][j][2]) - int(img2[i][j][2]))

return res

def getAllImageTypes(all_square):

print("sorting pics...")

empty_img = cv2.imread('empty.png')

types = set([0])

for square in all_square:

types.add(subImageSquare(empty_img,square))

return sorted(list(types))

def generateMatrix(all_square,imgTypes):

mat = []

empty_img = cv2.imread('empty.png')

for square in all_square:

diff = subImageSquare(empty_img,square)

for i in range(len(imgTypes)):

if diff == imgTypes[i]:

mat.append(i)

return mat

def checkConnect(x,y,mat):

width = COL_NUM

height = ROW_NUM

if x[0] < 0 or x[1] < 0 or x[0] >= width or x[1] >= height or\

y[0] < 0 or y[1] < 0 or y[0] >= width or y[1] >= width:

return False

if x[0] != y[0] and x[1] != y[1]:

return False

#check row

if x[0] == y[0]:

for i in range(min(x[1],y[1])+1,max(x[1],y[1])):

if mat[x[0]*height+i] > 0:

return False

#check colum

if x[1] == y[1]:

for i in range(min(x[0],y[0])+1,max(x[0],y[0])):

if mat[i*height+x[1]] > 0:

return False

return True

def isCanLink(x,y,mat):

width = COL_NUM

height = ROW_NUM

#check same value

if mat[x[0]*height+x[1]] != mat[y[0]*height+y[1]]:

return False

#one step check

if checkConnect(x,y,mat):

return True

#two step check

if mat[x[0]*height+y[1]] == 0:

if checkConnect(x,(x[0],y[1]),mat) and \

checkConnect((x[0],y[1]),y,mat):

return True

if mat[y[0]*height+x[1]] == 0:

if checkConnect(x,(y[0],x[1]),mat) and \

checkConnect((y[0],x[1]),y,mat):

return True

#three step check

for i in range(0,height):

if mat[x[0]*height+i] == 0 and mat[y[0]*height+i] == 0:

if checkConnect(x,(x[0],i),mat) and \

checkConnect((y[0],i),y,mat) and \

checkConnect((x[0],i),(y[0],i),mat):

return True

for i in range(0,width):

if mat[i*height+x[1]] == 0 and mat[i*height+y[1]] == 0:

if checkConnect(x,(i,x[1]),mat) and \

checkConnect((i,y[1]),y,mat) and \

checkConnect((i,x[1]),(i,y[1]),mat):

return True

def autoMouseClick(pos,delay = 0.001):

win32api.SetCursorPos((pos[0],pos[1]))

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,pos[0],pos[1], 0, 0)

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,pos[0],pos[1],0,0)

time.sleep(TIME_INTERVAL())

def autoRemove(mat,game_pos):

game_x = game_pos[0] + MARGIN_LEFT

game_y = game_pos[1] + MARGIN_HEIGHT

width = COL_NUM

height = ROW_NUM

remove = 0

for i in range(width):

for j in range(height):

if mat[i*height+j] > 0:

remove += 1

while remove > 0:

for i in range(len(mat)):

for j in range(len(mat)):

if i != j and mat[i] == mat[j] and mat[i] > 0:

px = (i//height,i%height)

py = (j//height,j%height)

if isCanLink(px,py,mat):

x1 = game_x + px[0]*SQUARE_WIDTH

y1 = game_y + px[1]*SQUARE_HEIGHT

x2 = game_x + py[0]*SQUARE_WIDTH

y2 = game_y + py[1]*SQUARE_HEIGHT

pos_x = (x1+CLICK_POS_X,y1+CLICK_POS_Y)

pos_y = (x2+CLICK_POS_X,y2+CLICK_POS_Y)

autoMouseClick(pos_x)

autoMouseClick(pos_y)

mat[i] = 0

mat[j] = 0

remove -= 2

print(px,py)

print("remove one pair:",pos_x,pos_y)

if __name__ == '__main__':

game_pos = getGameWindowPosition()

time.sleep(1)

screen_image = getScreenImage()

all_square_list = getAllSquare(screen_image, game_pos)

imgTypes = getAllImageTypes(all_square_list)

mat = generateMatrix(all_square_list,imgTypes)

autoRemove(mat,game_pos)


http://www.ppmy.cn/news/622071.html

相关文章

java连连看代码_java实现连连看游戏

本文实例为大家分享了java实现连连看游戏的具体代码,供大家参考,具体内容如下 代码会实现共享的,这个是截图 代码: package com.lr.bean; import java.util.Scanner; import java.util.Random; import com.lr.bean.Point; public class Link{public static void main(Strin…

基于QT实现简单的连连看小游戏

资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/85788216 资源下载地址&#xff1a;https://download.csdn.net/download/sheziqiong/85788216 简单的连连看小游戏。 整体流程 实现思路&#xff1a; 定义游戏模型类和游戏窗口类&#xff0c;使用按…

基于Java+Swing实现连连看游戏

基于JavaSwing实现连连看游戏 一、系统介绍二、功能展示三、其它1.其他系统实现 一、系统介绍 基本功能包括&#xff1a;消除模块&#xff0c;重新开始模块&#xff0c;刷新模块&#xff0c;选择难度模块&#xff0c;计时模块。本系统结构如下&#xff1a; &#xff08;1&…

MATLAB连连看小游戏

这是一款MATLAB连连看小游戏&#xff0c;基本实现了连连看的功能&#xff0c;不过目前没有写出死局判定的模块&#xff0c;日后可能会对其进行改进。 目录 游戏截图游戏组装说明完整代码其他说明后记 游戏截图 游戏组装说明 我们的变量path输入的是图像包的相对路径或绝对路径…

使用JAVA开发连连看游戏

技术&#xff1a;Java等摘要&#xff1a;随着社会节奏的加快&#xff0c;平常工作的竞争强度也加大&#xff0c;生活的压力也跟着加重&#xff0c;所以休息时或下班后大家都需要个休闲的娱乐工具&#xff0c;来放松自己&#xff0c;缓解自己的压力&#xff0c;消除紧张的疲劳状…

PPT课件实现连连看游戏——简单好用

想做个羊了个羊地理课件&#xff0c;讨论了下需求&#xff0c;还是连连看吧 先看眼效果图 一、先加载背景 找到草地图片&#xff0c;根据图中顺序&#xff0c;将绿地设为背景 二、制作图标 其实我是用希沃白板做的图标&#xff0c;用ppt其实也很简单&#xff0c;图片的叠…

基于JavaSwing的连连看游戏的设计与实现

目录 摘 要 1 Abstract 2 目录 2 绪论 1 1.1. 课题背景 1 1.2. Java游戏开发的现状 1 1.2.1. Java日益趋向成熟 1 1.2.2. Java极大的方便了游戏脚本的使用 2 1.2.3. Java平台无关特性 2 1.2.4. Java在手机游戏开发方面的优势 2 1.2.5. Java在网络方面的良好表现 2 1.2.6. 游戏…

Java实现连连看源代码文档_JAVA实现连连看游戏

文件名大小更新时间 JAVA实现连连看游戏\java连连看游戏设计介绍 幻灯片.pptx22697322018-06-09 JAVA实现连连看游戏\源代码\JAVA连连看游戏设计 源代码\.classpath3012018-01-07 JAVA实现连连看游戏\源代码\JAVA连连看游戏设计 源代码\.project4182018-01-07 JAVA实现连连看游…