본문 바로가기

Web Project

[자바 스크립트] 미로 만들기

1단계 : 좌표 출력하기

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <title>예제</title>

    <script src="js/jquery.min.js"></script>

    <script>
        var x = 0;
        var y = 0;

        $(function() {

            $(document).on("keydown", keyEventFnc);

            // e : 이벤트 객체, 여기서는 키가 눌린 정보를 저장함
            // 2차원 배열에서 좌표를 생각해보면
            // x는 행, y는 열에 해당
            // 밑으로 갈 수록 y 증가
            // 위로 갈 수록 y 감소
            function keyEventFnc(e) {
                var direct = "";

                switch(e.keyCode) {
                    case 37:
                    direct = "LEFT";
                    x--;
                    break;

                    case 38:
                    direct = "TOP";
                    y--;
                    break;

                    case 39:
                    direct = "RIGHT";
                    x++;
                    break;

                    case 40:
                    direct = "BOTTOM";
                    y++;
                    break;
                }

                if(direct) {
                    $("#user_id").val(direct);
                }

                document.getElementById("text").innerHTML = ("x:" + x + " y:" + y);
            }
        })
    </script>
</head>

<body>
    <div id="text"></div>
</body>

</html>

실행 후 방향키를 오른쪽 세 번, 위 쪽 세 번 누른 결과이다.

 

2단계 : 맵 및 사용자 출력하기

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <title>예제</title>

    <script src="js/jquery.min.js"></script>

    <script>
        var x = 0;
        var y = 0;
        var map_text = "";

        var map = new Array();

        // 10x10 2차원 배열 만들기
        for (var i = 0; i <= 10; i++) {
            map[i] = new Array();
        }

        // 맵을 초기화
        for (var i = 0; i <= 10; i++) {
            for (var j = 0; j <= 10; j++) {
                map[i][j] = "□";
            }
        }

        $(function () {

            $(document).on("keydown", keyEventFnc);

            // e : 이벤트 객체, 여기서는 키가 눌린 정보를 저장함
            // 2차원 배열에서 좌표를 생각해보면
            // x는 행, y는 열에 해당
            // 밑으로 갈 수록 y 증가
            // 위로 갈 수록 y 감소
            function keyEventFnc(e) {
                var direct = "";

                switch (e.keyCode) {
                    case 37:
                        direct = "LEFT";
                        map[y][x] = "□";
                        x--;
                        break;

                    case 38:
                        direct = "TOP";
                        map[y][x] = "□";
                        y--;
                        break;

                    case 39:
                        direct = "RIGHT";
                        map[y][x] = "□";
                        x++;
                        break;

                    case 40:
                        direct = "BOTTOM";
                        map[y][x] = "□";
                        y++;
                        break;
                }

                if (direct) {
                    $("#user_id").val(direct);
                    document.getElementById("location").innerHTML = ("[현재 좌표]<br>x:" + x + " y:" + y);
                }

                map[y][x] = "■";

                // 이동한 위치에 따라 맵을 그림
                draw();
            }

            function draw() {
                map_text = "";

                for (var i = 0; i <= 10; i++) {
                    for (var j = 0; j <= 10; j++) {
                        map_text += map[i][j] + " ";
                    }
                    map_text += "<br>";
                }

                document.getElementById("map").innerHTML = map_text;
            }
        })
    </script>

    <style>
        * {
            margin: 0 auto;
        }

        #location {
            width: 250px;
            height: 47px;
            background-color: cyan;
            border-radius: 10px;
            font-weight: bold;
            text-align: center;

            margin-top: 10px;
            padding-top: 3px;
        }

        #map {
            width: 240px;
            height: 240px;
            background-color: palegreen;
            border-radius: 10px;
            font-weight: bold;

            margin-top: 10px;
            padding-left: 10px;
        }
    </style>
</head>

<body>
    <div id="location"></div>
    <div id="map"></div>
</body>

</html>

 

