像这种图片怎么查找颜色相同的组件,找到相同的了,怎么才能知道颜色相同的方块是否相邻,像这种
我现在的方案是:先创建5个不同颜色的color对象(这张图片只有4中颜色,没次运行方块的颜色不一样。设置的概率的。),然后坐标查询每个方块的颜色,返回的颜色和出创建的颜色对象作比较,和color对象相同的颜色分别用0--4(0红色,1黄色,2绿色,3蓝色,4紫色)表示,之后就用一个长度为16的二维数组装起,这样就得到了每个坐标的颜色。数组里面的值为:1312003010320012。这个一维数组代表的是4x4的格子中颜色。我的难题就是怎么判断相同的数字相邻。
如果有这个问题解决办法或者有更好的算法请帮忙解答一下。
这个是图形代码,负责创建容器和创建排列组件:
package zhuJie_MB;
import java.awt.Color;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import suanFa.XiaoChu_SF;
public class Zhumianban_JM{
public static JFrame jFrame;
public static JButton[] jb=new JButton[16];
public static void main(String[] args) {
Zhumianban_JM zh=new Zhumianban_JM();
zh.zhuJianMian();
XiaoChu_SF jj=new XiaoChu_SF();
jj.suan();
}
public void zhuJianMian() {
Random r=new Random();
jFrame=new JFrame("糖果Party");
jFrame.setBounds(100,50,1000,600);
jFrame.setLayout(null);
final Color red=new Color(255,0,0);//设置5种颜色。
final Color yellow=new Color(255,255,0);
final Color green=new Color(0,255,0);
final Color blue=new Color(0,0,255);
final Color purple=new Color(128,0,128);
int x=0;
int y=0;
for (int i = 0; i <16; i++) {//使用for循环16次。将16个组件初始化并添加到容器中。
jb[i]=new JButton();
int u=r.nextInt(15);//设置15的随机数。0-4红色,概率最高。以此类推。
if (u>=0 && u<=4) {
jb[i].setBackground(red);
}else if (u>4 && u<=8) {
jb[i].setBackground(yellow);
}else if (u>8 && u<=11) {
jb[i].setBackground(green);
}else if (u>11 && u<=13) {
jb[i].setBackground(blue);
}else {
jb[i].setBackground(purple);
}
jb[i].setBounds(x,y,80,80);//设置布局,使用变量想x,y当中介。使其排列为一个4x4的格子。
if (x==240) {
y+=80;
x=0;
}else {
x+=80;
}
jFrame.add(jb[i]);
}
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jFrame.setVisible(true);
}
}
这个是相关的算法:
package suanFa;
import java.awt.AWTException;
import java.awt.Color;
import java.awt.Robot;
import zhuJie_MB.Zhumianban_JM;
public class XiaoChu_SF {
static Robot robot=null;
static int xxx=145;//获取屏幕x坐标
static int yyy=120;//获取屏幕y坐标
static int col;//定义一个变量,用来储存颜色所对应的数字。
static int[] color=new int[16];//定义一个整型数组,用来装16个组件所对应的颜色代码。
static Zhumianban_JM zh=new Zhumianban_JM();
public static void suan() {
final Color red=new Color(255,0,0);
final Color yellow=new Color(255,255,0);
final Color green=new Color(0,255,0);
final Color blue=new Color(0,0,255);
final Color purple=new Color(128,0,128);
new Thread() {//此处需要加一个线程,让线程停止1秒,不然进程未加载出来就开始查询坐标颜色。
public void run() {
try {
Thread.sleep(1000);
for (int i = 0; i <16; i++) {
try {
robot=new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
robot.getPixelColor(xxx, yyy);
if (robot.getPixelColor(xxx, yyy).equals(red)) {
col=0;
}else if (robot.getPixelColor(xxx, yyy).equals(yellow)) {
col=1;
}
else if (robot.getPixelColor(xxx, yyy).equals(green)) {
col=2;
}
else if (robot.getPixelColor(xxx, yyy).equals(blue)) {
col=3;
}else if (robot.getPixelColor(xxx, yyy).equals(purple)) {
col=4;
}else {
col=50;
}
color[i]=col;//把每个颜色放到color数组中。
System.out.print(color[i]);
if (xxx==385) {//将每次查询是的坐标变换。使其查询坐标颜色时排列为4X4的格子。
yyy+=80;
xxx=145;
}else {
xxx+=80;
}
if (i==15) {//当颜色查询完毕后,进入no1方法。
no1();
}
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}.start();
}
public static void no1() {
int x0 = 0,x1 = 0,x2 = 0,x3 = 0,x4 = 0;//定义5个变量用来储存相同颜色的个数。
for (int i = 0; i <16; i++) {//需要查询16次
if (color[i]==0) {//查询数组中的数字是否与0,1,2,3,4,相等。
x0++;
}else if (color[i]==1) {
x1++;
}else if (color[i]==2) {
x2++;
}else if (color[i]==3) {
x3++;
}else if (color[i]==4) {
x4++;
}
}
int[] xx0 =new int[x0];//定义5个数组用来储存相同颜色的位置。
int[] xx1 =new int[x1];
int[] xx2 =new int[x2];
int[] xx3 =new int[x3];
int[] xx4 =new int[x4];
int xxx0=0;//用来当做xx0...的索引。
if (x0>=4) {//如果相同的颜色的个数大于或者等于4就把他们所对应的位置保存到上面的数组中
for (int i = 0; i <16; i++) {
if (color[i]==0) {
xx0[xxx0]=i;
xxx0+=1;//每次索引加一。
}
}
}
int xxx1=0;
if (x1>=4) {
for (int i = 0; i <16; i++) {
if (color[i]==1) {
xx1[xxx1]=i;
xxx1+=1;
}
}
}
int xxx2=0;
if (x2>=4) {
for (int i = 0; i <16; i++) {
if (color[i]==2) {
xx2[xxx2]=i;
xxx2+=1;
}
}
}
int xxx3=0;
if (x3>=4) {
for (int i = 0; i <16; i++) {
if (color[i]==3) {
xx3[xxx3]=i;
xxx3+=1;
}
}
}
int xxx4=0;
if (x4>=4) {//判断组件是否有4个或者以上,如果有输出组件的位置。
for (int i = 0; i <16; i++) {
if (color[i]==4) {
xx4[xxx4]=i;
xxx4+=1;
}
}
}
位置和数量都有了,就差怎么知道相邻了。4个或4个以上都算。有点像消消乐,但是消消乐只有横排和枞排。
注:每次运行的图形界面不一样
假设两个格子的坐标为(x1,y1), (x2,y2).
那么判断相邻: ((x1==x2) && (abs(y1-y2)==1)) || ((y1==y2) && (abs(x1-x2)== 1))
用伪代码说明一下,怎么把二维数组分组
// 0 表示未分组, >=1 表示分在哪个组
group[16] = {0}
color[16]
group_num = 0;
// 递归深度优先遍历, 在当前点的上下左右4个方向探索, 如果未分组, 且颜色一样,则加入当前分组
dfs(x, group_id)
{
cur_color = color[x];
check(x-4, cur_color,group_id);
check(x-1, cur_color,group_id);
check(x+1, cur_color,group_id);
check(x+4, cur_color,group_id);
}
check(x, cur_color, group_id) {
if (x >=0 && x <16 && 0 == group[x]) {
if (color[x] == cur_color) {
group[x] = group_id;
dfs(x,group_id);
}
}
}
// 对每个点, 看是否已经分组, 如果未分组, 则新建分组并做深度优先遍历
for (i = 0; i < 16; i++) {
if (0 == group[i]) {
group_num += 1;
group[i] = group_num;
dfs(i, color[i], group[i]);
}
}
相邻不简单,你都有二维数组了,看你两个数,哪个代表横哪个代表纵,颜色相同,横或纵相差为1不就是相邻了