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

news/2024/11/15 0:47:22/文章来源:https://www.cnblogs.com/xuxiaobo/p/18394047

代码:

<!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.hqwc.cn/news/791488.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

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 主机安装位属于同一个数据中内,将本地磁盘…

Datawhale X 李宏毅苹果书AI夏令营深度学习入门(三)

一.实践方法论 (一)模型偏差 模型偏差可能会影响模型训练。若模型过于简单,一个有未知参数的函数代θ1 得到一个函数 fθ1(x),同理可得到另一个函数 fθ2(x),把所有的函数集合起来得到一个函数的集合。但是该函数的集合太小了,没有包含任何一个函数,可以让损失变低的函数不…

PlugIR:开源还不用微调,首尔大学提出即插即用的多轮对话图文检索 | ACL 2024

即插即用的PlugIR通过LLM提问者和用户之间的对话逐步改进文本查询以进行图像检索,然后利用LLM将对话转换为检索模型更易理解的格式(一句话)。首先,通过重新构造对话形式上下文消除了在现有视觉对话数据上微调检索模型的必要性,从而使任意黑盒模型都可以使用。其次,构建了…

「代码随想录算法训练营」第五十二天 | 图论 part10

目录Floyd算法题目:97. 小明逛公园A * 算法题目:126.骑士的攻击最短路算法总结 Floyd算法 Floyd算法用于求解多源最短路问题(求多个起点到多个终点的多条最短路径)。在前面学习的dijkstra算法、Bellman算法都是求解单源最短路的问题(即只能有一个起点)。 注意:Floyd算法…