最近写贪吃蛇有些上瘾,canvas版本贪吃蛇,贪吃蛇是逻辑最简单的游戏了

news/2024/9/29 19:21:25

代码:

<!Doctype html>
<html lang="zh_cn"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>贪吃蛇</title><meta name="Keywords" content=""><meta name="Description" content=""><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /></head>
<body><canvas id="myCanvas" width="600" height="600" style="border:1px solid #FF0000;bgcolor:#FF0000;">
</canvas><script>
var margin = 10;
var pading = 3;
var maxLineNum = 25;
var maxFieldNum = 25;
var pointx = getRandomInt(0, maxFieldNum-1);
var pointy = getRandomInt(0, maxFieldNum-1);
var my_points = new Array();
var else_points = new Array();
var score = 0;function getUnixTime(){return Math.floor(Date.now() / 1000);
}function getRandomInt(min, max) {min = Math.ceil(min);max = Math.floor(max);return Math.floor(Math.random() * (max - min + 1)) + min;
}//处理键盘事件
function doKeyDown(e){var keyID = e.keyCode ? e.keyCode :e.which;//console.log(keyID);//aif(keyID == 65){pointx--;}//dif(keyID == 68){pointx++;}//wif(keyID == 87){pointy--;}//sif(keyID == 83){pointy++;}if(pointx < 0){pointx = 0;}if(pointx > maxFieldNum-1){pointx = maxFieldNum-1;}if(pointy < 0){pointy = 0;}if(pointy > maxLineNum-1){pointy = maxLineNum-1;}//console.log("pointx:"+pointx+", pointy:"+pointy);//处理碰到的其他块var touchFlag = false;var my_points_old = JSON.parse(JSON.stringify(my_points));for(var i = 0; i < else_points.length; i++){if(else_points[i].x == pointx && else_points[i].y == pointy){touchFlag = true;my_points.unshift(else_points[i]);else_points.splice(i, 1);score++;}}if(touchFlag == false){for(var i = 0; i < my_points_old.length; i++){if(i == 0){my_points[i].x = pointx;my_points[i].y = pointy;} else{my_points[i].x = my_points_old[i-1].x;my_points[i].y = my_points_old[i-1].y;}//console.log("nopeng:i="+i+", x="+my_points[i].x+", y="+my_points[i].y);
        }//console.log("\n");
    }else{for(var i = 0; i < my_points.length; i++){//console.log("peng:i="+i+", x="+my_points[i].x+", y="+my_points[i].y);
        }//console.log("\n");
    }draw();
}function draw(){var myCanvas = document.getElementById("myCanvas");var page_width = window.innerWidth;var page_height = window.innerHeight;//console.log("页面尺寸:宽:"+page_width+",高:"+page_height);var paint_width = page_width - 2 * margin - page_width / 4;var paint_height = page_height - 2 * margin;myCanvas.width = paint_width;myCanvas.height = paint_height;//console.log("画布尺寸:宽:"+paint_width+",高:"+paint_height);//清理画布var ctx = myCanvas.getContext("2d");ctx.beginPath();ctx.clearRect(0, 0, paint_width, paint_height);var left_width = paint_height - 2 * pading;var left_height = paint_height - 2 * pading;var right_width = paint_width - 2 * pading - left_width;var right_height = paint_height - 2 * pading;//画布背景var ctx = myCanvas.getContext("2d");ctx.beginPath();ctx.fillStyle = "rgb(147,112,219)";ctx.fillRect(0,0,paint_width,paint_height);//console.log("画布背景尺寸:宽:"+paint_width+",高:"+paint_height);//左侧背景var ctx = myCanvas.getContext("2d");ctx.beginPath();ctx.fillStyle = "rgb(255,250,240)";ctx.fillRect(pading,pading,left_width,left_height);//console.log("左侧背景尺寸:宽:"+left_width+",高:"+left_height);//右侧背景var ctx = myCanvas.getContext("2d");ctx.beginPath();ctx.fillStyle = "rgb(250,250,210)";ctx.fillRect(left_width+pading,pading,right_width,right_height);//console.log("右侧背景尺寸:宽:"+right_width+",高:"+right_height);var perWidth = left_width / maxFieldNum;var perHeight = left_height / maxLineNum;//横线for(var i = 0; i <= maxLineNum; i++){var ctx = myCanvas.getContext("2d");ctx.beginPath();ctx.moveTo(pading, pading+perHeight*i);ctx.lineTo(pading+left_width, pading+perHeight*i);ctx.strokeStyle = 'black';ctx.lineWidth = 1;ctx.stroke();}//竖线for(var i = 0; i <= maxFieldNum; i++){var ctx = myCanvas.getContext("2d");ctx.beginPath();ctx.moveTo(pading+perWidth*i, pading);ctx.lineTo(pading+perWidth*i, pading+left_height);ctx.strokeStyle = 'black';ctx.lineWidth = 1;ctx.stroke();}//第一个子if(my_points.length <= 0){var point = new Object();point.x = pointx;point.y = pointy;point.color = "rgb(255,0,0)";my_points.push(point);} else{my_points[0].x = pointx;my_points[0].y = pointy;}//其他随机子while(else_points.length < 3){var point = new Object();point.x = getRandomInt(0, maxFieldNum-1);point.y = getRandomInt(0, maxLineNum-1);point.color = "rgb("+getRandomInt(1, 255)+","+getRandomInt(1, 255)+","+getRandomInt(1, 255)+")";point.time = getUnixTime();else_points.push(point);}//显示第一个(蛇上的)棋子for(var i = 0; i < my_points.length; i++){var ctx = myCanvas.getContext("2d");ctx.beginPath();ctx.fillStyle = my_points[i].color;ctx.fillRect(my_points[i].x*perWidth+pading,my_points[i].y*perHeight+pading,perWidth,perHeight);//获取反色,展示文字序号var pattern = /[0-9]+/g;var matches = my_points[i].color.match(pattern);var r = 255-matches[0];var g = 255-matches[1];var b = 255-matches[2];ctx.beginPath();ctx.fillStyle="rgb("+r+","+g+","+b+")";ctx.font="12px Arial";ctx.fillText(i+1, my_points[i].x*perWidth+pading+perWidth/2.5, my_points[i].y*perHeight+pading+perHeight/1.5);}//过滤过期的其他棋子var tmp_points = new Array();for(var i = 0; i < else_points.length; i++){if(getUnixTime() - else_points[i].time < 60){tmp_points.push(else_points[i]);}}else_points = tmp_points;//显示其他棋子for(var i = 0; i < else_points.length; i++){var ctx = myCanvas.getContext("2d");ctx.beginPath();ctx.fillStyle = else_points[i].color;ctx.fillRect(else_points[i].x*perWidth+pading,else_points[i].y*perHeight+pading,perWidth,perHeight);}//显示得分按钮和文字var tmpcolor = "rgb(238,197,145)";var ctx = myCanvas.getContext("2d");ctx.beginPath();ctx.fillStyle = tmpcolor;ctx.fillRect(left_width+pading+right_width/3,perHeight/2,120,35);//获取反色,展示文字序号var pattern = /[0-9]+/g;var matches = tmpcolor.match(pattern);var r = 255-matches[0];var g = 255-matches[1];var b = 255-matches[2];ctx.beginPath();ctx.fillStyle="rgb("+r+","+g+","+b+")";ctx.font="14px Arial";ctx.fillText("得分:"+score, left_width+pading+right_width/3+35,perHeight/2+23);myCanvas.addEventListener('keydown', doKeyDown,true);myCanvas.focus();window.addEventListener('keydown', doKeyDown, true);
}draw();</script></body>
</html>

 

