canvas 拼图

news/2024/6/29 3:06:30

效果

--_068

代码

<!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="500" height="500">
</canvas>
<script>let canvas =document.getElementById("canvas");let context =canvas.getContext("2d");// 图片初始化let img=new Image();img.src="http://www.w3school.com.cn/i/eg_tulip.jpg";// 创建数组保存拼图let matrix = new Array(5);let number = 0;// 初始化图片数组for(let i = 0; i < 5; i++){matrix[i] = new Array(6);for(let j = 0; j < 6; j++){matrix[i][j] = number;number++;}}// 绘制线函数let drawline = () => {context.beginPath();for(let i = 0; i < 6; i++){context.moveTo(i * 66, 0);context.lineTo(i * 66, 250);context.moveTo(0, i * 50);context.lineTo(400, i * 50)}context.moveTo(6 * 66, 0);context.lineTo(6 * 66, 250);context.stroke();};// 打乱图片函数let shuffle = () => {// for 遍历生成随机数,把生成的随机数进行随机交换let row = 5;let col = 6;for(let i = 0; i < row; i++){for(let j = 0; j < col; j++){// 生成一个在此范围内的随机数和当前数组交换let rRow = Math.floor(Math.random() * 5);let rCol = Math.floor(Math.random() * 6);let tmp;// 和当前交换tmp = matrix[i][j];matrix[i][j] = matrix[rRow][rCol];matrix[rRow][rCol] = tmp;}}};// 生成白块let withBlock = () => {matrix[0][5] = 40;};// 拼图状态判断let checkPic = () => {for(let i = 0; i < 5; i++){for(let j = 0; j < 6; j++){if(i * 6 + j != matrix[i][j] && i * 6 + j != 5){return 0;}}}return 1;}// 图片绘制函数let drawPic = () => {context.clearRect(0, 0, 500,500);// 行for(let i = 0; i < 5; i++){// 列for(let j = 0; j < 6; j++){// 进行裁剪 图片大小400 * 250  66 * 50// 获取原图所在的行和列// 获取列let col = Math.floor(matrix[i][j] % 6);// 获取图片的行let row = Math.floor(matrix[i][j] / 6);// 进行绘图context.drawImage(img,col * 66, row * 50, 66, 50, j * 66 , i * 50, 66, 50);}}// 绘制线段函数drawline();if(checkPic()){alert("拼图成功");location.reload();}};// 移动函数let moveLeft = () => {// 左边值进行赋值matrix[whiteBlock.row][whiteBlock.col] = matrix[whiteBlock.row][whiteBlock.col + 1];// 复原空白块whiteBlock.col = whiteBlock.col + 1;matrix[whiteBlock.row][whiteBlock.col] = 40;};let moveUp = () => {matrix[whiteBlock.row][whiteBlock.col] = matrix[whiteBlock.row + 1][whiteBlock.col];whiteBlock.row = whiteBlock.row + 1;matrix[whiteBlock.row][whiteBlock.col] = 40;};let moveRight = () => {matrix[whiteBlock.row][whiteBlock.col] = matrix[whiteBlock.row][whiteBlock.col - 1];whiteBlock.col = whiteBlock.col - 1;matrix[whiteBlock.row][whiteBlock.col] = 40;};let movedown = () => {matrix[whiteBlock.row][whiteBlock.col] = matrix[whiteBlock.row - 1][whiteBlock.col];whiteBlock.row = whiteBlock.row - 1;matrix[whiteBlock.row][whiteBlock.col] = 40;};// 定义一个类,用于保存当前空白图像块class WhiteBlock{row = 0;col = 5;constructor(){};}// 打乱顺序shuffle();// 生成白块withBlock();// 绘制图片drawPic();// 生成白块对象let whiteBlock = new WhiteBlock();// 触发事件进行拼图$("body").keydown((event) => {// leftif(event.keyCode == 37 && whiteBlock.col != 5){moveLeft();}// upif(event.keyCode == 38 && whiteBlock.row != 4){moveUp();}// rightif(event.keyCode == 39 && whiteBlock.col != 0){moveRight();}// downif(event.keyCode == 40 && whiteBlock.row != 0){movedown();}drawPic();});
</script>
</body>
</html>

图片描述


http://lihuaxi.xjx100.cn/news/236226.html

相关文章

端到端对话模型新突破!Facebook发布大规模个性化对话数据库

作者&#xff5c;Pierre-Emmanuel Mazare 等译者&#xff5c;郝毅编辑&#xff5c;Debra出处丨 AI 前线AI 前线导读&#xff1a;聊天机器人是目前非常流行的一种人工智能系统。目前大部分聊天机器人的衔接性都不是很好&#xff0c;尤其是在没有主动的重调优策略下训练出的端到端…

学计算机的好处处300字,学计算机的心得体会300字

学计算机的心得体会300字我们从一些事情上得到感悟后&#xff0c;可以寻思将其写进心得体会中&#xff0c;这么做可以让我们不断思考不断进步。那么好的心得体会都具备一些什么特点呢&#xff1f;以下是小编精心整理的学计算机的心得体会300字&#xff0c;欢迎大家分享。学计算…

PostgreSQL学习笔记(1)

安装psql brew install postgresql 启动服务 brew services start postgresql 使用psql进入控制台&#xff0c;报错&#xff1a; psql: FATAL: database "<user>" does not exist 看来是没有给我的当前用户创建数据库&#xff0c;使用下面命令进入名为templat…

linux下typora安装

# optional, but recommended sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys BA300B7755AFCFAE# add Typoras repository sudo add-apt-repository deb https://typora.io ./linux/ sudo apt-get update# install typora sudo apt-get install typora

word转html显示不完整,word页面怎么显不完全 word页面视图显示不全怎么办

他们都是瞎回答&#xff0c;我也遇到了这样的问题&#xff0c;自己试了好多方法&#xff0c;终于试出来了&#xff0c;面上跟本搜不到正确方法&#xff0c;所以只能自己弄了&#xff0c;这次完美解决。首先&#xff0c;不能显示完全的页面视图先不用管&#xff0c;直接调成普遍…

适合小小白的完整建设流程

时常有中小企业建站的客户问到我要自己建网站&#xff0c;应该怎么开始&#xff1f;建站有一定的技术门槛&#xff0c;首先要明白建站要做的哪些事情&#xff0c;里面有哪些坑&#xff0c;把流程弄清楚了才能避免入坑&#xff0c;半途而废&#xff01;下面总结了建站的流程还有…

android采用MVP完整漫画APP、钉钉地图效果、功能完善的音乐播放器、仿QQ动态登录效果、触手app主页等源码...

Android精选源码 一个可以上拉下滑的Ui效果&#xff0c;觉得好看可以学学 APP登陆页面适配 一款采用MVP的的完整漫画APP源码 android实现钉钉地图效果源码 一个使用单个文字生成壁纸图片的app android 仿QQ动态背景登录效果源码 功能完善的Android 手机本地音乐文件播放器 andr…

SpringBoot之集成swagger2

maven配置 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.5.0</version> </dependency> <dependency><groupId>io.springfox</groupId><artifact…