3단계 : 맵 바깥으로 나가지 못하게 막기

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <title>예제</title>

    <script src="js/jquery.min.js"></script>

    <script>
        var x = 0;
        var y = 0;
        var map_text = "";

        var map = new Array();

        // 10x10 2차원 배열 만들기
        for (var i = 0; i <= 10; i++) {
            map[i] = new Array();
        }

        // 맵을 초기화
        for (var i = 0; i <= 10; i++) {
            for (var j = 0; j <= 10; j++) {
                map[i][j] = "□";
            }
        }

        $(function () {

            $(document).on("keydown", keyEventFnc);

            // e : 이벤트 객체, 여기서는 키가 눌린 정보를 저장함
            // 2차원 배열에서 좌표를 생각해보면
            // x는 행, y는 열에 해당
            // 밑으로 갈 수록 y 증가
            // 위로 갈 수록 y 감소
            function keyEventFnc(e) {
                var direct = "";

                switch (e.keyCode) {
                    case 37:
                        direct = "LEFT";
                        if (check_x(direct)) {
                            map[y][x] = "□";
                            x--;
                        }
                        break;

                    case 38:
                        direct = "TOP";
                        if (check_y(direct)) {
                            map[y][x] = "□";
                            y--;
                        }
                        break;

                    case 39:
                        direct = "RIGHT";
                        if (check_x(direct)) {
                            map[y][x] = "□";
                            x++;
                        }
                        break;

                    case 40:
                        direct = "BOTTOM";
                        if (check_y(direct)) {
                            map[y][x] = "□";
                            y++;
                        }
                        break;
                }

                if (direct) {
                    $("#user_id").val(direct);
                    document.getElementById("location").innerHTML = ("[현재 좌표]<br>x:" + x + " y:" + y);
                }

                map[y][x] = "■";

                // 이동한 위치에 따라 맵을 그림
                draw();
            }

            function draw() {
                map_text = "";

                for (var i = 0; i <= 10; i++) {
                    for (var j = 0; j <= 10; j++) {
                        map_text += map[i][j] + " ";
                    }
                    map_text += "<br>";
                }

                document.getElementById("map").innerHTML = map_text;
            }

            function check_x(direct) {
                if (direct == "LEFT") {
                    if (x - 1 < 0) {
                        return false;
                    }
                    else {
                        return true;
                    }
                }
                else if (direct =="RIGHT") {
                    if (x + 1 > 10) {
                        return false;
                    }
                    else {
                        return true;
                    }
                }
            }

            function check_y(direct) {
                if (direct == "TOP") {
                    if (y - 1 < 0) {
                        return false;
                    }
                    else {
                        return true;
                    }
                }
                else if (direct =="BOTTOM") {
                    if (y + 1 > 10) {
                        return false;
                    }
                    else {
                        return true;
                    }
                }
            }
        })
    </script>

    <style>
        * {
            margin: 0 auto;
        }

        #location {
            width: 250px;
            height: 47px;
            background-color: cyan;
            border-radius: 10px;
            font-weight: bold;
            text-align: center;

            margin-top: 10px;
            padding-top: 3px;
        }

        #map {
            width: 240px;
            height: 240px;
            background-color: palegreen;
            border-radius: 10px;
            font-weight: bold;

            margin-top: 10px;
            padding-left: 10px;
        }
    </style>
</head>

<body>
    <div id="location"></div>
    <div id="map"></div>
</body>

</html>

맵 바깥으로 방향키를 눌러도 이동하지 않는 모습을 확인할 수 있다.

 

