题目名称:连连看(游戏)
题目要求:单色正方形有7种不同颜色,每种颜色正方形有偶数个,堆成6×6的大正方形,需要选择一对相同颜色的正方形连线,但此连线是在避开其他图案后,呈现的路径以不超过两次转弯,如符合规定则消除此对图案而得分。每一局里玩家需要在规定的时间内消除所有的图案,当完成任务后,方能进行下一关。程序语言不限。游戏图案如下所示:

解决方案 »

  1.   

    希望那位高手知道的发代码给我呀
    [email protected]
    分不够我在给的
      

  2.   

    以前有个哥们写了一个JAVA桌面版的,邮箱收的,老帖子,你找下
      

  3.   

    我们上学期就用JAVA编了一个连连看的游戏,是作业!
    我回去找一下
      

  4.   

    我这里有个没有优化的程序,基本思路是:
    首先判断两个正方形能否用一条线段相连
    如果不能,则判断是否可以用两条线段相连
    如果还不能,再判断是否可以用三条线段相连判断是否可以用一条线段相连:
        public boolean canLined(int i1, int j1, int i2, int j2) {
            if ((i1 != i2) && (j1 != j2)) { //不在同一水平线或垂直线上
                return false;
            }        int i, j, maxI, minI, maxJ, minJ;
            if (i1 == i2) { //在同一水平线上
                if (j1 < j2) {
                    maxJ = j2;
                    minJ = j1;
                } else {
                    maxJ = j1;
                    minJ = j2;
                }
                //判断两图连线中间是否有其他的障碍物
                for (j = minJ + 1; j < maxJ; j++) {
                    if (picture[i1][j] != null && picture[i1][j].isVisible()) { //有障碍物
                        return false;
                    }
                }            return true;
            } else { //j1==j2,在同一垂直线上
                if (i1 < i2) {
                    maxI = i2;
                    minI = i1;
                } else {
                    maxI = i1;
                    minI = i2;
                }
                //判断两图连线中间是否有其他的障碍物
                for (i = minI + 1; i < maxI; i++) {
                    if (picture[i][j1] != null && picture[i][j1].isVisible()) {
                        return false;
                    }
                }            return true;
            }    }
      

  5.   

    /**
         * 判断两个图片之间是否可以用两条直线相连
         * @param p1 Picture
         * @param p2 Picture
         * @return Couple
         */
        public Couple can2Lined(Picture p1, Picture p2) {
            if (p1 == null || p2 == null || p1 == p2) { //检查参数合法性
                return null;
            }        int up1, up2, down1, down2;
            int left1, left2, right1, right2;
            int i, j;        //求通过p1的水平线的最右端
            j = p1.getJ() + 1;
            i = p1.getI();
            while ((j < COLUMN) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                j++;
            }
            right1 = j - 1;        //求通过p1的水平线的最左端
            j = p1.getJ() - 1;
            i = p1.getI();
            while ((j >= 0) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                j--;
            }
            left1 = j + 1;        //求通过p1的垂直线的最高端(根据点在数组中位置来确定,与显示无关)
            j = p1.getJ();
            i = p1.getI() + 1;
            while ((i < ROW) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                i++;
            }
            up1 = i - 1;        //求通过p1的垂直线的最底端
            j = p1.getJ();
            i = p1.getI() - 1;
            while ((i >= 0) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                i--;
            }
            down1 = i + 1;        //求通过p2的水平线的最右端
            j = p2.getJ() + 1;
            i = p2.getI();
            while ((j < COLUMN) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                j++;
            }
            right2 = j - 1;        //求通过p2的水平线的最左端
            j = p2.getJ() - 1;
            i = p2.getI();
            while ((j >= 0) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                j--;
            }
            left2 = j + 1;        //求通过p2的垂直线的最高端(根据点在数组中位置来确定,与显示无关)
            j = p2.getJ();
            i = p2.getI() + 1;
            while ((i < ROW) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                i++;
            }
            up2 = i - 1;        //求通过p2的垂直线的最底端
            j = p2.getJ();
            i = p2.getI() - 1;
            while ((i >= 0) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                i--;
            }
            down2 = i + 1;        //首先判断通过p1的水平线是否和通过p2的垂直线有交点
            i = p1.getI();
            j = p2.getJ();
            if ((i >= down2) && (i <= up2) && (j >= left1) && (j <= right1)) {
                return new Couple(i, j);
            }        //然后判断通过p1的垂直线是否和通过p2的水平线有交点
            i = p2.getI();
            j = p1.getJ();
            if ((i >= down1) && (i <= up1) && (j >= left2) && (j <= right2)) {
                return new Couple(i, j);
            }        //否则
            return null;
        }
      

  6.   

    /**
         * 判断是否可以用三条线断连接两张图片
         * @param p1 Picture
         * @param p2 Picture
         * @return Couple[]
         */
        public Couple[] can3Lined(Picture p1, Picture p2) {
            if (p1 == null || p2 == null || p1 == p2) { //检查参数合法性
                return null;
            }        int up1, up2, down1, down2;
            int left1, left2, right1, right2;
            int i, j;        //求通过p1的水平线的最右端
            j = p1.getJ() + 1;
            i = p1.getI();
            while ((j < COLUMN) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                j++;
            }
            right1 = j - 1;        //求通过p1的水平线的最左端
            j = p1.getJ() - 1;
            i = p1.getI();
            while ((j >= 0) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                j--;
            }
            left1 = j + 1;        //求通过p1的垂直线的最高端(根据点在数组中位置来确定,与显示无关)
            j = p1.getJ();
            i = p1.getI() + 1;
            while ((i < ROW) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                i++;
            }
            up1 = i - 1;        //求通过p1的垂直线的最底端
            j = p1.getJ();
            i = p1.getI() - 1;
            while ((i >= 0) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                i--;
            }
            down1 = i + 1;        //求通过p2的水平线的最右端
            j = p2.getJ() + 1;
            i = p2.getI();
            while ((j < COLUMN) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                j++;
            }
            right2 = j - 1;        //求通过p2的水平线的最左端
            j = p2.getJ() - 1;
            i = p2.getI();
            while ((j >= 0) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                j--;
            }
            left2 = j + 1;        //求通过p2的垂直线的最高端(根据点在数组中位置来确定,与显示无关)
            j = p2.getJ();
            i = p2.getI() + 1;
            while ((i < ROW) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                i++;
            }
            up2 = i - 1;        //求通过p2的垂直线的最底端
            j = p2.getJ();
            i = p2.getI() - 1;
            while ((i >= 0) &&
                   ((picture[i][j] == null) || (!picture[i][j].isVisible()))) {
                i--;
            }
            down2 = i + 1;        Couple[] couple = new Couple[2];
            //首先找两条水平线之间是否存在一条垂直线连接他们
            int left = (left1 > left2) ? left1 : left2; //left取较大值
            int right = (right1 < right2) ? right1 : right2; //right取小值
            int i1 = p1.getI();
            int i2 = p2.getI();        for (int k = left; k <= right; k++) {
                if (canLined(i1, k, i2, k)) {
                    couple[0] = new Couple(i1, k);
                    couple[1] = new Couple(i2, k);
                    return couple;
                }
            }        //然后找两条垂直线之间是否存在一条垂直线连接他们
            int down = (down1 > down2) ? down1 : down2; //down取大值
            int up = (up1 < up2) ? up1 : up2; //up取小值
            int j1 = p1.getJ();
            int j2 = p2.getJ();
            for (int k = down; k <= up; k++) {
                if (canLined(k, j1, k, j2)) {
                    couple[0] = new Couple(k, j1);
                    couple[1] = new Couple(k, j2);
                    return couple;
                }
            }        //没有找到
            return null;
        }
      

  7.   

    我最近也在玩这个,来来看看源code 呵呵  谢谢了啊
      

  8.   

    majcos(千里之行,始于足下) 也给我一份  谢谢  [email protected]
      

  9.   

    大侠,我也想要:[email protected]
      

  10.   

    我也想要,majcos(千里之行,始于足下)给份我吧,[email protected] thx
      

  11.   

    不好意思大侠,应是:[email protected]
      

  12.   

    还有我,谢谢[email protected]    学习,
      

  13.   

    谢谢你为大家提供,能否帮忙发到[email protected]这里呀。.再次感谢