Java 二维数组迷宫游戏

二维数组迷宫

分析:
1.打印地图 --- 二维数组的遍历
    初始角标array[1][1]
    结束角标array[1][9]
2.如何让'0'走起来
    通过修改横纵角标达到让'0'走起来的目的
    如何碰到墙'#'不交换移动
    可以先把要走位置的元素取出来判断一下是否为墙'#'
    是墙'#'进行交换移动,不是就不进行交换移动
3.循环输入(循环的停止条件就是array[1][9] == ' ' --> array[1][9] == '0'
  如果有明确的停止循环条件使用 while 循环比较方便

public static void main(String[] args) {
    // 有8个一维数组,每个一维数组中有10个元素
    // array[1][9] --- 出口
    // array[1][1] d ---> array[1][1] == ' '
    //                        array[1][2] == '0'
    // array[1][2] s ---> array[1][2] == ' '
    //                        array[2][2] == '0'
    // array[2][2] w ---> array[2][2] == ' '
    //                        array[1][2] == '0'
    // array[1][2] a ---> array[1][2] == ' '
    //                        array[1][1] == '0'
    char[][] array = {
    // y  0   1   2   3   4   5   6   7   8   9
        {'#','#','#','#','#','#','#','#','#','#'},// 0 ----- x
        {'#','0',' ',' ',' ',' ','#','#',' ',' '},// 1
        {'#','#',' ','#','#','#','#','#',' ','#'},// 2
        {'#',' ',' ',' ',' ','#','#','#',' ','#'},// 3
        {'#',' ','#','#',' ','#',' ',' ',' ','#'},// 4
        {'#',' ','#','#',' ','#',' ','#','#','#'},// 5
        {'#',' ',' ',' ',' ',' ',' ','#','#','#'},// 6
        {'#','#','#','#','#','#','#','#','#','#'},// 7
    };
    // 打印地图
    printArray(array);
    // 声明要用的变量(起始角标、结束角标)
    // 起始
    int x = 1;
    int y = 1;
    // 结束
    int ex = 1;
    int ey = 9;
    Scanner scanner = new Scanner(System.in);
    while(array[ex][ey] != '0') {
        // 提示输入(上下左右) w a s d
        System.out.println("请输入(上下左右) w a s d:");
        // 接收输入的值
        String string = scanner.nextLine();
        // 判断一下,往哪里移动
        switch (string) {
        case "w":
            // 判断移动位置是否为墙
            if (array[x - 1][y] != '#') {
                // 把原来改为空格
                array[x][y] = ' ';
                // 向上移动 修改坐标 - 1
                x--;
                // 新位置变成'0'
                array[x][y] = '0';
            }
            break;
        case "a":
            // 判断移动位置是否为墙
            if (array[x][y - 1] != '#') {
                // 把原来改为空格
                array[x][y] = ' ';
                // 向左移动 修改坐标 - 1
                y--;
                // 新位置变成'0'
                array[x][y] = '0';
            }       
            break;
        case "s":
            // 判断移动位置是否为墙
            if (array[x + 1][y] != '#') {
                // 把原来改为空格
                array[x][y] = ' ';
                // 向下移动 修改坐标 + 1
                x++;
                // 新位置变成'0'
                array[x][y] = '0';
            }
            break;
        case "d":
            // 判断移动位置是否为墙
            if (array[x][y + 1] != '#') {
                // 把原来改为空格
                array[x][y] = ' ';
                // 向右移动 修改坐标 + 1
                y++;
                // 新位置变成'0'
                array[x][y] = '0';
            }
            break;
        default:
            break;
        }
        // 修改后再打印一遍地图
        printArray(array);
    }
    System.out.println("恭喜你通关了!");
    scanner.close();
}

// 打印地图的方法
public static void printArray(char[][] array) {
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            System.out.print(array[i][j]);
        }
        System.out.println();
    }
}

二维数组迷宫进阶

把迷宫写成函数 在main函数中调用 并添加些功能 例如 过三关 和 计分