4단계 : 벽 만들기 및 충돌 판정

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <title>예제</title>

    <script src="js/jquery.min.js"></script>

    <script>
        var x = 0;
        var y = 0;
        var map_text = "";

        var map = new Array();
        var is_duplicate = false;

        // 10x10 2차원 배열 만들기
        for (var i = 0; i <= 10; i++) {
            map[i] = new Array();
        }

        // 맵을 초기화
        for (var i = 0; i <= 10; i++) {
            for (var j = 0; j <= 10; j++) {
                map[i][j] = "□";
            }
        }
        map[10][10] = "★";

        // 벽 만들기
        for (var i = 0; i < 20; i++) {
            var location_x = Math.floor(Math.random() * 9) + 0;
            var location_y = Math.floor(Math.random() * 9) + 0;

            map[location_y][location_x] = "벽";
        }

        $(function () {

            $(document).on("keydown", keyEventFnc);

            // e : 이벤트 객체, 여기서는 키가 눌린 정보를 저장함
            // 2차원 배열에서 좌표를 생각해보면
            // x는 행, y는 열에 해당
            // 밑으로 갈 수록 y 증가
            // 위로 갈 수록 y 감소
            function keyEventFnc(e) {
                var direct = "";

                switch (e.keyCode) {
                    case 37:
                        direct = "LEFT";
                        if (check_x(direct)) {
                            map[y][x] = "□";
                            x--;
                        }
                        break;

                    case 38:
                        direct = "TOP";
                        if (check_y(direct)) {
                            map[y][x] = "□";
                            y--;
                        }
                        break;

                    case 39:
                        direct = "RIGHT";
                        if (check_x(direct)) {
                            map[y][x] = "□";
                            x++;
                        }
                        break;

                    case 40:
                        direct = "BOTTOM";
                        if (check_y(direct)) {
                            map[y][x] = "□";
                            y++;
                        }
                        break;
                }

                if (direct) {
                    $("#user_id").val(direct);
                    document.getElementById("location").innerHTML = ("[현재 좌표]<br>x:" + x + " y:" + y);
                }

                map[y][x] = "■";

                // 이동한 위치에 따라 맵을 그림
                draw();
            }

            function draw() {
                map_text = "";

                for (var i = 0; i <= 10; i++) {
                    for (var j = 0; j <= 10; j++) {
                        map_text += map[i][j] + " ";
                    }
                    map_text += "<br>";
                }

                document.getElementById("map").innerHTML = map_text;
            }

            function check_x(direct) {
                if (direct == "LEFT") {
                    if (x - 1 < 0) {
                        return false;
                    }
                    else {
                        if (map[y][x - 1] != "벽") {
                            return true;
                        }
                    }
                }
                else if (direct == "RIGHT") {
                    if (x + 1 > 10) {
                        return false;
                    }
                    else {
                        if (map[y][x + 1] != "벽") {
                            return true;
                        }
                    }
                }
            }

            function check_y(direct) {
                if (direct == "TOP") {
                    if (y - 1 < 0) {
                        return false;
                    }
                    else {
                        if (map[y - 1][x] != "벽") {
                            return true;
                        }
                    }
                }
                else if (direct == "BOTTOM") {
                    if (y + 1 > 10) {
                        return false;
                    }
                    else {
                        if (map[y + 1][x] != "벽") {
                            return true;
                        }
                    }
                }
            }
        })
    </script>

    <style>
        * {
            margin: 0 auto;
        }

        #location {
            width: 250px;
            height: 47px;
            background-color: cyan;
            border-radius: 10px;
            font-weight: bold;
            text-align: center;

            margin-top: 10px;
            padding-top: 3px;
        }

        #map {
            width: 240px;
            height: 240px;
            background-color: palegreen;
            border-radius: 10px;
            font-weight: bold;

            margin-top: 10px;
            padding-left: 10px;
        }
    </style>
</head>

<body>
    <div id="location"></div>
    <div id="map"></div>
</body>

</html>

벽이 랜덤한 위치에 생성되며 벽을 지나가지 못하는 것을 확인할 수 있다.

 

5단계 : 도착 지점 설정하고 도착 여부 판별하기

<!DOCTYPE html>
<html lang="ko">

