canvas 绘制贪吃蛇游戏

简介: 效果如下代码<!DOCTYPE html><html lang="zh_CN"><head> <meta charset="UTF-8"> <title>贪吃蛇</title> <script src="https://code.

效果如下

--_063

代码

<!DOCTYPE html>
<html lang="zh_CN">
<head>
    <meta charset="UTF-8">
    <title>贪吃蛇</title>
    <script src="https://code.jquery.com/jquery-3.3.1.js"></script>
</head>
<body>
<canvas id="canvas" width="400" height="400"></canvas>
<script src="./js/main.js"></script>
</body>
</html>
let canvas = document.getElementById("canvas");
let context = canvas.getContext("2d");
// 分数记录
let fraction = 0;
// 定义贪吃蛇的组成,方块对象
class Block{
    // 按照size的大小划分行列
    // 列
    col;
    // 行
    row;
    // 大小
    size;
    constructor(col, row, size){
        this.col = col;
        this.row = row;
        this.size = size;
    }
    // 画方法
    draw(){
        context.fillRect(this.col * this.size, this.row * this.size, this.size, this.size);
    }
}
// 蛇类
class Snake{
    body = [new Block(20, 20, 10), new Block(20, 21, 10)];
    direction = "right";
    apple;
    constructor(apple) {
        this.apple = apple;
    }
    draw(){
        for(let i = 0; i < this.body.length; i++){
            this.body[i].draw();
        }
    };
    move(){
        let head = this.body[0];
        // 用于生成新蛇的方块
        let newhead;
        if(this.direction == "right"){
            newhead = new Block(head.col + 1, head.row, head.size);
        }
        if(this.direction == "left"){
            newhead = new Block(head.col - 1, head.row, head.size);
        }
        if(this.direction == "up"){
            newhead = new Block(head.col, head.row - 1, head.size);
        }
        if(this.direction == "down"){
            newhead = new Block(head.col, head.row + 1, head.size);
        }
        // 增加头部
        this.body.unshift(newhead);
        // 进行判断蛇头是否碰到了苹果,若碰到了则不删除最后一个方块,反之删除最后一个方块
        if(newhead.col == this.apple.col
            && newhead.row == this.apple.row){
            // 进行检测,如果生成在蛇身上,继续生成,反之结束循环
            while(true){
                this.apple.initialization();
                for(let i = 0; i < this.body.length; i++){
                    if(this.apple.row == this.body[i].row
                        && this.apple.col == this.body[i].col){
                        this.apple.initialization();
                    }
                }
                break;
            }
            // 分数加入
            fraction++;
        }else{
            // 弹出
            this.body.pop();
        }
    };
    // 碰撞检测
    impactChecking(){
        // 获取头节点
        let newBody = this.body[0];
        console.log(newBody.col);
        // 查看行,列是否超过边界
        if(newBody.col > 40
            || newBody.row > 40
            || newBody.row < 0
            || newBody.col < 0){
            alert("游戏结束");
            fraction = 0;
            this.body = [new Block(20, 20, 10), new Block(20, 21, 10)];
        }
        // 查看是否碰到自己身体
        for(let i = 1; i < this.body.length; i++){
            if(newBody.col == this.body[i].col
                && newBody.row == this.body[i].row){
                alert("游戏结束");
                fraction = 0;
                this.body = [new Block(20, 20, 10), new Block(20, 21, 10)];
            }
        }
    }
}
// 实物,苹果类
class Apple{
    // 列
    col;
    // 行
    row;
    sizeR;
    constructor(){
        this.initialization();
    };
    // 初始化苹果
    initialization(){
        // 生成列坐标
        this.col = Math.floor(Math.random() * (40 - 1) + 1);
        // 生成行坐标
        this.row = Math.floor(Math.random() * (40 - 1) + 1);
        // 设置苹果半径
        this.sizeR = 5;
    }
    // 画苹果的方法
    draw(){
        // 颜色
        context.fillStyle = "Red";
        // 画苹果
        context.beginPath();
        // 圆心坐标
        context.arc(this.col * this.sizeR * 2 + this.sizeR, this.row * this.sizeR * 2 + this.sizeR, this.sizeR, 0, Math.PI * 2, false);
        // 填充
        context.fill();
        // 恢复原来颜色
        context.fillStyle = "Black";
    }
}
// 生成一个苹果
let apple = new Apple();
// 生成一个蛇
let snake = new Snake(apple);
setInterval(() => {
    context.clearRect(0, 0, 400, 400);
    // 绘制分数
    context.fillText("分数为 " + fraction, 10, 10);
    // 绘制蛇
    snake.draw();
    // 对蛇进行移动
    snake.move();
    // 绘制苹果
    apple.draw();
    // 进行检测
    snake.impactChecking();
    context.strokeRect(0, 0, 400, 400);
}, 200);
// 对贪吃蛇控制
// 上下左右运动
$("body").keydown((event) => {
    // 左
    if(event.keyCode == 37 && snake.direction != "right"){
        snake.direction = "left";
    }
    // 上
    if(event.keyCode == 38 && snake.direction != "down"){
        snake.direction = "up";
    }
    // 右
    if(event.keyCode == 39 && snake.direction != "left"){
        snake.direction = "right";
    }
    // 下
    if(event.keyCode == 40 && snake.direction != "up"){
        snake.direction = "down";
    }
});

