当前位置: 首页 > news >正文

前端Canvas入门——用canvas写五子棋?

前言

五子棋的实现其实不难,因为本身就是一个很小的游戏。

至于画线什么的,其实很简单,都是lineTo(),moveTo()就行了。

难的在于——怎么让棋子落入到指定的格子上,怎么判断连子胜利。

当然啦,这部分是参考了别人的做法去实现的,也终于理解什么叫做CV工程师了。

But,修复bug还是用了我不少时间。

OK,坐稳扶好,下面开始~

实现

创建画布

至于创建canvas这部分就不写了,直接使用JS创建会有代码提示,非常友好~(如果不会,可以查看上条:用JS创建canvas)

我这里创建的画布大小是800*800的,你可以根据实际需要,创建出对应的画布大小。

画线布局

这部分很简单,都是重复的内容,但如果你创建的棋盘很大,那你画线就很多了,虽然可以不断CV,但是改来改去,看得眼睛都疼。

而且这也不符合低代码的特性,所以咱们还是使用循环来写吧:

for (let i = 1; i < 16; i++) {ctx.beginPath()ctx.moveTo(50, 50 * i)ctx.lineTo(750, 50 * i)ctx.stroke()ctx.closePath()ctx.beginPath()ctx.moveTo(50 * i, 50)ctx.lineTo(50 * i, 750)ctx.stroke()ctx.closePath()
}

写完运行,你就可以得到: 

记住,不要画满,因为上下左右都要有边距,棋盘不就是这个样子的吗?

下棋落子

画棋子

这部分很简单,就是画一个圆而已,直接:

ctx.arc(x, y, 20, 0, Math.PI * 2)
ctx.fill()

就可以了,但是别忘了我们是下棋的,所以需要监听点击事件,给Canvas添加点击事件即可。

但还有个问题,棋子不在线的相交点上,so,我们得解决这个问题。

怎么解决?

因为我们是在canvas中点击的,Canvas是有坐标系的,所以我们只需要获取到点击的坐标即可知道鼠标点击在哪里了。

这是个好主意,但是怎么获取到点击坐标?

用点击事件的e即可,从中解构出offsetX、offsetY即可。