static Scanner scanner = new Scanner(System.in);
static int num = 0;
public static void main(String[] args) {
    // 有8个一维数组,每个一维数组中有10个元素
    // array[1][9] --- 出口
    // array[1][1] d ---> array[1][1] == ' '
    //                        array[1][2] == '0'
    // array[1][2] s ---> array[1][2] == ' '
    //                        array[2][2] == '0'
    // array[2][2] w ---> array[2][2] == ' '
    //                        array[1][2] == '0'
    // array[1][2] a ---> array[1][2] == ' '
    //                        array[1][1] == '0'
    char[][] array = {
    // y  0   1   2   3   4   5   6   7   8   9
        {'#','#','#','#','#','#','#','#','#','#'},// 0 ----- x
        {'#','0',' ',' ',' ',' ','#','#',' ',' '},// 1
        {'#','#',' ','#','#','#','#','#',' ','#'},// 2
        {'#',' ',' ',' ',' ','#','#','#',' ','#'},// 3
        {'#',' ','#','#',' ','#',' ',' ',' ','#'},// 4
        {'#',' ','#','#',' ','#',' ','#','#','#'},// 5
        {'#',' ',' ',' ',' ',' ',' ','#','#','#'},// 6
        {'#','#','#','#','#','#','#','#','#','#'},// 7
    };
    char[][] array1 = {
            // y  0   1   2   3   4   5   6   7   8   9
            {'#','#','#','#','#','#','#','#','#','#'},// 0 ----- x
            {'#','0',' ',' ',' ','#',' ',' ',' ',' '},// 1
            {'#','#','#','#',' ','#',' ','#',' ','#'},// 2
            {'#',' ',' ',' ',' ','#',' ','#',' ','#'},// 3
            {'#',' ','#','#','#','#',' ','#',' ','#'},// 4
            {'#',' ','#','#',' ','#',' ','#',' ','#'},// 5
            {'#',' ',' ',' ',' ',' ',' ',' ','#','#'},// 6
            {'#','#','#','#','#','#','#','#','#','#'},// 7
        };
    char[][] array2 = {
            // y  0   1   2   3   4   5   6   7   8   9
            {'#','#','#','#','#','#','#','#','#','#'},// 0 ----- x
            {'#','0',' ',' ',' ','#',' ',' ',' ',' '},// 1
            {'#',' ','#','#',' ','#','#',' ','#','#'},// 2
            {'#',' ','#','#',' ','#','#',' ','#','#'},// 3
            {'#',' ','#','#',' ','#','#',' ','#','#'},// 4
            {'#',' ','#','#',' ','#','#',' ','#','#'},// 5
            {'#',' ',' ',' ',' ',' ',' ',' ','#','#'},// 6
            {'#','#','#','#','#','#','#','#','#','#'},// 7
        };

    for (int i = 0; i < 3; i++) {
        switch (i) {
        case 0:
            // 打印地图
            printArray(array);
            System.out.println("第一关");
            game(array);
            break;

        case 1:
            // 打印地图
            printArray(array1);
            System.out.println("第二关");
            game(array1);
            break;

        case 2:
            // 打印地图
            printArray(array2);
            System.out.println("第三关");
            game(array2);
            System.out.println("你用了" + num + "步走完三关迷宫");
            break;

        default:
            break;
        }
    }

}

// 打印地图的方法
public static void printArray(char[][] array) {
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            System.out.print(array[i][j]);
        }
        System.out.println();
    }
}
// 循环游戏
public static void game(char[][] array) {
    // 声明要用的变量(起始角标、结束角标)
    // 起始
    int x = 1;
    int y = 1;
    // 结束
    int ex = 1;
    int ey = 9;
    while(array[ex][ey] != '0') {
        // 提示输入(上下左右) w a s d
        System.out.println("请输入(上下左右) w a s d:");
        // 接收输入的值
        String string = scanner.nextLine();
        num++;
        // 判断一下,往哪里移动
        switch (string) {
        case "w":
            // 判断移动位置是否为墙
            if (array[x - 1][y] != '#') {
                // 把原来改为空格
                array[x][y] = ' ';
                // 向上移动 修改坐标 - 1
                x--;
                // 新位置变成'0'
                array[x][y] = '0';
            }
            break;
        case "a":
            // 判断移动位置是否为墙
            if (array[x][y - 1] != '#') {
                // 把原来改为空格
                array[x][y] = ' ';
                // 向左移动 修改坐标 - 1
                y--;
                // 新位置变成'0'
                array[x][y] = '0';
            }       
            break;
        case "s":
            // 判断移动位置是否为墙
            if (array[x + 1][y] != '#') {
                // 把原来改为空格
                array[x][y] = ' ';
                // 向下移动 修改坐标 + 1
                x++;
                // 新位置变成'0'
                array[x][y] = '0';
            }
            break;
        case "d":
            // 判断移动位置是否为墙
            if (array[x][y + 1] != '#') {
                // 把原来改为空格
                array[x][y] = ' ';
                // 向右移动 修改坐标 + 1
                y++;
                // 新位置变成'0'
                array[x][y] = '0';
            }
            break;
        default:
            break;
        }
        // 修改后再打印一遍地图
        printArray(array);
    }
    System.out.println("恭喜你通关了!");
}

http://blog.csdn.net/huzongnan/article/list

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值