>  기사  >  웹 프론트엔드  >  H5 캔버스는 Snake 게임을 구현합니다.

H5 캔버스는 Snake 게임을 구현합니다.

php中世界最好的语言
php中世界最好的语言원래의
2018-03-26 17:25:353082검색

이번에는 H5 캔버스를 이용하여 스네이크 미니게임을 구현하는 방법을 가져오겠습니다. H5 캔버스를 이용하여 스네이크 미니게임을 구현할 때 주의사항은 무엇인가요? 이 글에서는 H5 캔버스에 스네이크 게임을 구현하는 방법을 소개하고 모두와 공유합니다. ps: 이것은 단지 아이디어일 뿐이며 자세한 내용은 다음과 같습니다. 코드 주석을 참조하세요.

1. 먼저 뱀을 그립니다.

뱀의 구조를 정의하고 배열을 사용하여 뱀 머리를 포함한 여러 개의 직사각형을 저장합니다. (빨간색) 및 뱀 몸 (회색).

뱀 그리기(초기상태)

2. 뱀이 움직일 수 있다(요점)

뱀이 움직이는 방법 : 처음부터 끝까지 뱀 머리만 움직인다
  1. 뱀 머리가 겹치는 위치로 회색 사각형을 그립니다.
  2. 이 블록을 배열의 뱀 머리 뒤 한 위치에 삽입합니다. arrar.splice(0,1,direct)

마지막 블록 배열을 잘라냅니다.pop( )

  1. 뱀 머리를 세트로 이동 고정된 방향으로 하나의 그리드를 이동합니다

    1. 방향을 저장하려면 변수가 필요합니다(

      direction
    2. )
    3. 방향에 따라 이동하고, 그리드 하나를 이동합니다. a time
    4. 키 누름에 따라 방향이 바뀌어요
    3. 음식을 무작위로 넣어야 합니다
  2. 음식의 위치를 ​​무작위로 지정해야 합니다
  3. 음식이 위에 있는지 판단해야 합니다. 뱀.
  4. 4. 음식 먹기

음식이 뱀 머리와 겹치는지 확인
  1. 배열에 요소 추가(요소를 하나 덜 제거하면 요소가 하나 추가됨)
  2. 새 음식 생성

