小游戏之迷宫逃脱

本来在控制台用wasd键直接了就可以控制小人移动,但奈何 java 没有这个功能,只能退而求其次,选择输入来控制小人移动。

这次用char数组存储迷宫,"#"字代表迷宫墙壁,大写的"O"代表小人位置,墙壁空缺的地方为出口。

首先载入存储迷宫的数组,自动判断小人和出口的坐标,存储到变量里。

然后根据输入的指令,判断是否可以移动?

  • 不可以,不移动;
  • 可以,移动;

在判断是否到达出口?

  • 是,结束游戏;
  • 否,打印迷宫,等待指令;

嘛,很简单的个小游戏。

有机会看看能不能自动生成迷宫,和自动走迷宫。


演示视频


程序流程

2019-12-25_210454.png2019-12-25_210454.png


程序代码

import java.util.Scanner;

public class Maze {
    private static char[][] mazechar= {
            {'#','#','#','#','#','#','#','#',},
            {'#','O',' ','#',' ',' ',' ','#',},
            {'#',' ','#','#',' ','#',' ','#',},
            {'#',' ',' ',' ',' ','#',' ','#',},
            {'#',' ','#',' ','#','#','#','#',},
            {'#','#',' ',' ','#','#','#','#',},
            {'#','#',' ','#',' ',' ',' ','#',},
            {'#',' ',' ',' ',' ','#',' ',' ',},
            {'#','#','#','#','#','#','#','#',}
    };
    private static int manX=0;
    private static int manY=0;
    private static int exitX=0;
    private static int exitY=0;

    public static void main(String[] args) {
        while (true){
            Scanner scanner=new Scanner(System.in);
            printfMaze(mazechar);
            findManAndExit(mazechar);



            if (isExit()){
                System.out.println("恭喜,逃脱成功!");
                break;
            }else {
                printManAndExit();
                printTips();
                doMove(scanner.nextLine());
            }
        }
    }
    //寻找初始位置和迷宫出口
    private static void findManAndExit(char[][] mazechar){
        for(int i=0;i<mazechar.length;i++){
            for(int j=0;j<mazechar[i].length;j++) {
                if ('O'==mazechar[i][j]) {
                    manX = i;
                    manY = j;
                }
                if (' '==mazechar[i][j]&&(i==0||j==0||j==mazechar[i].length-1||i==mazechar.length-1)) {
                    exitX=i;
                    exitY=j;
                }
            }
        }
    }

    //判断是否到出口
    private static boolean isExit(){
        if(manX==exitX&&manY==exitY){
            return true;
        }else {
            return false;
        }
    }

    //移动小人
    private static void doMove(String s){
        if("w".equals(s)||"W".equals(s)){
            if('#'!=mazechar[manX-1][manY]){
                mazechar[manX][manY]=' ';
                mazechar[manX-1][manY]='O';
            }
        }
        if("s".equals(s)||"S".equals(s)){
            if('#'!=mazechar[manX+1][manY]){
                mazechar[manX][manY]=' ';
                mazechar[manX+1][manY]='O';
            }
        }
        if("a".equals(s)||"A".equals(s)){
            if('#'!=mazechar[manX][manY-1]){
                mazechar[manX][manY]=' ';
                mazechar[manX][manY-1]='O';
            }
        }
        if("d".equals(s)||"D".equals(s)){
            if('#'!=mazechar[manX][manY+1]){
                mazechar[manX][manY]=' ';
                mazechar[manX][manY+1]='O';
            }
        }
    }

    private static void printTips(){
        System.out.println("输入\"w\"向上走;输入\"s\"向下走;输入\"a\"向左走;输入\"d\"向右走;不区分大小写!");
    }
    //打印当前位置和出口位置
    private static void printManAndExit(){
        System.out.println("man:"+manX+"-"+manY+"\t exit:"+exitX+"-"+exitY);
    }
    //打印迷宫
    private static void printfMaze(char[][] mazechar){
        for(char[] c1 : mazechar){
            for(char c2:c1){
                System.out.print(c2);
            }
            System.out.println();
        }
    }
}

运行截图

开始

2019-12-25_211649.png2019-12-25_211649.png

游戏中

2019-12-25_211728.png2019-12-25_211728.png

结束

2019-12-25_212334.png2019-12-25_212334.png

最后修改于:2020年08月05日 16:48

添加新评论

* 已开启反垃圾保护,《隐私政策》