Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript中用画布canvans做贪吃蛇

JavaScript中用画布canvans做贪吃蛇

作者头像
马克社区
发布于 2022-04-12 11:29:56
发布于 2022-04-12 11:29:56
23400
代码可运行
举报
文章被收录于专栏:高端IT高端IT
运行总次数:0
代码可运行
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
 
<head>
    <meta charset="UTF-8">
    <title>贪吃蛇</title>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
            font-family: "Microsoft YaHei";
        }
        
        #page {
            margin-right: auto;
            margin-left: auto;
            margin-top: 20px;
            height: 600px;
            width: 980px;
        }
        
        #yard {
            width: 800px;
            border: 1px solid gray;
            box-shadow: 0 0 10px black;
            float: right;
        }
        
        #mark {
            font-weight: 800;
        }
        
        #mark_con {
            color: red;
        }
        
        button {
            width: 50px;
        }
        
        a {
            text-decoration: none;
        }
    </style>
    <script type="text/javascript">
        //伪常量
        var BLOCK_SIZE = 20; //格子大小
        var COLS = 40; //列数
        var ROWS = 30; //行数
        //变量
        var snakes = []; //保存蛇坐标
        var c = null; //绘图对象
        var toGo = 3; //行进方向
        var snakecount = 4; //蛇身数量
        var interval = null; //计时器
        var foodX = 0; //食物X轴坐标
        var foodY = 0; //食物Y轴坐标
        var oMark = null; //分数显示框
        var isPause = false; //是否暂停
        // 绘图函数
        function draw() {
            c.clearRect(0, 0, BLOCK_SIZE * COLS, BLOCK_SIZE * ROWS);
            //画出横线
            for (var i = 1; i <= ROWS; i++) {
                c.beginPath();
                c.moveTo(0, i * BLOCK_SIZE);
                c.lineTo(BLOCK_SIZE * COLS, i * BLOCK_SIZE);
                c.strokeStyle = "gray";
                c.stroke();
            }
            //画出竖线
            for (var i = 1; i <= COLS; i++) {
                c.beginPath();
                c.moveTo(i * BLOCK_SIZE, 0);
                c.lineTo(i * BLOCK_SIZE, BLOCK_SIZE * ROWS);
                c.stroke();
            }
            //画出蛇
            for (var i = 0; i < snakes.length; i++) {
                c.beginPath();
                c.fillStyle = "green";
                c.fillRect(snakes[i].x, snakes[i].y, BLOCK_SIZE, BLOCK_SIZE);
                c.moveTo(snakes[i].x, snakes[i].y);
                c.lineTo(snakes[i].x + BLOCK_SIZE, snakes[i].y);
                c.lineTo(snakes[i].x + BLOCK_SIZE, snakes[i].y + BLOCK_SIZE);
                c.lineTo(snakes[i].x, snakes[i].y + BLOCK_SIZE);
                c.closePath();
                c.strokeStyle = "white";
                c.stroke();
            }
            //画出食物
            c.beginPath();
            c.fillStyle = "yellow";
            c.fillRect(foodX, foodY, BLOCK_SIZE, BLOCK_SIZE);
            c.moveTo(foodX, foodY);
            c.lineTo(foodX + BLOCK_SIZE, foodY);
            c.lineTo(foodX + BLOCK_SIZE, foodY + BLOCK_SIZE);
            c.lineTo(foodX, foodY + BLOCK_SIZE);
            c.closePath();
            c.strokeStyle = "red";
            c.stroke();
        }
        //游戏初始化
        function start() {
            for (var i = 0; i < snakecount; i++) {
                snakes[i] = {
                    x: i * BLOCK_SIZE,
                    y: 0
                };
            }
            addFood();
            draw();
            oMark.innerHTML = 0;
        }
        //移动函数
        function move() {
            switch (toGo) {
                case 1: //左边
                    snakes.push({
                        x: snakes[snakecount - 1].x - BLOCK_SIZE,
                        y: snakes[snakecount - 1].y
                    });
                    break;
                case 2: //上边
                    snakes.push({
                        x: snakes[snakecount - 1].x,
                        y: snakes[snakecount - 1].y - BLOCK_SIZE
                    });
                    break;
                case 3: //右边
                    snakes.push({
                        x: snakes[snakecount - 1].x + BLOCK_SIZE,
                        y: snakes[snakecount - 1].y
                    });
                    break;
                case 4: //下边
                    snakes.push({
                        x: snakes[snakecount - 1].x,
                        y: snakes[snakecount - 1].y + BLOCK_SIZE
                    });
                    break;
                default:
                    ;
            }
            snakes.shift();
            isEat();
            isDie();
            draw();
        }
        //吃到食物判断
        function isEat() {
            if (snakes[snakecount - 1].x == foodX && snakes[snakecount - 1].y == foodY) {
                oMark.innerHTML = (parseInt(oMark.innerHTML) + 1).toString();
                addFood();
                addSnake();
            }
        }
        //添加蛇身
        function addSnake() {
            snakecount++;
            snakes.unshift({
                x: BLOCK_SIZE * COLS,
                y: BLOCK_SIZE * ROWS
            });
        }
        //交互响应函数
        function keydown(keyCode) {
            switch (keyCode) {
                case 37: //左边
                    if (toGo != 1 && toGo != 3) toGo = 1;
                    break;
                case 38: //上边
                    if (toGo != 2 && toGo != 4) toGo = 2;
                    break;
                case 39: //右边
                    if (toGo != 3 && toGo != 1) toGo = 3;
                    break;
                case 40: //下的
                    if (toGo != 4 && toGo != 2) toGo = 4;
                    break;
                case 80: //开始/暂停
                    if (isPause) {
                        interval = setInterval(move, 100);
                        isPause = false;
                        document.getElementById('pause').innerHTML = "Pause";
                    } else {
                        clearInterval(interval);
                        isPause = true;
                        document.getElementById('pause').innerHTML = "Start";
                    }
                    break;
            }
        }
        //制造食物
        function addFood() {
            foodX = Math.floor(Math.random() * (COLS - 1)) * BLOCK_SIZE;
            foodY = Math.floor(Math.random() * (ROWS - 1)) * BLOCK_SIZE;
            // console.log(foodX + " -- " + foodY);
        }
        //死亡判断
        function isDie() {
            if (snakes[snakecount - 1].x == -20 || snakes[snakecount - 1].x == BLOCK_SIZE * COLS ||
                snakes[snakecount - 1].y == -20 || snakes[snakecount - 1].y == BLOCK_SIZE * ROWS) {
                alert("Game Over!");
                clearInterval(interval);
            }

更多内容请见原文,文章转载自:https://blog.csdn.net/weixin_44519496/article/details/118540838

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
听说最近HTML5很火~~!---贪吃蛇小游戏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>贪吃蛇</title> <style type="text/css"> *{margin:0;padding: 0;font-family: "Microsoft YaHei";} #page{margin-right: auto;margin-left: auto; margin-top: 20px;height: 600px; width:
赵腰静
2018/03/09
8370
贪吃蛇的使命 | 零基础入门贪吃蛇游戏(附源码、演示地址)
大家好啊,老铁们,二零二零年八月二十九日,一个人来到成都的第六天。人生总有许许多多的不如意。每天都会遇见不同的人,经历不同的事,还好我们年轻,经得起折腾!
C you again
2020/09/11
7640
贪吃蛇的使命 | 零基础入门贪吃蛇游戏(附源码、演示地址)
使用宝塔面板搭建网站服务,并实现公网远程访问「内网穿透」
宝塔面板作为简单好用的服务器运维管理面板,它支持Linux/Windows系统,我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等,通过Web端轻松管理服务器。
iOS Magician
2023/10/11
2.8K0
使用宝塔面板搭建网站服务,并实现公网远程访问「内网穿透」
canvas画出时钟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> .clock { width: 400px; margin: 100px auto; background: #ddd; border-radius: 20px;
IT工作者
2022/02/08
3960
100行代码,使用 Pygame 制作一个贪吃蛇小游戏!
相信我们大家都玩过贪吃蛇游戏,今天我们就从头一起来写一个贪吃蛇小游戏,只需要100多行的代码就完成了
周萝卜
2021/10/13
4K1
程序员是怎么玩贪吃蛇的?
前言 看别人玩贪吃蛇永远牛逼,自己玩永远菜鸡... http://mpvideo.qpic.cn/0bf224aayaaaoiah2vnkefqfbv6dbtlqadaa.f10002.mp4
DeROy
2021/06/01
5430
程序员是怎么玩贪吃蛇的?
Canvas
http://www.w3c.org/TR/2dcontext/ https://html.spec.whatwg.org/
jinghong
2020/05/09
13.2K0
Canvas
AS3:小游戏“贪吃蛇”的实现
前几天在园子里看到有人用Silverlight做了一个"贪吃蛇",一时兴起也想用AS3.0做一个,虽然这个游戏已经被很多开发者做烂了,但是作为AS的初学者,重新做一遍也当是一种学习. 技术"难"点分析: 1.蛇身的构成 可以用数组来存储一堆小球,将它们排列成连续的直线即可 2.蛇身的移动 蛇头移动后,紧跟蛇头后的小球移动到蛇头原来的位置,然后...类推,后面的小球依次移动到前一个球的位置 3.碰撞检测 蛇头移动时,如果超出舞台边界,则Game Over了;同样蛇头如果遇到了蛇身,同样也Over. 4.食物
菩提树下的杨过
2018/01/22
9881
Canvas动画展示(番外)
canvas动画:   1.清空canvas   在绘制每一帧动画之前,需要清空所有。清空所有最简单的做法就是clearRect()方法   2.保存canvas状态   如果在绘制的过程中会更改canvas的状态(颜色、移动了坐标原点等),又在绘制每一帧时都是原始状态的话,则最好保存下canvas的状态   3.绘制动画图形   从这里开始一帧一帧的绘制动画   4.恢复canvas状态   如果你前面保存了canvas状态,则应该在绘制完成一帧之后恢复canvas状态   5.控制动画   我们可用通过canvas的方法或者自定义的方法把图像会知道到canvas上。正常情况,我们能看到绘制的结果是在脚本执行结束之后。 例如:我们不可能在一个 for 循环内部完成动画。为了执行动画,我们需要一些可以定时执行重绘的方法。
我不是费圆
2020/12/17
6840
canvas荧光表源码分享
无聊看了一下网页制作从入门到放弃的书,看到一个canvas表盘案例觉得不错,就搞出来美化了一下,就是这个鸟样子 <!DOCTYPE html> <html> <head> <meta charse
Youngxj
2018/06/07
6620
C++ 纯 C 实现贪吃蛇小游戏
一枚大果壳
2024/05/18
3810
C++ 纯 C 实现贪吃蛇小游戏
贪吃蛇C语言代码
虽然说是智能但是可能并没有你想象中那么智能==。 基本思路是按照上、右、下、左的顺序搜索方向,使得沿该方向前进能够靠近食物,前进过程中遇到障碍会自动绕开,可是不能避免蛇头被蛇身包围的情况。
全栈程序员站长
2022/09/01
6.5K0
Canvas监测雷达
已经很晚了,祝愿大家做个好梦。如果你也如我一般,对Canvas 或者 Css 有着独有的情愫,加入我,让手中的代码变得生机勃勃,我是 “ 我不是费圆 ”,一个正在努力的前端程序员。
我不是费圆
2020/10/09
9360
自定义页尾代码
自定义页尾代码 效果图 <!--时钟--> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> </head> <body> <div style="text-align: center; color: mediumvioletred;">
codeniu
2022/02/25
5330
自定义页尾代码
H5 Canvas 旋转小伞+时钟
原生态的js, 利用H5 Canvas 写的旋转小伞+时钟 指针和表盘会变颜色哦!指针到达小伞位置,会跟四周的小伞颜色一致! H5 Canvas 旋转小伞+时钟 效果如下: JavaScript代码: <script type="text/javascript" language="javascript"> window.onload=function () { // 创建画布 var canvas=document.createElement('canvas'); var brus
AlexTao
2019/08/17
1.1K0
使用Nodejs搭建HTTP服务,并实现公网远程访问「内网穿透」
Node.js 是能够在服务器端运行 JavaScript 的开放源代码、跨平台运行环境。Node.js 由 OpenJS Foundation(原为 Node.js Foundation,已与 JS Foundation 合并)持有和维护,亦为 Linux 基金会的项目。Node.js 采用 Google 开发的 V8 运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可优化应用程序的传输量和规模。这些技术通常用于资料密集的即时应用程序。
iOS Magician
2023/05/02
1.4K0
使用Nodejs搭建HTTP服务,并实现公网远程访问「内网穿透」
canvas绘制坐标系
第六步:用for循环绘制表格。 问题?怎么绘制? 第一步:每一次的循环都开启一个新的路径。根据xy坐标绘制就行了.(默认canvas左上角开始). 为什么-0.5,因为默认情况下线条的中心点和像素的底部对齐所以会2显示,所以显示非纯黑色问题。所以-0.5,代表0.52=1
贵哥的编程之路
2021/03/18
5740
canvas 系列学习笔记三《样式和颜色》
通过上下文可以设置strokeStyle (线条颜色) 和 fillStyle (填充颜色)。 设置完之后画线和填充就是设置的颜色。
星宇大前端
2022/09/28
6050
canvas 系列学习笔记三《样式和颜色》
【项目实战】Java 贪吃蛇
在主启动类StartGame中添加frame.add(new GamePanel());,
sidiot
2023/08/31
2650
【项目实战】Java 贪吃蛇
用原生JavaScript写一个贪吃蛇
看到掘金上有这样一种效果,感觉很好看,就是那种毛玻璃效果,于是想试试写一个登录页面并且实现遮罩,但是写成了开始游戏,可是光一个开始游戏也没意思,干脆写一个小游戏吧,直接试试贪吃蛇。
JanYork_简昀
2022/06/06
8280
用原生JavaScript写一个贪吃蛇
推荐阅读
相关推荐
听说最近HTML5很火~~!---贪吃蛇小游戏
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验