贪吃蛇 HTML5 Canvas代码

首先建立一个二维类

function Class_Dim(cx, cy){
    var x = cx;
    var y = cy;
    this.getx = function(){
        return x;
    };
    this.gety = function(){
        return y;
    };
    this.setx = function(tx){
        x = tx;
    };
    this.sety = function(ty){
        y = ty;
    };
};

然后设置一些全局变量

var gameRunning = true;//游戏是否进行中
var canvas = document.getElementById(‘scen‘);//获取canvas
var sceneWidth = 10;//格子列数
var sceneHeight = 10;//格子行数
var canvasWidth = canvas.width;//canvas宽度
var canvasHeight = canvas.height;//canvas长度
var unitWidth = canvasWidth / sceneWidth;//
var unitHeight = canvasHeight / sceneHeight;
var snake = new Array();
var addBlocks = new Class_Dim(Math.floor((sceneWidth-1) * Math.random()) + 1, Math.floor(((sceneHeight-1) * Math.random()) + 1));//食物
var snakeDir = new Class_Dim(0, -1);//贪吃蛇移动方向
snake.unshift(new Class_Dim(sceneWidth / 2, sceneHeight / 2));//初始化

下面是绘制蛇的函数

function drawSnake(){
    var context = canvas.getContext(‘2d‘);
    context.fillStyle = ‘#223344‘;
    for(var i=0;i<snake.length;i++){
        context.fillRect(snake[i].getx() * unitWidth, snake[i].gety() * unitHeight, unitWidth, unitHeight);
    };
};

然后是绘制食物(可以考虑做成数组)


function drawAddBlocks(){
    var context = canvas.getContext(‘2d‘);
    context.fillStyle = ‘#66FF99‘;
    context.fillRect(addBlocks.getx() * unitWidth, addBlocks.gety() * unitHeight, unitWidth, unitHeight);
}

然后是贪吃蛇根据方向移动,蛇身每一段都存放在一个有序列内

首先第一个元素根据方向移动,下一个元素继承上一个元素的位置,即是贪吃蛇整体的移动方式。

判断蛇是否移动后死亡,只需判断蛇头位置。

function moveSnake(){
    var rememberx = snake[0].getx();
    var remembery = snake[0].gety();
    var isEated = false;
    var eatedBlockPointer;
    if(addBlocks.getx() == rememberx + snakeDir.getx() && addBlocks.gety() == remembery + snakeDir.gety()){
        isEated = true;
    };

    if(isEated){
        snake.unshift(new Class_Dim(addBlocks.getx(), addBlocks.gety()));
        do{
            var isLoop = false;
            addBlocks = new Class_Dim(Math.floor((sceneWidth-1) * Math.random()) + 1, Math.floor(((sceneHeight-1) * Math.random()) + 1));
            for(var i = 0; i < snake.length; i++){
                if(addBlocks.getx() == snake[i].getx() && addBlocks.gety() == snake[i].gety()) isLoop = true;
            }
        }while(isLoop);

    }
    else{
        snake[0].setx(rememberx + snakeDir.getx());
        snake[0].sety(remembery + snakeDir.gety());

        if(snake[0].getx() < 0 || snake[0].getx() >= sceneWidth || snake[0].gety() < 0 || snake[0].gety() >= sceneHeight){
            gameRunning = false;
        };

        for(var i=1;i<snake.length;i++){
            var tmpx = snake[i].getx();
            var tmpy = snake[i].gety();
            if(snake[0].getx() == tmpx && snake[0].gety() == tmpy){
                gameRunning = false;
            };
            snake[i].setx(rememberx);
            snake[i].sety(remembery);
            rememberx = tmpx;
            remembery = tmpy;
        };
    };

};

下面是完整代码:

<!DOCTYPE html>
<html>
<head>
    <meta charset=‘utf-8‘ />
    <title>贪吃蛇</title>
</head>
<body>
<canvas id="scen" width=‘600‘ height=‘600‘></canvas>

<script>
function Class_Dim(cx, cy){
    var x = cx;
    var y = cy;
    this.getx = function(){
        return x;
    };
    this.gety = function(){
        return y;
    };
    this.setx = function(tx){
        x = tx;
    };
    this.sety = function(ty){
        y = ty;
    };
};
var gameRunning = true;
var canvas = document.getElementById(‘scen‘);
var sceneWidth = 10;
var sceneHeight = 10;
var canvasWidth = canvas.width;
var canvasHeight = canvas.height;
var unitWidth = canvasWidth / sceneWidth;
var unitHeight = canvasHeight / sceneHeight;
var snake = new Array();
var addBlocks = new Class_Dim(Math.floor((sceneWidth-1) * Math.random()) + 1, Math.floor(((sceneHeight-1) * Math.random()) + 1));
var snakeDir = new Class_Dim(0, -1);
snake.unshift(new Class_Dim(sceneWidth / 2, sceneHeight / 2));

