“QQ找茬”游戏识别很简单,只包含查找定位、定位比较和显示三部分,作者设计两个类:
1、GUI类:frmZC类,包含“定位”和“查询”两个按钮;
2、线程处理类:funChk类,实现线程序错位处理。
注:以下源码要调试务先做好程序JFrame界面,并将按钮放入JPanel并置于界面底部。
其中frmZC类源码如下:
//--------------------------------------------------------------------------------------------------------
//------------------------------frmZC开始------------------------------------------------------------
import java.awt.*;
import java.awt.image.*;
import java.util.*;
public class frmZC extends javax.swing.JFrame {
private BufferedImage tImg,tImg1;
private int locX,locY;
private int locH=286,locW=381;
private int tW=16;
private int xxF=0,xFlag=1;
//xxF 0 时 paint 不显示任何
// 1 时 paint 显示当前图片
// 其他 时 paint 显示相同图片内容,不同部分CYAN色显示
//xFlag 3 时 图片已经定位
/** Creates new form frmZC */
public frmZC() {
initComponents();
}
@Override
public void paint(Graphics g){
jpMain.setVisible(false);
DrawZC(g);
jpMain.setVisible(true);
}
// <editor-fold defaultstate="collapsed" desc="Generated Code">
private void initComponents() {
jpMain = new javax.swing.JPanel();
jbDW = new javax.swing.JButton();
jbZC = new javax.swing.JButton();
jbCZC = new javax.swing.JButton();
jtCS = new javax.swing.JTextField();
setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
setAlwaysOnTop(true);
setResizable(false);
jbDW.setText("定位");
jbDW.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jbDWMouseClicked(evt);
}
});
jbZC.setText("查找");
jbZC.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jbZCMouseClicked(evt);
}
});
jbZC.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jbZCActionPerformed(evt);
}
});
jbCZC.setText("重查");
jbCZC.setEnabled(false);
jbCZC.addMouseListener(new java.awt.event.MouseAdapter() {
public void mouseClicked(java.awt.event.MouseEvent evt) {
jbCZCMouseClicked(evt);
}
});
jbCZC.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
jbCZCActionPerformed(evt);
}
});
jtCS.setEnabled(false);
javax.swing.GroupLayout jpMainLayout = new javax.swing.GroupLayout(jpMain);
jpMain.setLayout(jpMainLayout);
jpMainLayout.setHorizontalGroup(
jpMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jpMainLayout.createSequentialGroup()
.addContainerGap()
.addComponent(jbZC, javax.swing.GroupLayout.PREFERRED_SIZE, 135, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 43, Short.MAX_VALUE)
.addComponent(jtCS, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jbCZC)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(jbDW)
.addContainerGap())
);
jpMainLayout.setVerticalGroup(
jpMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jpMainLayout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(jpMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(jbCZC)
.addComponent(jtCS, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jbDW)
.addComponent(jbZC)))
);
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
getContentPane().setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
.addContainerGap()
.addComponent(jpMain, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap())
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(316, Short.MAX_VALUE)
.addComponent(jpMain, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
pack();
}// </editor-fold>
private void jbDWMouseClicked(java.awt.event.MouseEvent evt) {
int x=10,y=150,i,j,k,l;
int t=2;
int tC[][]=new int[3][4];
try {
tImg = (new Robot()).createScreenCapture(new Rectangle(x,y,2*locW+300,locH+300));
} catch (AWTException ex) {
ex.printStackTrace();
}
for(i=0;i<locW/2;i++){
for(j=0;j<locH/2;j++){
tC[0][0]=tImg.getRGB(i, j);
tC[0][1]=tImg.getRGB(i+140, j);
tC[0][2]=tImg.getRGB(i+506, j);
tC[0][3]=tImg.getRGB(i+780, j);
tC[1][0]=tImg.getRGB(i, j+150);
tC[1][1]=tImg.getRGB(i+386, j+150);
tC[1][2]=tImg.getRGB(i+780, j+150);
tC[1][3]=tC[1][2];
tC[2][0]=tImg.getRGB(i, j+293);
tC[2][1]=tImg.getRGB(i+140, j+293);
tC[2][2]=tImg.getRGB(i+506, j+293);
tC[2][3]=tImg.getRGB(i+780, j+293);
t=2;
for(k=0;k<3;k++){
for(l=0;l<3;l++){
if(tC[k][l]!=tC[k][l+1]||tC[k][l]==tC[(k+1)%3][l]){
t=10;
k=5;
l=5;
}
}
}
if(t!=10){
t=0;
locX=i+x;
locY=j+y;
i=locW;
j=locH;
}
}
}
if(t==0){
xFlag=3;
jbZC.setEnabled(true);
}
xxF=1;
repaint();
}
private void jbZCMouseClicked(java.awt.event.MouseEvent evt) {
if(xFlag==3){
int iFlag=0;
funChk fc[]=new funChk[20];
try {
tImg = (new Robot()).createScreenCapture(new Rectangle(locX,locY,locW,locH));
} catch (AWTException ex) {
ex.printStackTrace();
}
for(tW=1;tW<=20;tW++){
try {
tImg1 = (new Robot()).createScreenCapture(new Rectangle(locX+locW+tW,locY,locW,locH));
} catch (AWTException ex) {
ex.printStackTrace();
}
fc[tW-1]=new funChk(tW,tImg,tImg1);
fc[tW-1].start();
}
tW=0;
while(true){
if(fc[tW].rst){
tW++;
xxF=2;
repaint();
jtCS.setText("0");
break;
}else{
tW++;
if(tW>=20){
iFlag++;
tW=0;
if(iFlag>500){
break;
}
}
}
}
}else{
jbZC.setEnabled(false);
}
}
private void jbCZCMouseClicked(java.awt.event.MouseEvent evt) {
// TODO add your handling code here:
if(xFlag==3){
if(tW==20){
tW=2;
}else{
tW++;
}
xxF=2;
repaint();
Integer iNN=Integer.parseInt(jtCS.getText());
iNN++;
jtCS.setText(iNN.toString());
}else{
jbCZC.setEnabled(false);
}
}
public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new frmZC().setVisible(true);
}
});
}
public void DrawZC(Graphics g){
int i,j,rgb,rgb1;
if(xxF==0){
}else if(xxF==1){
try {
tImg = (new Robot()).createScreenCapture(new Rectangle(locX,locY,locW,locH));
} catch (AWTException ex) {
ex.printStackTrace();
}
for(i=0;i<locW;i++){
for(j=0;j<locH;j++){
g.setColor(new Color(tImg.getRGB(i, j)));
g.fillRect(i+10, j+35, 1, 1);
}
}
}else{
try {
tImg1 = (new Robot()).createScreenCapture(new Rectangle(locX+locW+tW,locY,locW,locH));
} catch (AWTException ex) {
ex.printStackTrace();
}
for(i=0;i<locW;i++){
for(j=0;j<locH;j++){
rgb=tImg.getRGB(i, j);
rgb1=tImg1.getRGB(i, j);
if(rgb==rgb1){
g.setColor(new Color(rgb1));
}else{
g.setColor(Color.CYAN);
}
g.fillRect(i+10, j+35, 1, 1);
}
}
}
}
// Variables declaration - do not modify
private javax.swing.JButton jbCZC;
private javax.swing.JButton jbDW;
private javax.swing.JButton jbZC;
private javax.swing.JPanel jpMain;
private javax.swing.JTextField jtCS;
// End of variables declaration
}
//-------------------------------------frmZC结束--------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------
funChk类源码如下:
//-----------------------------------------------------------------------------------------------------------------
//------------------------------funChk开始--------------------------------------------------------------------
import java.awt.image.BufferedImage;
/**
*
* @author Minli
*/
public class funChk extends Thread {
public boolean rst;
private int iFlag;
private BufferedImage tImg,tImg1;
public funChk(int i,BufferedImage Img,BufferedImage Img1 ){
iFlag=i;
rst=false;
tImg=Img;
tImg1=Img1;
}
@Override
public void run(){
int i,j,rgb,rgb1,s=0,locW=tImg.getWidth(),locH=tImg.getHeight();
int N=locW*locH/8;
rst=false;
for(i=0;i<locW;i+=2){
for(j=0;j<locH;j+=2){
rgb=tImg.getRGB(i, j);
rgb1=tImg1.getRGB(i, j);
if(rgb==rgb1){
s++;
if(s>N){
rst=true;
j=locH+1;
i=locW+1;
}
}
}
}
}
}
//---------------------funChk结束-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------------