5. Gameover

  1. 벽에 부딪혔을 때 판단
  2. 직접 판단하는 척
  3. <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
        <style>
            #canvas{
                box-shadow: 0 5px 40px black;
            }
        </style>
    </head>
    <body>
        <canvas id="canvas" width="800" height="500"></canvas>
    </body>
    <script>
        var canvas = document.getElementById('canvas');
        var context = canvas.getContext('2d');
        //构造对象方块
        function Rect (x,y,w,h,color) {
            this.x = x;
            this.y = y;
            this.w = w;
            this.h = h;
            this.color = color;
        }
        //画方块的方法
        Rect.prototype.draw = function () {
            context.beginPath();
            context.fillStyle = this.color;
            context.rect(this.x,this.y,this.w,this.h);
            context.fill();
            context.stroke();
        }
        //构造对象蛇
        function Snake () {
            //定义一个空数组存放组成整蛇的方块对象
            var snakeArray = [];
            //画出4个方块,设置成灰色
            for (var i = 0; i < 4; i++) {
                var rect = new Rect(i*20,0,20,20,"gray");
                //之所以用splice(往前加)而不是用push(往后加),是为了让蛇头出现在数组第一个位置
                snakeArray.splice(0,0,rect);     
            }
            //把数组第一个作为蛇头,蛇头设成红色
            var head = snakeArray[0];
            head.color = "red";
            //此处将两个后面常用的东西定为属性,方便后面调用
            this.head = snakeArray[0];  //蛇头
            this.snakeArray = snakeArray;  //整蛇数组
            //给定初始位置向右(同keyCode右箭头)
            this.direction = 39;
        }
        //画蛇的方法
        Snake.prototype.draw = function () {
            for (var i = 0; i < this.snakeArray.length; i++) {
                this.snakeArray[i].draw();
            } 
        }
        //蛇移动的方法
        Snake.prototype.move = function () {
            //此处是核心部分,蛇的 移动方式
            //1、画一个灰色的方块,位置与蛇头重叠
            //2、将这个方块插到数组中蛇头后面一个的位置
            //3、砍去末尾的方块
            //4、将蛇头向设定方向移动一格
            var rect = new Rect(this.head.x,this.head.y,this.head.w,this.head.h,"gray");
            this.snakeArray.splice(1,0,rect);
            //判断是否吃到食物,isEat判定函数写在最后了
            //吃到则食物重新给位置,不砍去最后一节,即蛇变长
            //没吃到则末尾砍掉一节,即蛇长度不变
            if (isEat()){
                food = new getRandomFood();
            }else{
                this.snakeArray.pop();
            }
            //设置蛇头的运动方向,37 左,38 上,39 右,40 下
            switch (this.direction) {
                case 37:
                    this.head.x -= this.head.w
                    break;
                case 38:
                    this.head.y -= this.head.h
                    break;
                case 39:
                    this.head.x += this.head.w
                    break;
                case 40:
                    this.head.y += this.head.h
                    break;
                default:    
                    break;
            }
            // gameover判定
            // 撞墙
            if (this.head.x > canvas.width || this.head.x < 0 || this.head.y > canvas.height || this.head.y < 0){
                clearInterval(timer);
            }
            // 撞自己,循环从1开始,避开蛇头与蛇头比较的情况
            for (var i = 1; i < this.snakeArray.length; i++) {
                if (this.snakeArray[i].x == this.head.x && this.snakeArray[i].y == this.head.y){
                    clearInterval(timer);
                }
            }
        }
        //画出初始的蛇
        var snake = new Snake()
        snake.draw();
        //画出初始的食物
        var food = new getRandomFood()
        //定时器
        var timer = setInterval(function () {
            context.clearRect(0,0,canvas.width,canvas.height);
            food.draw();
            snake.move();
            snake.draw();
        }, 100)
        //键盘事件,其中的if判定是为了让蛇不能直接掉头
        document.onkeydown = function (e) {
            var ev = e||window.event;
            switch(ev.keyCode){
                case 37:{
                    if (snake.direction !== 39){
                        snake.direction = 37;
                    }
                    break;
                }
                case 38:{
                    if (snake.direction !== 40){
                        snake.direction = 38;
                    }
                    break;
                }
                case 39:{
                    if (snake.direction !== 37){
                        snake.direction = 39;
                    }
                    break;
                }
                case 40:{
                    if (snake.direction !== 38){
                        snake.direction = 40;
                    }
                    break;
                }    
            }
            ev.preventDefault();
        }
        //随机函数,获得[min,max]范围的值
        function getNumberInRange (min,max) {
            var range = max-min; 
            var r = Math.random();
            return Math.round(r*range+min)
        }
        //构建食物对象
        function getRandomFood () {
            //判定食物是否出现在蛇身上,如果是重合,则重新生成一遍
            var isOnSnake = true;
            //设置食物出现的随机位置
            while(isOnSnake){
                //执行后先将判定条件设置为false,如果判定不重合,则不会再执行下列语句
                isOnSnake = false;
                var indexX = getNumberInRange(0,canvas.width/20-1);
                var indexY = getNumberInRange(0,canvas.height/20-1);
                var rect = new Rect(indexX*20, indexY*20, 20, 20, "green");
                for (var i = 0; i < snake.snakeArray.length; i++) {
                    if(snake.snakeArray[i].x == rect.x && snake.snakeArray[i].y == rect.y){
                        //如果判定重合,将其设置为true,使随机数重给
                        isOnSnake = true;
                        break;
                    }
                }
            }
            //返回rect,使得实例化对象food有draw的方法
            return rect;
        }
        //判定吃到食物,即蛇头坐标与食物坐标重合
        function isEat () {
            if (snake.head.x == food.x && snake.head.y == food.y){
                return true;
            } else {
                return false;
            }
        }
    </script>
    </html>
    이 기사의 사례를 읽고 나면 방법을 마스터했다고 믿습니다. 자세한 내용은 PHP 중국어 웹사이트의 다른 관련 기사에 주목하세요!
추천 자료:

드래그 앤 드롭 정렬을 위한 H5 드래그 앤 드롭 API

  1. html5에 새로 추가된 태그는 무엇입니까

위 내용은 H5 캔버스는 Snake 게임을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.