自动玩一局4399钢琴小游戏
1.思路
a.准备一个自动操作的机器人
b.自动操纵鼠标点击游戏开始
b1.鼠标定位到开始按钮那一行(截图软件截到对应坐标)
b2.循环点击该行,保证开始按钮被鼠标点击到(游戏能开始)
c.当鼠标点击黑色及其渐变色块时,提示得分(在后台打印得分情况)—>游戏一直执行
当鼠标点击其他色块时,提示游戏结束,输出得分
2.每一步的具体实现过程
2.1 准备一个自动操作的机器人
Robot db=new Robot();
2.2 鼠标点击游戏开始
2.2.1 鼠标定位到开始按钮那一行(截图软件截到对应坐标)
db.mouseMove(x,y);
2.2.2 循环点击该行,保证开始按钮被鼠标点击到(游戏能开始)
//建立一个循环,就四个色块都要被点击到
for(int i=0;i<4;i++) {
Thread.sleep(3000);
//保证点击的过程能被用户看到
robot.mouseMove(x+i*step,y);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
}
2.3 点击黑色块及其渐变色块时,得分并记录下来
int temp=x+i*step;
Color c=robot.getPixelColor(temp,y);
//红色值小于30的时候,才代表着黑色块
if(c.getRed()<30) {
robot.mouseMove(temp,y);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
//每点击成功一次,就得1分
score++;
}
2.4 当鼠标点击其他色块时,提示游戏结束,输出得分
else {
System.out.println("游戏结束");
System.out.println("当前得分为:"+score);
break;
}
3.常见问题点分析
3.1 为啥在进行点击黑色色块操作外套一层死循环???
解答:因为你要游戏一直自动执行,直到你点击到了其他颜色色块
3.2 为啥当红色值(rgb值)小于30时,代表为黑色色块???
解答:因为在截颜色的过程中,发现黑色以及黑色的渐变色快中的rgb值中的r值(red)一直在30以下波动,而g值(green)和b值(blue)没有变化规律
3.3 rgb值是干嘛的???
解答:rgb值在计算机中是用来表示颜色的,其中r代表red,g代表green,b代表blue,他们的范围都是0-255,当r=0且g=0且b=0时即rgb(0,0,0)代表的是黑色,而rgb(255,255,255)代表的是白色
3.4 如何获取色块的颜色值???
Color c=robot.getPixelColor(temp,y);
//其中(temp,y)为色块的位置
3.5 为啥每次鼠标移动都要加上Thread.sleep(时间)这个方法?
解答:保证鼠标移动的过程中被观察到
3.6 如何获取色块的位置
解答: 第一步 打开微信
第二步 进入色块位置所在的界面
第三步 按下alt+A组合键获取当前色块的位置
3.7 获取的色块位置为啥不精准?
解答:电脑显示的分辨率不为100%
修改电脑分辨率的方法如下所示:
第一步,通过搜索框进入分辨率修改界面
第二步 在缩放与布局,将推荐的125%改成100%
4.源代码
package com.zking.demo;
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;
import java.awt.event.InputEvent;
public class Demo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Robot robot=new Robot();
Thread.sleep(3000);
int step=140;
int x=820;
int y=800;
int score=0;
//自动操纵鼠标点击开始,哪一个色块为开始色块未知,所以需要开始色块所占行都点击一遍
for(int i=0;i<4;i++) {
Thread.sleep(3000);
robot.mouseMove(x+i*step,y);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
}
//自动操纵鼠标玩游戏
while(true){
Thread.sleep(300);
for(int i=0;i<4;i++) {
int temp=x+i*step;
Color c=robot.getPixelColor(temp,y);
//红色值小于30的时候,才代表着黑色块
if(c.getRed()<30) {
//判断为黑色色块才移动
robot.mouseMove(temp,y);
robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);
//每点击成功一次,就得1分
score++;
}else {
System.out.println("游戏结束");
System.out.println("当前得分为:"+score);
break;
}
}
}
}
}