当前位置:编程学习 > 网站相关 >>

Python实现的QQ空间3366小游戏彩色砖块的辅助工具

由于女朋友每天玩这个小游戏,每天挑战我……囧,只好写了一个辅助工具帮我自动满分,最后的结果是大家一起满分……本人不是程序员,请大家指正。
      主要使用了PIL模块和pymouse模块,一个做图像识别,另一个做自动点击,这个小工具只在我的电脑,Python2.5+XP下测试通过。
# -*- coding: utf-8 -*- 
#这是一个QQ空间3366小游戏中的彩色砖块游戏的辅助工具 
#他可以帮你自动计算一种正确的算法,保证你得200分! 
#使用时不能有任何窗口遮挡游戏界面,同时也不能做其他操作 
 
#程序基本原理: 
#彩色砖块可以看作是一个23*15的矩阵,其中有10中颜色的砖块。没有砖块的空白块填充有灰白相间的背景 
#点击其中一个空白块,则四周相同的砖块将消除,直至所有砖块消除为止 
#游戏首先截取屏幕,然后寻找边长为25的灰色块和白色块,并加上一个偏移量,从而确定矩阵的起始坐标。 
#通过获取矩阵中心点位置的颜色,确定所在位置的砖块,然后记录在一个二维列表中。 
#将所有空白块按顺序生成一个列表,随即选出一个空白块,直到找到四周有相同砖块可以点击的空白块。 
#在二维列表中进行消除,重复以上操作,将点击的空白块顺序记录在一个列表中,直到矩阵全部为空白块为止。 
#如果当还有砖块但已经找不到周围可以消除的空白块,则表示这种点击顺序不成功。然后从新计算一种点击顺序,直至成功未知。 
#最后按计算出的顺序模拟鼠标点击砖块。 
import copy 
import time 
import random 
import pymouse 
from PIL import ImageGrab 
from PIL import Image 
 
raw_input(u"输入任意键开始……".encode("gb2312")) 
#定义灰色正方形块,白色正方形块的RGB值 
gray = (237, 237, 237) 
white = (247, 247, 247) 
#定义砖块颜色 
color = { 
    1:(0, 102, 255), #蓝色 
    2:(255, 102, 102), #红色 
    3:(204, 102, 204),#紫色 
    4:(204, 102, 0), #棕色 
    5:(0, 204, 0), #绿色 
    6:(102, 204, 204),#青色 
    7:(255, 153, 0),#橙色 
    8:(187, 187, 187),#中灰 
    9:(204, 204, 102),#咖啡色 
    10:(255, 136, 255)#淡紫 
    } 
#定义方块大小 
blockSize = 25
#定义游戏方块矩阵的大小 
gameSize = [23, 15] 
 
#屏幕截图 
#screen = Image.open("screen.bmp") #用来测试的截图 
screen = ImageGrab.grab() 
#获得屏幕像素矩阵 
xy = screen.load() 
#遍历每一个像素,发现RGB值等于gray的像素时,检查他的右24和下24像素是否为gray 
#灰色块 
print u"正在获取游戏起始坐标……"
isGray = False
#白色块 
isWhite = False
for y in xrange(screen.size[1]): 
    for x in xrange(screen.size[0]): 
        if xy[x, y] == gray: 
            #查右24个像素RGB值为gray的像素,不是则继续找 
            for i in xrange(blockSize): 
                try: 
                    if xy[x+i, y] == gray: 
                        isGray = True
                    else: 
                        isGray = False
                        break
                except IndexError: 
                        isGray = False
                        break
 
            if isGray == True: 
                #检查前一个像素和后第25个像素的RGB是否为white 
                if xy[x-1, y] == white and xy[x+blockSize, y] == white: 
                    isWhite = True
 
        if isWhite == True: break
    if isWhite == True: break
 
#定义游戏操作区的开始坐标 
gamePos = [x+10, y+31+10] 
#记录砖块状况的二维数组 
array = [] 
for y in xrange(gameSize[1]): 
    xArray = [] 
    for x in xrange(gameSize[0]): 
        #获得砖块RGB值 
        blackRGB = xy[gamePos[0]+blockSize*x, gamePos[1]+blockSize*y] 
        #如果砖块RGB值为gray, white,则此二维坐标为空 
        if blackRGB in [gray, white]: 
            xArray.append(0) 
        else: 
            for key in color: 
                if color[key] == blackRGB: 
                    xArray.append(key) 
                    break
    array.append(xArray) 
#复制array,用于以后重复寻找正确的点击顺序 
ar = copy.deepcopy(array) 
 
#检查一个空白点周围4边的色块,返回一个包含边界色块坐标的列表 
def check(x, y): 
    border = [] 
    #前 
    i = 0
    while True: 
        i = i+1
        z = y-i 
        if z in [-1, 23]: 
            break
        if array[x][z] != 0: 
            border.append([x, z]) 
            break
    #后 
    i = 0
    while True: 
        i = i+1

补充:Web开发 , Python ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,