华容道游戏在胜利模板下如何打乱顺序开始游戏,java方法类

该方法设计到一个枚举类和一个判断能否移动的方法。在游戏中,进行上下左右移动的时候会进行判断能否移动,在打乱顺序的时候同样可以使用到该判断方法。只不过需要把在打乱顺序之后需要将count重新赋值为0.
因为我在每次判断完成都进行了一次count++,最后展示到界面上。而这里是打乱顺序故而需要重置。
以下只提供了涉及到的类和方法,没有提供整个项目的实体。


一:定义一个Derection枚举类:
package com.itheima;

public enum Direction {
    UP,DOWN,LEFT,RIGHT;
}
二:判断并移动的方法
private void switchAndMove(Direction d){
    //判断图片方向,再控制图片移动,使用switch
    //1.定位当前空白色块的位置
    //2.根据用户点击的方位确定交换哪两个数据,到数组中交换
    //3.重新绘制主界面的内容:让主界面按照二维数组的最新内容重新刷新界面
    switch (d){
        case UP:
            //上交换的条件是行必须<3,然后才开始交换
            if(blankRow0,然后才开始交换
            if(blankRow>0){
                //交换当前空白色块和下面一行的色块
                //1.交换数组中两个数据
                int temp = imageData[blankRow][blankCol];
                imageData[blankRow][blankCol] = imageData[blankRow-1][blankCol];
                imageData[blankRow-1][blankCol] = temp;
                //2.交换空白色块的位置
                blankRow--;
                count++;
            }
            System.out.println("向下");
            break;
        case LEFT:
            //左交换的条件是列必须<3,然后才开始交换
            if(blankCol<3){
                //交换当前空白色块和左边一列的色块
                //1.交换数组中两个数据
                int temp = imageData[blankRow][blankCol];
                imageData[blankRow][blankCol] = imageData[blankRow][blankCol+1];
                imageData[blankRow][blankCol+1] = temp;
                //2.交换空白色块的位置
                blankCol++;
                count++;
            }
            System.out.println("向左");
            break;
        case RIGHT:
            //右交换的条件是列必须>0,然后才开始交换
            if(blankCol>0){
                //交换当前空白色块和右边一列的色块
                //1.交换数组中两个数据
                int temp = imageData[blankRow][blankCol];
                imageData[blankRow][blankCol] = imageData[blankRow][blankCol-1];
                imageData[blankRow][blankCol-1] = temp;
                //2.交换空白色块的位置
                blankCol--;
                count++;
            }
            System.out.println("向右");
            break;
    }
    //刷新主界面
    initImage();

}
三:打乱方法
private void initRandomArray() {
        //打乱华容道数组的顺序,这种方式会出现无法恢复到胜利状态的情况
//        for (int i = 0; i < imageData.length; i++) {
//            for (int j = 0; j < imageData[i].length; j++) {
//                //随机两个行列位置,让这两个位置交换
//                int m1 = (int)(Math.random() * imageData.length);
//                int p1 = (int)(Math.random() * imageData[i].length);
//                //再随机两个行列位置
//                int m2 = (int)(Math.random() * imageData.length);
//                int p2 = (int)(Math.random() * imageData[i].length);
//                int temp = imageData[m1][p1];
//                imageData[m1][p1] = imageData[m2][p2];
//                imageData[m2][p2] = temp;
//            }
//        }
        //在4x4的华容道胜利状态打乱华容道数组的顺序:可以以空白色块为基准随机与周围的色块进行数据交换
        //需要判断那个位置是否有能进行交换的色块,并且能恢复到原来的状态,打乱的次数你帮我设置
        //1.设置需要打乱的次数,可以根据你的需要去设置
        int countnum = 100;
        //2.循环打乱次数
        while(countnum>0){
            //让空白色块与周围四个方向随机一个方向的色块进行交换,并且判断是否能进行交换,若不能则换一个方向
            //应用Direction枚举类,并随机获取其中一个值
            Direction d = Direction.values()[(int)(Math.random()*4)];
            switchAndMove(d);
            countnum--;
        }
        //调用switchAndMove方法的时候每调用一次,count加1,所以需要重置为0
        count=0;

        //定位空白色块的位置:
        //去二维数组中遍历每个数据,只要发现这个数据等于0,这个位置就是当前空白色块的位置。
        OUT:
        for (int i = 0; i < imageData.length; i++) {
            for (int j = 0; j < imageData[i].length; j++) {
                if(imageData[i][j]==0){
                    //记录空白色块的位置
                    blankRow=i;
                    blankCol=j;
                    break OUT;
                }
            }
        }
    }

以上就是全部内容了,这种打乱方式很像我们现实生活中的人工打乱,根据现实的这种操作模式用代码实现就好了

你可能感兴趣的:(游戏,java,算法,笔记)