思路

思路,蛇由两个类组成,方块类和蛇类,蛇类的存在依赖于方块类。蛇类当中的body保存当前蛇类的所有的方块。绘图,直接遍历body内部的所有绘图方法。移动,根据保存的私有变量方向用来对数组中保存的方块对象进行更改
还有一个苹果类。用于进行随机生成
吃苹果,在移动方法中,如果蛇的头方块和苹果方块重合那么吃到苹果,重新调用生成苹果方法。
碰撞检测,如果行和列超过范围,即碰撞发生
最重要的,坐标行和列化,使用的时候乘以一个数就行

目录
相关文章
|
1月前
|
移动开发 前端开发 HTML5
彩色大风车泡泡Canvas特效
彩色大风车泡泡Canvas特效
26 7
彩色大风车泡泡Canvas特效
|
9月前
|
前端开发
canvas画布实现代码雨
canvas画布实现代码雨
65 0
|
10月前
|
移动开发 前端开发 JavaScript
利用Canvas进行网上绘图
利用Canvas进行网上绘图
167 0
|
Web App开发 存储 移动开发
用 Canvas 实现一个太阳系动画效果
用 Canvas 实现一个太阳系动画效果
用 Canvas 实现一个太阳系动画效果
|
前端开发 JavaScript
教你如何用Canvas绘制整身的哆啦A梦
教你如何用Canvas绘制整身的哆啦A梦 上牌你文章我们说到了如何使用canvas绘制哆啦A梦,但当时只是绘制了哆啦A梦的头部,之后有学员留言说可不可以教大家绘制整身的哆啦A梦,想了想,决定安排一下。如图: 在这里插入图片描述 HTML代码: &lt;canvas id=&quot;my_canvas&quot;&gt;&lt;/canvas&gt; &lt;canvas id=&quot;my_canvas2&quot;&gt;&lt;/canvas&gt; 1 2 CSS代码: * { margin: 0; } #my_canvas {
教你如何用Canvas绘制整身的哆啦A梦
|
前端开发 JavaScript
教你如何利用canvas画布绘制哆啦A梦
订阅专栏 教你如何利用canvas画布绘制哆啦A梦 最近一直在练习使用canvas画布标签,今天教大家如何使用canvas画布绘制哆啦A梦。如图: HTML代码: <canvas id="my_canvas"></canvas> 1 CSS代码: canvas { display:block; margin:0 auto; background: pink } 1 2 3 4 5 JavaScript代码: var oCanvas = document.getEleme
教你如何利用canvas画布绘制哆啦A梦
|
前端开发
canvas绘制五角星
canvas绘制五角星
147 0
|
程序员 C# 图形学
使用 C# Graphics 绘图来绘制一个足球
2022卡塔尔世界杯是足球爱好者的狂欢,这与我毫无关系,作为一个缺乏运动的人,还是不要去看人家玩命的运动了。虽然不看球,不过这波热度的持续冲击,还是让我在朋友圈刷到了结局 ———— 球王梅西如愿以偿捧得金杯,后起之秀姆巴佩加冕金靴。但作为程序员,为了增加一些参与感我就拿 C# 画个足球图案吧。
161 0
使用 C# Graphics 绘图来绘制一个足球
|
前端开发
用canvas绘制一个烟花动画
前言 在我们日常开发中贝塞尔曲线无处不在: svg 中的曲线(支持 2阶、 3阶) canvas 中绘制贝塞尔曲线 几乎所有前端2D或3D图形图表库(echarts,d3,three.js)都会使用到贝塞尔曲线 所以掌握贝塞尔曲线势在必得。这篇文章主要是实战篇,不会介绍和贝塞尔相关的知识, 如果有同学对贝塞尔曲线不是很清楚的话:可以查看我这篇文章——深入理解SVG 绘制贝塞尔曲线 第一步我们先创建ctx, 用ctx 画一个二阶贝塞尔曲线看下。二阶贝塞尔曲线有1个控制点,一个起点,一个终点。 const canvas = document.getElementById( 'canvas'
用canvas绘制一个烟花动画