function drawSnake(){
    var context = canvas.getContext(‘2d‘);
    context.fillStyle = ‘#223344‘;
    for(var i=0;i<snake.length;i++){
        context.fillRect(snake[i].getx() * unitWidth, snake[i].gety() * unitHeight, unitWidth, unitHeight);
    };
};

function drawAddBlocks(){
    var context = canvas.getContext(‘2d‘);
    context.fillStyle = ‘#66FF99‘;
    context.fillRect(addBlocks.getx() * unitWidth, addBlocks.gety() * unitHeight, unitWidth, unitHeight);
}

function clearAll(){
    var context = canvas.getContext(‘2d‘);
    context.clearRect(0, 0, canvasWidth, canvasWidth);
}

function moveSnake(){
    var rememberx = snake[0].getx();
    var remembery = snake[0].gety();
    var isEated = false;
    var eatedBlockPointer;
    if(addBlocks.getx() == rememberx + snakeDir.getx() && addBlocks.gety() == remembery + snakeDir.gety()){
        isEated = true;
    };

    if(isEated){
        snake.unshift(new Class_Dim(addBlocks.getx(), addBlocks.gety()));
        do{
            var isLoop = false;
            addBlocks = new Class_Dim(Math.floor((sceneWidth-1) * Math.random()) + 1, Math.floor(((sceneHeight-1) * Math.random()) + 1));
            for(var i = 0; i < snake.length; i++){
                if(addBlocks.getx() == snake[i].getx() && addBlocks.gety() == snake[i].gety()) isLoop = true;
            }
        }while(isLoop);

    }
    else{
        snake[0].setx(rememberx + snakeDir.getx());
        snake[0].sety(remembery + snakeDir.gety());

        if(snake[0].getx() < 0 || snake[0].getx() >= sceneWidth || snake[0].gety() < 0 || snake[0].gety() >= sceneHeight){
            gameRunning = false;
        };

        for(var i=1;i<snake.length;i++){
            var tmpx = snake[i].getx();
            var tmpy = snake[i].gety();
            if(snake[0].getx() == tmpx && snake[0].gety() == tmpy){
                gameRunning = false;
            };
            snake[i].setx(rememberx);
            snake[i].sety(remembery);
            rememberx = tmpx;
            remembery = tmpy;
        };
    };

};

function drawNet(){
    var context = canvas.getContext(‘2d‘);
    for(var loopPointer = 0; loopPointer <= sceneWidth; loopPointer++)
    {
        context.beginPath();
        context.moveTo(loopPointer * unitWidth, 0);
        context.lineTo(loopPointer * unitWidth, canvasHeight);
        context.lineWidth = 1.0;
        context.strokeStyle = ‘#9988CC‘;
        context.stroke();
    };
    for(var loopPointer = 0; loopPointer <= sceneHeight; loopPointer++){
        context.beginPath();
        context.moveTo(0, loopPointer * unitHeight);
        context.lineTo(canvasWidth, loopPointer * unitHeight);
        context.lineWidth = 1.0;
        context.strokeStyle = ‘#9988CC‘;
        context.stroke();
    };
};

function run(){
        moveSnake();
    if(gameRunning){
        clearAll();
        drawNet();
        drawSnake();
        drawAddBlocks();
    }

}

document.onkeypress = function(e){
    switch(e.which){
        case 119:
            if(snakeDir.gety() != 1){
                snakeDir = new Class_Dim(0, -1);
            }
        break;
        case 115:
            if(snakeDir.gety() != -1){
                snakeDir = new Class_Dim(0, 1);
            }
        break;
        case 97:
            if(snakeDir.getx() != 1){
                snakeDir = new Class_Dim(-1, 0);
            }
        break;
        case 100:
            if(snakeDir.getx() != -1){
                snakeDir = new Class_Dim(1, 0);
            }
        break;
    }
}

setInterval("run()",300);

</script>
</body>
</html>
时间: 2024-10-18 23:44:57

贪吃蛇 HTML5 Canvas代码的相关文章

贪吃蛇C语言代码

