用canvas和原生js写的一个贪吃蛇游戏

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta name="viewport" charset="utf-8" content="width=device-width,user-scalable=no,initial-scale=1"/>
    <style type="text/css">
        body, div, span, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, a, big, em, font, img, strong, tt, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, table, caption, tbody, tfoot, thead, tr, th, td {
            margin: 0;
            padding: 0;
            outline: none;
            border: none;
            resize: none;
            word-break: break-all;
            word-wrap: break-word;
        }
        html, body {
            height: 100%;
            margin: 0;
        }
        .body{width: 100%;height: 100%;background-color: #77c68b;}
        #canvas{position: absolute;left:50%;margin-left: -400px;background-color: #fff;}
    </style>


</head>
<body>
<div class="body">
<canvas id="canvas" width="800" height="800"></canvas>
    <label id="grade"></label>
</div>


<script type="text/javascript">
var canvas=document.getElementById('canvas');
var context=canvas.getContext('2d');
var gradelabel=document.getElementById("grade");
var  rectcoord=[21,22,23],
     rectx=0,
     recty=0,
     rect=[],
     rectnum=0,
     mark=true,
     speed=100,
     dir= 2,
     movenum= 1,
     foodcoord= 0,
     grade= 0,
     head=0;




//绑定键盘事件
document.addEventListener("keydown",function(e){
            var e=e||event;
            var currKey=e.keyCode||e.which||e.charCode;
            switch(currKey){
                case 37:if(dir!=2){dir=4}break;//左
                case 38:if(dir!=3){dir=1}break;//上
                case 39:if(dir!=4){dir=2}break;//右
                case 40:if(dir!=1){dir=3}break;//下
                default:break;
            }


        });
//绘制蛇身
function snack() {
    if(mark){
       foodcoord=food();
    }
    context.clearRect(0,0,canvas.width,canvas.height);
    canvas.width=canvas.width;
    for(var a=0;a<20;a++){
        for(var b=0;b<20;b++){
            temp="context.beginPath();context.rect("+rectx+","+recty+", 40, 40);context.fillStyle = 'white';context.fill();" +
                    "context.strokeStyle = 'white';context.stroke();";
            rect.push(temp);
            rectx<760?rectx+=40:rectx=0;
        }
        recty<800?recty+=40:recty=0;
    }
    var c=rectcoord.length;
     for(var d=0;d<c;d++){
         rect[rectcoord[d]]=rect[rectcoord[d]].replace(/white/g,"green");
     }
        rect[foodcoord]=rect[foodcoord].replace(/white/g,"orangered");
        eval(rect.join(""));
        rect=[],rectx=0,recty=0,mark=false;
        snackmove();
        gradelabel.innerHTML="得分:"+grade+"";
}


//绘制食物
function food(){
   var ispass=true;
   var a= parseInt(Math.random()*400);
        for(var b in rectcoord){
            if(a==rectcoord[b]){
                ispass=false;
                break;
            }
        }
    return ispass?a:food();
}


//死亡
function die(){
    var a=rectcoord.length;
    var diecoord=rectcoord.slice(0,a-1);
    for(var b in diecoord){
        if(head==diecoord[b]){
            clearInterval(begin);
            setTimeout(function(){
                context.beginPath();
                context.clearRect(0,0,canvas.width,canvas.height);
                canvas.width=canvas.width;
                context.fillStyle = '#ee6a39';
                context.font = '50px Calibri';
                context.fillText("游戏结束,得分:"+grade+"",220,375);
                context.lineJoin = 'miter';
                context.stroke();
            },1500);
            break;
        }
    }
}


//蛇身移动
 function snackmove(){
     var b= rectcoord.shift();
     var a= rectcoord.pop();
     rectcoord.push(a);
     switch (dir){
         case 1:movenum=-20;if(a+movenum<0){movenum=380;}break;
         case 2:movenum=1;if(a%20==19){movenum=-19;}break;
         case 3:movenum=20;if(a+movenum>399){movenum=-380;}break;
         case 4:movenum=-1;if(a%20==0){movenum=19;}break;
     }
     head=a+movenum;
     rectcoord.push(head);
     //吃食物
     if(head==foodcoord){
         rectcoord.unshift(b);
         foodcoord=food();
         grade++;
         if(grade%50==0){
             speed-=10;
         }
     }
     die();
 }
var begin=setInterval("snack()",speed);
</script>
</body>
</html>

转载于:https://my.oschina.net/Ztachi/blog/367291

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
网络应用开发是一项外延很广的领域,在企业级开发中,我们要学习各种服务器通信技术、软件架构及开发框架,而在另外一些实用软件及游戏的开发中,则又需要投入大量时间进行网页前端的美化。 从开发者学习知识的角度看,如果将HTML、JavaScript、CSS等制作网络应用程序所需的技术分开研究,则难以把握它们之间的联系,本书的出现正好解决了这个问题。 《HTML5 Canvas核心技术:图形、动画与游戏开发》是HTML5 Canvas领域的标杆之作,也是迄今为止该领域内容最为全面和深入的著作之一,是公认的权威经典、Amazon五星级超级畅销书、资深技术专家David Geary力作。 它不仅全面讲解了canvas元素的API,以及如何利用Canvas进行图形绘制、动画制作、物理效果模拟、碰撞检测、游戏开发、移动应用开发,还包含大量实例,可操作性极强。 本书作者David Geary清晰而又透彻的行文风格,不仅把图形绘制、动画制作、游戏开发、自定义控件、移动开发等几项重要知识讲解得十分精彩,而且还启迪了我们的开发思路。 读完全书之后,大家更需要思考如何利用JavaScript程序,将类似Canvas这样的新兴技术与传统的HTML、CSS结合起来,开发出更加丰富灵活的网络应用程序来。 本书适合:具有HTML/CSS/JavaScript基础,并不需要读者有太深的功底;对HTML5 Canvas画图功能感兴趣的读者阅读。
### 回答1: 好的,我可以帮您解答这个问题。以下是用JavaScript编一个简单的贪吃游戏的示例代码: HTML: ``` <!DOCTYPE html> <html> <head> <title>贪吃游戏</title> <style> canvas { border: 1px solid #000; } </style> </head> <body> <canvas id="canvas"></canvas> <script src="snake.js"></script> </body> </html> ``` JavaScript: ``` const canvas = document.getElementById("canvas"); const ctx = canvas.getContext("2d"); // 定义格子大小和数量 const gridSize = 10; const gridWidth = canvas.width / gridSize; const gridHeight = canvas.height / gridSize; // 定义贪吃的初始位置和长度 let snake = [{ x: 5, y: 5 }]; let snakeLength = 1; // 定义食物的初始位置 let food = { x: Math.floor(Math.random() * gridWidth), y: Math.floor(Math.random() * gridHeight), }; // 定义移动方向 let direction = "right"; // 游戏循环 function gameLoop() { // 移动贪吃 let head = { x: snake[0].x, y: snake[0].y }; switch (direction) { case "up": head.y -= 1; break; case "down": head.y += 1; break; case "left": head.x -= 1; break; case "right": head.x += 1; break; } // 判断是否吃到食物 if (head.x === food.x && head.y === food.y) { snakeLength += 1; food = { x: Math.floor(Math.random() * gridWidth), y: Math.floor(Math.random() * gridHeight), }; } else { snake.pop(); } // 判断游戏是否结束 if (head.x < 0 || head.x >= gridWidth || head.y < 0 || head.y >= gridHeight) { clearInterval(intervalId); alert("游戏结束"); return; } for (let i = 1; i < snake.length; i++) { if (head.x === snake[i].x && head.y === snake[i].y) { clearInterval(intervalId); alert("游戏结束"); return; } } snake.unshift(head); // 绘制游戏画面 ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.fillStyle = "#000"; ctx.fillRect(food.x * gridSize, food.y * gridSize, gridSize, gridSize); for (let i = 0; i < snake.length; i++) { ctx.fillStyle = "#00f"; ctx.fillRect(snake[i].x * gridSize, snake[i].y * gridSize, gridSize, gridSize); } } let intervalId = setInterval(gameLoop, 100); // 监听键盘事件 document.addEventListener("keydown", function (event) { switch (event.key) { case "ArrowUp": if (direction !== "down") { direction = "up"; } break; case "ArrowDown": if (direction !== "up") { ### 回答2: 贪吃是一款经典的游戏,可以使用JavaScript来实现。以下是一个简单的贪吃游戏的实现思路。 1. 首先,我们需要创建一个游戏画面,并在画面上绘制和食物。可以使用HTML5中的canvas元素来实现。定义一个canvas标签,并为其指定id,方便后续的JavaScript操作。 2. 创建一个JavaScript文件,使用document.getElementById()方法获取到canvas标签对象。接下来,使用canvas的getContext('2d')方法创建一个2D画布。 3. 定义的初始位置、长度和移动方向等变量。可以使用二维数组来表示的位置坐标,用一个数组来表示的身体,其中第一个元素为头。移动方向可以使用一个变量来表示。 4. 实现的移动功能。可以使用定时器来控制的移动速度。每次移动时,根据移动方向更新的位置。如果头与食物位置重合,的长度增加,并重新生成一个食物。 5. 实现用户的操作控制。可以使用键盘事件监听用户的操作,并根据按下的键更新移动方向。 6. 判断游戏是否结束。游戏结束的条件有头碰到边界,或者头碰到了的身体。当游戏结束时,停止定时器,给用户一个游戏结束的提示。 7. 完善游戏的界面。可以添加一些样式和效果,让游戏更加美观。 这样,一个简单的贪吃游戏就完成了。你可以根据实际需求对游戏进行扩展,例如增加关卡、计分等功能,使游戏更加有趣。 ### 回答3: 贪吃游戏是一种经典的游戏,我们可以使用JavaScript来一个简单的贪吃游戏。 首先,我们需要创建一个游戏窗口。我们可以使用HTML的`<canvas>`元素来创建一个游戏区域。接下来,我们需要在JavaScript中获取这个`<canvas>`元素,并设置其宽度和高度。 然后,我们需要定义贪吃的初始位置、方向和长度。我们可以使用数组来存储贪吃的每个身体部分的坐标。 接下来,我们需要定义游戏的逻辑。我们可以使用`setInterval`函数来不断更新游戏画面,制造一种动态效果。每隔一段时间,游戏会根据贪吃当前的方向来更新的位置。 当贪吃吃到食物时,我们需要增加贪吃的长度并生成新的食物。我们可以使用随机函数来生成食物的坐标,同时避免和贪吃的身体重叠。 游戏的结束条件通常是贪吃撞到了边界或者撞到了自己的身体。当游戏结束时,我们可以弹出一个提示框显示游戏结束,并提供重新开始游戏的选项。 最后,我们需要监听用户的按键事件,根据用户的操作来改变贪吃的方向。我们可以使用`keydown`事件来监听按键的按下,并根据按键的方向来改变贪吃的移动方向。 以上就是使用JavaScript一个贪吃游戏的大致思路。通过不断地调试和完善,我们可以实现一个具有基本功能的贪吃游戏。当然,想要实现更加复杂和高级的功能,还需要进一步的学习和尝试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值