效果:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/56019.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PLC结构化文本(ST)——方法(Method)

PLC Structured Text Object Oriented Programming PLC结构化文本(ST)——方法(Method) 什么是方法一个方法是把一些相关的语句组织在一起,用来执行一个任务的语句块。---C#方法方法是语句的集合,它们在一起执行一个功能。方法是解决一类问题的步骤的有序组合 方法包含于…

闲话假期特供

小假期鲜花前 出于一些众所周知的原因,我们获得了一周假期离校时间,所以就打算和同学们一起去玩点什么。 Day 0 || 8.23 早起搬宿舍。 到了 GGrun 发现他开始就没把床垫搬过去,于是还要搬回去,并借走了我的车,然后我忘了直到放假后才想起来,希望 GGrun 没忘。 10:00 因为…

PostgreSQL的安装与配置(包含多种可能遇到的报错或者无法安装问题)

1.Windows安装 1. 官网下载安装包,EDB: Open-Source, Enterprise Postgres Database Management (enterprisedb.com) 2.按照提示步骤进行安装(文件路径很重要!!!) 这是PostgreSQL的安装目录(自定义目录安装的一定要命名清楚,不要和后面的data混淆) 这个全选这个是存储…

福州大学第19届206智能车队摄像头培训 三、帧率和快门时间

总钻风MT9V034灰度摄像头的帧率与快门原理原文于2023.10.25发布于本人CSDN主页,现同步至cnblogs 1.摄像头帧率 某天看了学弟学妹们练习PID编写的程序,为了降低串口通信的频率在int main() while(1)内用了delay函数。实际上在未来实际应用中是不可取的。 在平时的单片机工程中…

神经网络之卷积篇:详解简单卷积网络示例(A simple convolution network example)

详解简单卷积网络示例 假设有一张图片,想做图片分类或图片识别,把这张图片输入定义为\(x\),然后辨别图片中有没有猫,用0或1表示,这是一个分类问题,来构建适用于这项任务的卷积神经网络。针对这个示例,用了一张比较小的图片,大小是39393,这样设定可以使其中一些数字效果…

3分钟了解CDN

CDN CDN的全称是Content Delivery Network,即内容分发网络。CDN的全称是Content Delivery Network,即内容分发网络CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器 通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低…

新手朋友在安装pbootcms经常遇到一些错误(PbootCMS 常见问题及解决方法)

Parse error: syntax error, unexpected :, expecting {问题描述:在 www\core\function\handle.php 文件第 130 行出现了语法错误,提示意外的冒号。 原因分析:此错误通常出现在尝试在较旧的 PHP 版本上运行需要 PHP 7.x 或更高版本的代码时。PHP 7 引入了一些新的语法特性,…

【VMware VCF】VCF 5.2:配置管理域 vSAN 延伸集群。

VMware vSAN 解决方案中,根据集群的配置类型分为 vSAN 标准集群、vSAN 延伸集群以及双主机集群(延伸集群特例)。我们最常见的使用方式应该是 vSAN 标准集群,也就是 vSAN HCI 超融合集群,至少由 3 台 ESXi 主机所组成,这些 ESXi 主机安装位属于同一个数据中内,将本地磁盘…