贪吃蛇C语言代码 贪吃蛇C语言代码 手动贪吃蛇 智能贪吃蛇 1.手动贪吃蛇 /*蛇越长跑得越快*/ /*作者:SGAFPZ*/ #include <stdio.h> #include <windows.h> #include <stdlib.h> #include <math.h> //#include <unistd.h> #include <conio.h> #include <string.h> #include &

2015.4.23 贪吃蛇、canvas动画,各种上传工具,url信息匹配以及最全前端面试题等

1.面向对象贪吃蛇 2.css中:hover 改变图片 页面加载完 第一次鼠标移入会闪一下 这是为啥? 解决方法:你把两张图合成一张图或者是先把图片加载到页面上,然后再hover出来. 解析:图片改变了,不管网速快慢它都有个加载时间. 3.好的canvas动画工具 或者游戏的推荐: 解决方法:工具推荐-1&工具推荐-2 4.下面代码为什么在Chrome下会报错? var log = console.log; log("test"); 解决方法:改为以下代码 log = cons

贪吃蛇的java代码分析(一)

自我审视 最近自己学习java已经有了一个多月的时间,从一开始对变量常量的概念一无所知,到现在能勉强写几个小程序玩玩,已经有了长足的进步.今天没有去学习,学校里要进行毕业答辩和拍毕业照了,于是请了几天的假,自己也就有了一点空余的时间.回想这一个多月,自己做到好的地方是把大部分时间都用在了看书和码代码上,学习的重点放在了追求对知识的理解和内容的广度之上.书籍方面阅读了<java核心技术>和<java编程思想>,虽然说没有理解全部的内容,<编程思想>一书也只看了300多页,

贪吃蛇的java代码分析(二)

代码剖析 贪吃蛇是一款十分经典的小游戏,对初入coding的朋友来说,拿贪吃蛇这样一个案例来练手十分合适,并不高的难度和成功后的成就感都是学习所必须的.下面我将依照我当时的思路,来逐步分析实现的整个过程. 让我们逐一分析.首先,整个游戏最基本的元素是地图.在java中用于绘图的类是swing和awt,在这里主要用到swing类.swing中用于窗口显示的类有JFrame及其子类.JFrame可以直接添加组件,但其本质是将组件添加到JFrame中的一个默认面板里,为了代码清晰,我会使用JPanel

Java实现贪吃蛇游戏【代码】

花了两个下午写了一个贪吃蛇小游戏,本人想写这游戏很长时间了.作为以前诺基亚手机上的经典游戏,贪吃蛇和俄罗斯方块一样,都曾经在我们的童年给我们带来了很多乐趣.世间万物斗转星移,诺基亚曾经作为手机业的龙头老大,现如今也一步步走向衰落,被收购,再过不久估计就要退出手机业务了,而贪吃蛇这款游戏也基本上没人玩了,甚至在新一代人的印象中都已毫无记忆了...但是,这款游戏在它基础上经过改造其实可以弄出很多花样,也确实可以在一定程度上锻炼自己的编程能力.前不久十分火热的贪吃蛇大作战其实就可以看做是在这款游戏的基

js贪吃蛇 纯手打 代码比较复杂 自己瞎弄的 bug 比较多 自己一点一点排除弄 完全原创

//虽然代码没有别人写的简单,但是这是自己的思想,通过这次实例,学到了很多,也发现了很多不足,努力学习啊,小小的贪吃蛇也包含了很多东西还有 //好多问题需要解决,比如,如何判断蛇头碰到蛇身,如何让食物不出现在蛇的身上等,欢迎大家一起探讨 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dt

生命游戏HTML5 Canvas代码

生命游戏是英国数学家约翰·何顿·康威在1970年发明的细胞自动机.它最初于1970年10月在<科学美国人>杂志中马丁·葛登能(Martin Gardner,1914年11月21日-2010年5月22日.又译:马丁·加德纳)的"数学游戏"专栏出现. 生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞.一个 细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量.如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏

Java小游戏贪吃蛇

package snake; import java.awt.BorderLayout;import java.awt.Canvas;import java.awt.Color;import java.awt.Container;import java.awt.Graphics;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;import java.util.Arrays;import java.util.Itera

JavaScript实现简单贪吃蛇小游戏

之前上Web课,学到JavaScript的时候,老师要求写几个静态页面,要用到JavaScript.想了想就写个贪吃蛇吧.其实之前用pygame写过一次GUI的贪吃蛇,素材都是自己拿画图画的,其丑无比.所以这次还是老老实实用字符吧. 首先,是一些全局变量的定义: 1 <script> 2 var state = 0;//0 wait 1 run 2 over 3 var width = 40; 4 var height = 25; 5 var update = false; 6 var dir