canvas.addEventListener('click', function handlClick(e)  {let { offsetX, offsetY } = e
}

落子

既然获取到点击坐标了,我们就要划定范围了。

首先就是限制棋子的范围必须要在画好的线内,这个好办,只需要限制范围即可:

if(offsetX < 25 || offsetX > 775 || offsetY < 25 || offsetY > 775){return
}

但是点击的时候,不一定是精确点击到相交点的,所以我们还需要对点击坐标进行一定的处理——这也是为什么上面是25,而不是50的原因。

let x = Math.floor((offsetX + 25) / 50) * 50
let y = Math.floor((offsetY + 25) / 50) * 50

 

我们只需要让点击的坐标,先在X、Y轴加上25,然后除以50向下取整即可。

为什么要先除以50,然后又乘以50?可以思考一下~

然后补上上面说的画棋子,即可让棋子完美落入到格子上,完整代码:

canvas.addEventListener('click', function handlClick(e)  {let { offsetX, offsetY } = eif(offsetX < 25 || offsetX > 775 || offsetY < 25 || offsetY > 775){return}let x = Math.floor((offsetX + 25) / 50) * 50let y = Math.floor((offsetY + 25) / 50) * 50ctx.beginPath()ctx.arc(x, y, 20, 0, Math.PI * 2)ctx.fill()ctx.closePath()
}

黑白双煞

完成上面的步骤可以发现,为什么只有一种颜色的棋子?

我白色的呢?去哪里了?怎么解决这个问题?

这里我们先在监听函数外面定义一个变量,取啥名都可以,这里咱:

let isBlack = true

因为默认是黑子先下,所以定义isBlack,默认是true的,然后咱们再使用三元变量定义一下fillStyle即可~:

ctx.fillStyle = isBlack ? "black": "white"

这个时候,还不行,我们需要在监听函数的默认改变isBlack的值:

isBlack = !isBlack

到目前为止,监听函数的代码:

let isBlack = true
canvas.addEventListener('click', function handlClick(e)  {let { offsetX, offsetY } = eif(offsetX < 25 || offsetX > 775 || offsetY < 25 || offsetY > 775){return}let x = Math.floor((offsetX + 25) / 50) * 50let y = Math.floor((offsetY + 25) / 50) * 50ctx.beginPath()ctx.arc(x, y, 20, 0, Math.PI * 2)ctx.fillStyle = isBlack ? "black" : "white"ctx.fill()ctx.closePath()isBlack = !isBlack
}

重复落子

这个时候,运行代码,打开浏览器,可以发现,点击同一个地方,居然可以变色,这太不符合常理了,这不应该啊~

怎么解决?

记录下子位置。

用神马记录?数组?好像可以?

创建数组

我们先在外面定义一个数组,用来接受棋子位置。

在创建棋盘的时候,我们在对应地生成一个二维数组。

这个时候,每次点击都可以记录棋子的位置了:

let circles = []
for (let i = 0; i <= 16; i++) {circles[i] = []
}

对了,我这个是包括了边框的,如果你不需要,可以自己修改一下范围值。

记录位置

记录位置还是在监听的时候,在画棋子之前进行即可。

记录棋子位置很简单,我们只需要棋子在二维数组中所在的位置即可。

也就是,我们只需要知道它在数组中的位置,而不是坐标。

i = X/50,j = Y/50即可

禁止重复落子

在点击的时候判断这个地方是否在二维数组中存在数值,如果有,就结束函数往下运行,并给出提示。

if(circles[i][j]){tip.innerHTML = '不能重复落子'return
}

这里的tip应该要先定义,都会做吧(狗头)。

这部分代码:

const tip = document.querySelector('.tip')
let isBlack = true
let circles = []
for (let i = 0; i <= 16; i++) {circles[i] = []
}
canvas.addEventListener('click', function handlClick(e)  {let { offsetX, offsetY } = eif(offsetX < 25 || offsetX > 775 || offsetY < 25 || offsetY > 775){return}let i = Math.floor((offsetX + 25) / 50)let j = Math.floor((offsetY + 25) / 50)if(circles[i][j]){tip.innerHTML = '不能重复落子'return}let x = i * 50let y = j * 50circles[i][j] = isBlack ? 'black' : 'white'ctx.beginPath()ctx.arc(x, y, 20, 0, Math.PI * 2)ctx.fillStyle = isBlack ? "black" : "white"ctx.fill()ctx.closePath()tip.innerHTML = isBlack ? '请白棋落子' : '请黑棋落子'isBlack = !isBlack
}

都能看懂吧?

游戏胜利

终于来到我们最喜欢的环节了,怎么判断游戏胜利?

判断游戏胜利,不就是横竖斜四个方向上判断是否连续5个子吗?

为什么是四个方向,横竖斜不就三个方向吗?

OK,开始写函数。

竖向判定

直接给代码:

function checkULine(row, col){let up = 0let down = 0let count = 1let target = isBlack ? 'black' : 'white'let times = 0while(times < 100){times++up++if(circles[row][col - up <= 0 ? 0 : col - up] && circles[row][col - up <= 0 ? 0 : col - up] == target){count++}down++if(circles[row][col + down >= 16 ? 16 : col + down] && circles[row][col + down >= 16 ? 16 : col + down] == target){count++}if(count >= 5 || (circles[row][col - up <= 0 ? 0 : col - up] !== target && circles[row][col + down >= 16 ? 16 : col + down] !== target)){break}}return count >= 5
}

首先就是函数需要两个参数,当前行,当前列。

因为是竖向判定,所以我们需要从当前棋子往上寻找,或者是往下寻找。

因为本身就是有一个子了,所以直接定义count为1。

你也可以定义为0,然后判断count大于等于4即可。

道路千万条,CV第一条。

接着就是开始往上往下寻找,这个函数是一直寻找,直到碰到边界,所以需要边界值判断,否则会报错。

至于别的bug,我没遇到,要是有的话,可以评论区发给我看看~

横向方向上的判定,我就不展开细说了,直接给代码:

function checkDLine(row, col){let left = 0let right = 0let count = 1let target = isBlack ? 'black' : 'white'let times = 0while(times < 100){times++left++if(circles[row - left <= 0 ? 0 : row - left][col] && circles[row - left <= 0 ? 0 : row - left][col] == target){count++}right++if(circles[row + right >= 16 ? 16: row + right][col] && circles[row + right >= 16 ? 16: row + right][col] == target){count++}if(count >= 5 || (circles[row - left <= 0 ? 0 : row - left][col] !== target && circles[row + right >= 16 ? 16: row + right][col] !== target)){break}}return count >= 5
}

斜向判定

这里举例从左上到右下:

function checkUX(row, col){let lt = 0let rb = 0let count = 1let target = isBlack ? 'black' : 'white'let times = 0while(times < 100){times++lt++if(circles[row - lt <= 0 ? 0 : row - lt][col - lt <=  0 ? 0 : col - lt] && circles[row - lt <= 0 ? 0 : row - lt][col - lt <=  0 ? 0 : col - lt] == target){count++}rb++if(circles[row + rb >= 16 ? 16 : row + rb][col + rb >= 16 ? 16 : col + rb] && circles[row + rb >= 16 ? 16 : row + rb][col + rb >= 16 ? 16 : col + rb] == target){count++}if(count >= 5 || (circles[row - lt <= 0 ? 0 : row - lt][col - lt <=  0 ? 0 : col - lt] !== target && circles[row + rb >= 16 ? 16 : row + rb][col + rb >= 16 ? 16 : col + rb] !== target)){break}}return count >= 5
}

其实也很简单理解,只是这个时候,不只是一个方向上寻找了而已,所以显得比较困难。

有兴趣的,可以自己画个2维数组去理解一下,这里不给出。

右上到左下:

function checkDX(row, col){let rt = 0let lb = 0let count = 1let target = isBlack ? 'black' : 'white'let times = 0while(times < 100){times++rt++if (circles[row + rt >= 16 ? 16 : row + rt][col - rt <= 0 ? Math.abs(col-rt) : col - rt] && circles[row + rt >= 16 ? 16 : row + rt][col - rt <= 0 ? Math.abs(col-rt) : col - rt] == target) {count++}lb++if (circles[row - lb <= 0 ? 0 : row - lb][col + lb >= 16 ? 16 : col + lb] && circles[row - lb <= 0 ? 0 : row - lb][col + lb >= 16 ? 16 : col + lb] == target) {count++}if(count >= 5 || (circles[row + rt >= 16 ? 16 : row + rt][col - rt <= 0 ? Math.abs(col-rt) : col - rt] !== target && circles[row - lb <= 0 ? 0 : row - lb][col + lb >= 16 ? 16 : col + lb] !== target)){break}}return count >= 5
}

有能力的,可以尝试着把这几个函数集成为一个。

我是不行了,Level太低了,解决不了兼容性的bug。

函数调用

函数是写了,但是你需要调用啊。

在调用之前,咱们先定义一个变量用来判断是否胜利了。

let endGame = false

接着,在监听函数中,调用这些函数:

canvas.addEventListener('click', function handlClick(e)  {let { offsetX, offsetY } = eif(offsetX < 25 || offsetX > 775 || offsetY < 25 || offsetY > 775){return}let i = Math.floor((offsetX + 25) / 50)let j = Math.floor((offsetY + 25) / 50)if(circles[i][j]){tip.innerHTML = '不能重复落子'return}let x = i * 50let y = j * 50circles[i][j] = isBlack ? 'black' : 'white'ctx.beginPath()let tx = isBlack ? x - 14 : x + 14let ty = isBlack ? y - 14 : y + 14const g = ctx.createRadialGradient(tx, ty, 0, tx, ty, 60)g.addColorStop(0, isBlack ? "#ccc" : "#666")g.addColorStop(0.5, isBlack ? "black" : "white")ctx.arc(x, y, 20, 0, Math.PI * 2)ctx.fillStyle = gctx.fill()ctx.closePath()tip.innerHTML = isBlack ? '请白棋落子' : '请黑棋落子'endGame = checkULine(i, j) || checkDLine(i, j) || checkUX(i, j) || checkDX(i, j)if(endGame){setTimeout(() => {alert(`游戏结束,${ isBlack ? '黑方' : '白方' }获胜!`)location.reload() // 刷新本页}, 10)return}isBlack = !isBlack
})

这里我是添加了渐变色,让棋子更具立体感。

tx、ty是用来计算径向渐变圆心所在位置的。

致谢

非常感谢B站大佬,叩丁狼,Respect!

 

写在最后

可以改善的地方:

25、775这个数字能不能去掉呢?

结束游戏用的是弹窗,能不能更高级一点呢?

多屏适配。

如果棋子全下满了,怎么办?

OK, Bye~ 

相关文章:

前端Canvas入门——用canvas写五子棋?

前言 五子棋的实现其实不难&#xff0c;因为本身就是一个很小的游戏。 至于画线什么的&#xff0c;其实很简单&#xff0c;都是lineTo()&#xff0c;moveTo()就行了。 难的在于——怎么让棋子落入到指定的格子上&#xff0c;怎么判断连子胜利。 当然啦&#xff0c;这部分是…...

[PaddlePaddle飞桨] PaddleDetection-通用目标检测-小模型部署

PaddleDetection的GitHub项目地址 推荐环境&#xff1a; PaddlePaddle > 2.3.2 OS 64位操作系统 Python 3(3.5.1/3.6/3.7/3.8/3.9/3.10)&#xff0c;64位版本 pip/pip3(9.0.1)&#xff0c;64位版本 CUDA > 10.2 cuDNN > 7.6pip下载指令&#xff1a; python -m pip i…...

Golang | Leetcode Golang题解之第239题滑动窗口最大值

题目&#xff1a; 题解&#xff1a; func maxSlidingWindow(nums []int, k int) []int {n : len(nums)prefixMax : make([]int, n)suffixMax : make([]int, n)for i, v : range nums {if i%k 0 {prefixMax[i] v} else {prefixMax[i] max(prefixMax[i-1], v)}}for i : n - 1…...

深度解析:在 React 中实现类似 Vue 的 KeepAlive 组件

在前端开发中&#xff0c;Vue 的 keep-alive 组件是一个非常强大的工具&#xff0c;它可以在组件切换时缓存组件的状态&#xff0c;避免重新渲染&#xff0c;从而提升性能。那么&#xff0c;如何在 React 中实现类似的功能呢&#xff1f;本文将带你深入探讨&#xff0c;并通过代…...

2024-7-20 IT新闻

目录 微软全球IT系统故障 中国量子计算产业峰会召开 其他IT相关动态 微软全球IT系统故障 后续处理&#xff1a; 微软和CrowdStrike均迅速响应&#xff0c;发布了相关声明并部署了修复程序。CrowdStrike撤销了有问题的软件更新&#xff0c;以帮助用户恢复系统正常运作。微软也…...

前端组件化开发:以Vue自定义底部操作栏组件为例

摘要 随着前端技术的不断演进&#xff0c;组件化开发逐渐成为提升前端开发效率和代码可维护性的关键手段。本文将通过介绍一款Vue自定义的底部操作栏组件&#xff0c;探讨前端组件化开发的重要性、实践过程及其带来的优势。 一、引言 随着Web应用的日益复杂&#xff0c;传统的…...

11.斑马纹列表 为没有文本的链接设置样式

斑马纹列表 创建一个背景色交替的条纹列表。 使用 :nth-child(odd) 或 :nth-child(even) 伪类选择器,根据元素在一组兄弟元素中的位置,对匹配的元素应用不同的 background-color。 💡 提示:你可以用它对其他 HTML 元素应用不同的样式,如 <div>、<tr>、<p&g…...

【算法】跳跃游戏II

难度&#xff1a;中等 题目&#xff1a; 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[…...

学习大数据DAY20 Linux环境配置与Linux基本指令

目录 Linux 介绍 Linux 发行版 Linux 和 Windows 比较 Linux 就业方向&#xff1a; 下载 CentOS Linux 目录树 Linux 目录结构 作业 1 常用命令分类 文件目录类 作业 2 vim 编辑文件 作业 3 你问我第 19 天去哪了&#xff1f;第 19 天在汇报第一阶段的知识总结&#xff0c;没什…...

达梦+flowable改造

原项目springbootflowablemysql模式现需改造springbootflowable达梦&#xff0c; 1.在项目中引入达梦jpa包 引入高版本包已兼容flowable&#xff08;6.4.2&#xff09;liquibase&#xff08;3.6.2&#xff09; 我没有像网上做覆盖及达梦配置 <dependency> …...

【乐吾乐2D可视化组态编辑器】消息

消息 乐吾乐2D可视化组态编辑器demo&#xff1a;https://2d.le5le.com/ 监听消息 const fn (event, data) > {}; meta2d.on(event, fn);// 监听全部消息 meta2d.on(*, fn);// 取消监听 meta2d.off(event, fn); meta2d.off(*, fn); Copy 系统消息 event&#xff08;…...

Qt创建列表,通过外部按钮控制列表的选中下移、上移以及左侧图标的显现

引言 项目中需要使用列表QListWidget,但是不能直接拿来使用。需要创建一个列表,通过向上和向下的按钮来向上或者向下移动选中列表项,当当前项背选中再去点击确认按钮,会在列表项的前面出现一个图标。 实现效果 本实例实现的效果如下: 实现思路 思路一 直接采用QLis…...

svn不能记住密码,反复弹出GNOME,自动重置svn.simple文件

1. 修改文件 打开 ~/.subversion/auth/svn.simple/xxx 更新前 K 15 svn:realmstring V 32 xxxxx //svn 地址&#xff0c;库的地址 K 8 username V 4 xxx //用户名 END在顶部插入下面内容&#xff0c; 注意&#xff0c;如果密码不对&#xff0c;则文件文法正常生效 更新后…...

对称加密与非对称加密

对称加密 对称加密指的是加密和解密使用同一个秘钥,所以叫对称加密。对称加密只有一个秘钥,称为私钥。 优点:算法公开、计算量小、加密速度快、效率高 缺点:数据传输前,发送方和接收方必须确定好秘钥,双方也必须要保存好秘钥。 常见对称加密算法: DES、3DES、AES、3…...

03 Git的基本使用

第3章&#xff1a;Git的基本使用 一、创建版本仓库 一&#xff09;TortoiseGit ​ 选择项目地址&#xff0c;右键&#xff0c;创建版本库 ​ 初始化git init版本库 ​ 查看是否生成.git文件&#xff08;隐藏文件&#xff09; 二&#xff09;Git ​ 选择项目地址&#xff0c…...

【Linux】将IDEA项目部署到云服务器上,让其成为后台进程(保姆级教学,满满的干货~~)

目录 部署项目到云服务器什么是部署一、 创建MySQL数据库二、 修改idea配置项三、 数据打包四、 部署云服务器五、开放端口号六 、 验证程序 部署项目到云服务器 什么是部署 ⼯作中涉及到的"环境" 开发环境:开发⼈员写代码⽤的机器.测试环境:测试⼈员测试程序使⽤…...

IDEA的断点调试(Debug)

《IDEA破解、配置、使用技巧与实战教程》系列文章目录 第一章 IDEA破解与HelloWorld的实战编写 第二章 IDEA的详细设置 第三章 IDEA的工程与模块管理 第四章 IDEA的常见代码模板的使用 第五章 IDEA中常用的快捷键 第六章 IDEA的断点调试&#xff08;Debug&#xff09; 第七章 …...

部署django

部署Django项目到Apache HTTP服务器上,通常会使用mod_wsgi模块,这是Apache的一个扩展,专为Python web应用设计,可以很好地与Django集成。以下是部署Django项目的简要步骤: 准备工作 确保环境准备就绪: 确保你的系统中已安装了Python、Django以及Apache HTTP Server。安装…...

Android Framework学习笔记(4)----Zygote进程

Zygote的启动流程 Init进程启动后&#xff0c;会加载并执行init.rc文件。该.rc文件中&#xff0c;就包含启动Zygote进程的Action。详见“RC文件解析”章节。 根据Zygote对应的RC文件&#xff0c;可知Zygote进程是由/system/bin/app_process程序来创建的。 app_process大致处…...

澎湃算力 玩转AI 华为昇腾AI开发板——香橙派OriengePi AiPro边缘计算案例评测

澎湃算力 玩转AI 华为昇腾AI开发板 香橙派OriengePi AiPro 边缘计算案例评测 人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活、工作乃至整个社会的面貌。作为推动这一变革的关键力量&#xff0c;边缘计算与AI技术的深度融合正成为行业发展的新趋势…...

<数据集>铁轨缺陷检测数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;844张 标注数量(xml文件个数)&#xff1a;844 标注数量(txt文件个数)&#xff1a;844 标注类别数&#xff1a;3 标注类别名称&#xff1a;[Spalling, Squat, Wheel Burn] 序号类别名称图片数框数1Spalling3315522…...

第2章 矩阵

A 乘以此列向量&#xff0c;1的位置依次往下&#xff0c;所以A的列向量全为0 B C、D 取BE 要统一...

抖音seo短视频矩阵源码系统开发搭建----开源+二次开发

抖音seo短视频矩阵源码系统开发搭建 是一项技术密集型工作&#xff0c;需要对大数据处理、人工智能等领域有深入了解。该系统开发过程中需要用到多种编程语言&#xff0c;如Java、Python等。同时&#xff0c;需要使用一些框架和技术&#xff0c;如Hadoop、Spark、PyTorch等&am…...

【ELK】简述

ELK 堆栈的作用 大规模日志管理与分析 随着系统规模的扩大&#xff0c;应用程序、服务器和网络设备会产生大量的日志数据。ELK 堆栈可以集中收集、存储和索引这些分散在不同服务器和系统中的日志&#xff0c;方便快速检索和分析&#xff0c;帮助您快速定位系统故障、异常事件和…...

PyTorch张量数值计算

文章目录 1、张量基本运算2、阿达玛积3、点积运算4、指定运算设备⭐5、解决在GPU运行PyTorch的问题 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&am…...

Dockerfile相关命令

Dockerfile Dockerfile 是一个用来构建Docker镜像的文本文件&#xff0c;包含了一系列构建镜像所需的指令和参数。 指令详解 Dockerfile 指令说明FROM指定基础镜像&#xff0c;用于后续的指令构建&#xff0c;必须为第一个命令MAINTAINER指定Dockerfile的作者/维护者。&…...

【AI教程-吴恩达讲解Prompts】第1篇 - 课程简介

文章目录 简介Prompt学习相关资源 两类大模型原则与技巧 简介 欢迎来到面向开发者的提示工程部分&#xff0c;本部分内容基于吴恩达老师的《Prompt Engineering for Developer》课程进行编写。《Prompt Engineering for Developer》课程是由吴恩达老师与 OpenAI 技术团队成员 I…...

Leetcode - 周赛406

目录 一&#xff0c;3216. 交换后字典序最小的字符串 二&#xff0c;3217. 从链表中移除在数组中存在的节点 三&#xff0c;3218. 切蛋糕的最小总开销 I 四&#xff0c;3219. 切蛋糕的最小总开销 II 一&#xff0c;3216. 交换后字典序最小的字符串 本题要求交换一次相邻字符…...

【JavaScript 算法】拓扑排序:有向无环图的应用

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、算法原理二、算法实现方法一&#xff1a;Kahn算法方法二&#xff1a;深度优先搜索&#xff08;DFS&#xff09;注释说明&#xff1a; 三、应用场景四、总结 拓扑排序&#xff08;Topological Sorting&#xff09;是一种…...

Fastgpt本地或服务器私有化部署常见问题

一、错误排查方式 遇到问题先按下面方式排查。 docker ps -a 查看所有容器运行状态,检查是否全部 running,如有异常,尝试docker logs 容器名查看对应日志。容器都运行正常的,docker logs 容器名 查看报错日志带有requestId的,都是 OneAPI 提示错误,大部分都是因为模型接…...

做不了飞机要看什么网站/b站推广网站2024下载

概念介绍&#xff1a; 1、px (pixel&#xff0c;像素)&#xff1a; 是一个虚拟长度单位&#xff0c;是计算机系统的数字化图像长度单位&#xff0c;如果px要换算成物理长度&#xff0c;需要指定精度DPI(Dots Per Inch&#xff0c;每英寸像素数)&#xff0c;在扫描打印时一般都有…...

网络游戏那个网站做的最好/免费站长工具

快捷方式 应该来说 很多人都做过&#xff0c;我们就来看一下基本的快捷方式 是怎么实现的&#xff0c;会有什么问题&#xff1f; 首先 肯定要获取权限&#xff1a; 1 <!-- 添加快捷方式 --> 2 <uses-permission android:name"com.android.launcher.permissi…...

仿小米论坛的wordpress主题/哪些广告平台留号码

web Deploy发布asp.net网站给我们提供方便&#xff0c;开始配置好了可以方便的发布网站&#xff0c;但是过久就出现无法执行此操作。请与服务器管理员联系&#xff0c;检查授权和委派设置。花了好长时间找到问问所在。现在解决方法分享出来。希望对大家有点用帮助 原来&#xf…...

网站免费做软件有哪些/seo网站推广有哪些

本帖最后由 wybb 于 2018-8-5 22:14 编辑 现在主流电脑配置的内存都不小&#xff0c;16G属于常规&#xff0c;32g都算不上大&#xff0c;经常会有人疑惑要不要关闭系统的“虚拟内存”&#xff0c;或者去设置为固定值。我就从软件的角度来聊聊。实际上很多人并不了解虚拟内存到底…...

电商建站系统/宁波seo推荐推广平台

解题思路&#xff1a;最短路的模板题,注意一个细节处理即可。 见代码&#xff1a; 1 #include<cstdio>2 #include<cstring>3 #include<algorithm>4 using namespace std;5 #define inf 0x3f3f3f3f6 const int maxn 1005;7 int vis[maxn], w[maxn][maxn], d[…...

java ee只是做网站吗/查询网站

8 分钟入门 K8s | 详解容器基本概念 https://www.zhihu.com/question/37498459/answer/826736487 Docker 和 Kubernetes学习&#xff1a;Docker 和 Kubernetes 从听过到略懂&#xff1a;给程序员的旋风教程 https://1byte.io/developer-guide-to-docker-and-kubernetes/...