<head>
    <meta charset="UTF-8">
    <title>예제</title>

    <script src="js/jquery.min.js"></script>

    <script>
        var x = 0;
        var y = 0;
        var map_text = "";

        var map = new Array();
        var is_duplicate = false;

        // 10x10 2차원 배열 만들기
        for (var i = 0; i <= 10; i++) {
            map[i] = new Array();
        }

        $(function () {
            set_map();

            $(document).on("keydown", keyEventFnc);

            // e : 이벤트 객체, 여기서는 키가 눌린 정보를 저장함
            // 2차원 배열에서 좌표를 생각해보면
            // x는 행, y는 열에 해당
            // 밑으로 갈 수록 y 증가
            // 위로 갈 수록 y 감소
            function keyEventFnc(e) {
                var direct = "";

                switch (e.keyCode) {
                    case 37:
                        direct = "LEFT";
                        if (check_x(direct)) {
                            map[y][x] = "□";
                            x--;
                        }
                        break;

                    case 38:
                        direct = "TOP";
                        if (check_y(direct)) {
                            map[y][x] = "□";
                            y--;
                        }
                        break;

                    case 39:
                        direct = "RIGHT";
                        if (check_x(direct)) {
                            map[y][x] = "□";
                            x++;
                        }
                        break;

                    case 40:
                        direct = "BOTTOM";
                        if (check_y(direct)) {
                            map[y][x] = "□";
                            y++;
                        }
                        break;
                }

                if (direct) {
                    $("#user_id").val(direct);
                }

                map[y][x] = "■";

                // 이동한 위치에 따라 맵을 그림
                draw();
            }

            function draw() {
                map_text = "";

                for (var i = 0; i <= 10; i++) {
                    for (var j = 0; j <= 10; j++) {
                        map_text += map[i][j] + " ";
                    }
                    map_text += "<br>";
                }

                document.getElementById("location").innerHTML = ("[현재 좌표]<br>x:" + x + " y:" + y);
                document.getElementById("map").innerHTML = map_text;
            }

            function check_x(direct) {
                if (direct == "LEFT") {
                    if (x - 1 < 0) {
                        return false;
                    }
                    else {
                        if (map[y][x - 1] != "벽" && map[y][x - 1] != "★") {
                            return true;
                        }
                        else if (map[y][x + 1] == "★") {
                            clear();
                        }
                    }
                }
                else if (direct == "RIGHT") {
                    if (x + 1 > 10) {
                        return false;
                    }
                    else {
                        if (map[y][x + 1] != "벽" && map[y][x + 1] != "★") {
                            return true;
                        }
                        else if (map[y][x + 1] == "★") {
                            clear();
                        }
                    }
                }
            }

            function check_y(direct) {
                if (direct == "TOP") {
                    if (y - 1 < 0) {
                        return false;
                    }
                    else {
                        if (map[y - 1][x] != "벽" && map[y - 1][x] != "★") {
                            return true;
                        }
                        else if (map[y - 1][x] == "★") {
                            clear();
                        }
                    }
                }
                else if (direct == "BOTTOM") {
                    if (y + 1 > 10) {
                        return false;
                    }
                    else {
                        if (map[y + 1][x] != "벽" && map[y + 1][x] != "★") {
                            return true;
                        }
                        else if (map[y + 1][x] == "★") {
                            clear();
                        }
                    }
                }
            }

            function set_map() {
                document.getElementById("location").innerHTML = "The Maze";
                document.getElementById("map").innerHTML = "Press any key to start.";

                // 좌표 및 화면 표시 위치 초기화
                map[y][x] = "□";
                x = 0;
                y = 0;

                // 맵을 초기화
                for (var i = 0; i <= 10; i++) {
                    for (var j = 0; j <= 10; j++) {
                        map[i][j] = "□";
                    }
                }
                map[10][10] = "★";

                // 벽 만들기
                for (var i = 0; i < 20; i++) {
                    var location_x = Math.floor(Math.random() * 9) + 0;
                    var location_y = Math.floor(Math.random() * 9) + 0;

                    map[location_y][location_x] = "벽";
                }
            }

            function clear() {
                alert("도착!");
                set_map();
            }
        })
    </script>

    <style>
        * {
            margin: 0 auto;
        }

        #location {
            width: 250px;
            height: 47px;
            background-color: cyan;
            border-radius: 10px;
            font-weight: bold;
            text-align: center;

            margin-top: 10px;
            padding-top: 3px;
        }

        #map {
            width: 240px;
            height: 240px;
            background-color: palegreen;
            border-radius: 10px;
            font-weight: bold;

            margin-top: 10px;
            padding-left: 10px;
        }
    </style>
</head>

<body>
    <div id="location"></div>
    <div id="map"></div>
</body>

</html>

도착 지점에 도달하면 완료창을 띄우고 맵이 초기화된다.