我们一起写个Web贪吃蛇小游戏吧(一) | 新手向 ⛵

举报
Regan Yue 发表于 2021/06/26 23:27:41 2021/06/26
【摘要】 这只是大学生博主记录完成Web大作业的全过程。欢迎各位指点,谢谢!<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Snake</title></h...

这只是大学生博主记录完成Web大作业的全过程。欢迎各位指点,谢谢!

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Snake</title>
</head>
<body>
    <button onclick="gamaStart()">Start</button>
    <h1 id="score_id">0</h1>
    <canvas width="400" height="400" id="canvas_id"></canvas>
</body>
</html>

第一步 页面主干

首先写一个开始游戏的按钮:

<button onclick="gamaStart()">Start</button>

当点击按钮时,开始游戏。

然后因为我希望分数能够显示出来,于是用了h1标签显示分数。

然后新建一个400*400像素的画布。

第二步 设置背景

var gameInterval

function gamaStart() {
    gameInterval = setInterval(gameRoutine, 1000)//每1000毫秒,执行一次

}

function gameRoutine(){
    updateCanvas() //更新画布
}

function updateCanvas(){
    var canvas = document.getElementById('canvas_id') //取画布
    var context = canvas.getContext('2d') //取得画布的context

    context.fillStyle = 'black' //用黑色填满
    context.fillRect(0,0,canvas.width,canvas.height) //填充的范围


}

执行开始游戏函数是先取出画布,画布用黑色填充。

然后为画布设置每1000毫秒也就是1秒更新一次。

下面开始进入游戏的主逻辑

第三步 画蛇

var BLOCK_SIZE = 20 //每格是20个像素
var BLOCK_COUNT = 20 //20个格子

var gameInterval
var snack

function gamaStart() {
    snack ={
        body: [
            { x:BLOCK_COUNT/2 , y:BLOCK_COUNT/2 }
        ],
        size: 1,
        direction:{ x:0 , y:-1}
    }
    gameInterval = setInterval(gameRoutine, 1000)//每1000毫秒,执行一次

}

}

var BLOCK_SIZE = 20 代表每格是20个像素

var BLOCK_COUNT = 20 代表总共有20个格子。

snack ={
        body: [
            { x:BLOCK_COUNT/2 , y:BLOCK_COUNT/2 }
        ],
        size: 1,
        direction:{ x:0 , y:-1}
    }

其中body代表身体区块的每一个坐标,size代表长度,direction代表初始方向向上。

function gameRoutine(){
    moveSnack() //蛇移动 
    updateCanvas() //更新画布
}

function moveSnack(){
    var newBlock = {
        x: snack.body[0].x + snack.direction.x, //新区块 x坐标
        y: snack.body[0].y + snack.direction.y //新区块 y坐标
    }

    snack.body.unshift(newBlock) //加在数组最前面


    while(snack.body.length > snack.size){
        snack.body.pop()  //蛇移动后 尾巴断掉
    }
}

function updateCanvas(){
    var canvas = document.getElementById('canvas_id') //取画布
    var context = canvas.getContext('2d') //取得画布的context

    context.fillStyle = 'black' //用黑色填满
    context.fillRect(0,0,canvas.width,canvas.height) //填充的范围
    //为每一个格子填充颜色
    for(var i=0;i<snack.body.length;i++){
        context.fillRect(
            snack.body[i].x * BLOCK_SIZE,
            snack.body[i].y * BLOCK_SIZE,
            BLOCK_SIZE,
            BLOCK_SIZE
        )
    }
}


编写一个moveSnack函数,用于给蛇移动,将头添加,将蛇尾巴去掉,然后更新画布,蛇就在移动了。

updateCanvas()里面用了一个for循环画蛇。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。