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

20-30 五子棋游戏

20-分析五子棋的实现思路_哔哩哔哩_bilibili20-分析五子棋的实现思路是一次性学会 Canvas 动画绘图(核心精讲+50个案例)2023最新教程的第21集视频,该合集共计53集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV16T411B7kP?spm_id_from=333.788.player.switch&vd_source=9218320e7bcc2e793fa8493559f4acd7&p=21https://www.bilibili.com/video/BV16T411B7kP?spm_id_from=333.788.player.switch&vd_source=9218320e7bcc2e793fa8493559f4acd7&p=21https://www.bilibili.com/video/BV16T411B7kP?spm_id_from=333.788.player.switch&vd_source=9218320e7bcc2e793fa8493559f4acd7&p=21https://www.bilibili.com/video/BV16T411B7kP?spm_id_from=333.788.player.switch&vd_source=9218320e7bcc2e793fa8493559f4acd7&p=21

20-分析五子棋的实现思路

逻辑处理用原生JavaScript写,画布与棋子用canvas画

21-绘制网格棋盘

视频里用的绿色太晃眼了,换了一个更像木质棋盘的颜色 #ebc78f 。

页面底色与棋盘颜色,代码如下:

html,
body {background: #eee;
}canvas {display: block;margin: 0 auto;background-color: #ebc78f;
}

棋盘是由多条横线和纵线组合而成,一格是50px,左右余宽 50px, (800-50-50) / 50 = 14,如果i从0开始算,0到14一共是15条线,为了方便计算,设 i 从1开始,for循环至 i < 16结束。

    // 1.创建canvaslet canvas = document.createElement('canvas')canvas.width = 800canvas.height = 800document.body.append(canvas)// 2.获取 contextlet context = canvas.getContext('2d')// 3.画棋盘// 3.1 棋盘是由多条横线和纵线组合而成,一格按50px算,左右余宽 50px, (800-50-50) / 50 = 14,所以我们需要15条线for (let i = 1; i < 16; i++) {// 把线段的开头表示出来(横线)context.moveTo(50, 50 * i)  // 起点context.lineTo(750, 50 * i)  // 终点context.stroke()}for (let i = 1; i < 16; i++) {// 把线段的开头表示出来(竖线)context.moveTo(50 * i, 50)  // 起点context.lineTo(50 * i, 750)  // 终点context.stroke()}

22-点击棋盘绘制棋子

通过 context.beginPath(),可以避免上图这种情况,要注意 .beginPath() 要写在画圆 .arc() 之前

canvas.addEventListener('click', e => {let { offsetX: x, offsetY: y } = econtext.beginPath()  // 避免起点终点被fill()填充颜色context.arc(x, y, 20, 0, 2 * Math.PI)context.fill()context.closePath()  // 配合 .beginPath()  使用
})

因为一个格子是50px,我们设置 (offsetX+25)/2 ,这样计算后可以让偏左的对齐左边的线偏右的对齐右边的线(offsetY也是同理),在 canvas.addEventListener 中设置如下:

let { offsetX, offsetY } = e
let x = Math.floor((offsetX + 25) / 50) * 50  // 让棋子在网格线正确的位置
let y = Math.floor((offsetY + 25) / 50) * 50

23-棋盘的边界判断

判断点击的位置边界,如果超出棋盘范围则不落棋子。如果offsetX < 25,则不落棋子(因为如果 offsetX >= 25,则可知落棋子在第一列上),offsetY与上下左右四边同理。

// 判断点击的位置边界,如果超出棋盘范围则不落棋子
if (offsetX < 25 || offsetY < 25 || offsetX > 775 || offsetY > 775) {return;
}

24-绘制不不同的棋子

context.beginPath()
context.arc(x, y, 20, 0, 2 * Math.PI)// 设置黑白棋子的渐变色
let gBlack = context.createRadialGradient(x - 8, y - 8, 0, x, y, 20)
gBlack.addColorStop(0, '#999')
gBlack.addColorStop(1, '#000')let gWhite = context.createRadialGradient(x - 5, y - 10, 18, x, y, 40)
gWhite.addColorStop(0, '#fff')
gWhite.addColorStop(1, '#666')// 判断当前棋子颜色变量,给棋子黑白不同颜色
context.fillStyle = isBlack ? gBlack : gWhite// 视频里老师的代码
// let tx = isBlack ? x - 10 : x + 10;
// let ty = isBlack ? y - 10 : y + 10;
// let g = context.createRadialGradient(tx, ty, 0, tx, ty, 30);
// g.addColorStop(0, isBlack ? '#ccc' : '#666');
// g.addColorStop(1, isBlack ? '#000' : '#fff');
// context.fillStyle = g
// 视频里老师的代码 ENDcontext.fill()
context.closePath()

25-处理重复落子的问题

第1个数组代表第一列的棋子内容(原点 (0,0) 在左上角,row 相当于 X轴,向右方向为正方向, col 是 Y轴,向下方向为正方向)。

使用一个二维数组,把所有的棋子位置存储起来。棋盘有15横列,每个 i 代表一列,循环15次,设置 circles[i] 为一个空数组。

// 6. 使用一个二维数组把所有的棋子位置存储起来
let circles = [];
// 棋盘有15列,每个i指代每一列
for (let i = 1; i < 16; i++) {// circles[i]里的每一项都是一个空数组circles[i] = []
}
console.log(circles);

设置 x = i * 50, y = j * 50 ,可以让棋子在网格线十字中心的位置上,添加一个布尔变量 isBlack,用来控制棋子黑白颜色的切换。

let x = i * 50  // 让棋子在网格线十字中心的位置
let y = j * 50
context.beginPath()
context.arc(x, y, 20, 0, 2 * Math.PI)// 6.1 把棋子的坐标存到二维数组里
circles[i][j] = isBlack ? 'black' : 'white'
// console.log(circles);   

如果 circles[i][j] 不为空,说明里面已经有内容,那么不允许重复落子。

// 6.2 判断当前位置是否已经存在棋子
if (circles[i][j]) {// 提醒用户, 这里已有棋子tip.innerText = `不能重复落子!当前是${isBlack ? '黑' : '白'}棋的回合`return;
}

设置顶部的文字提示。

 <div class="tip">请黑棋落子</div>// ...
// 提醒用户换人
let text = isBlack ? '请黑棋落子' : '请白棋落子'
tip.innerText = text
// ...

26-纵向判断棋子连续

连成线的4种情况:

将坐标(row,col)视作(x,y)更加直观,在纵轴(竖轴)方向上检索是否有5个连续的棋子可以想象为:在X轴位置不变,Y轴加减坐标上下移动,在此期间判断各个棋子是否为同一种颜色

代码逻辑草稿:

// 以 row, col 为起点,在二维数组里向上和向下查找
circles[row][col-1]
circles[row][col-2]
circles[row][col-3]
circles[row][col-4]circles[row][col+1]
circles[row][col+2]
circles[row][col+3]
// ...

设置一个 checkVertical 函数,来判断在竖轴方向上是否有五子相连,它的返回值是 return count >=5 ,如果 count 是 5,那么函数结果返回 true,会在下面的步骤中将结果传递给一个 endGame变量作为判断结束游戏的依据(其他三个方向的设计逻辑也是这样)。

【b站视频内提供的代码(有bug)】

// 纵向查找是否有5个连续相同的棋子
function checkVertical(row, col) {// 记录向上的次数let up = 0;// 记录向下的次数let down = 0;let times = 0;// 定义当前总共有几个已经连在一起let count = 1; // 初始值,自己本身算1个// 为避免出现死循环,设置一个循环上限 10000while (times < 17) {times++;// 如果棋子已经大于一个指定的次数,就不找了if (count >= 5) {break;}let target = isBlack ? 'black' : 'white';// 以 row, col 为起点,在二维数组里向上查找up++;if (circles[row][col - up] && circles[row][col - up] == target) {count++;};// 以 row, col 为起点,在二维数组里向下查找down++;if (circles[row][col + down] && circles[row][col + down] == target) {count++;};}return count >= 5;
}

27-处理获胜的逻辑

添加一个 endGame 布尔值变量,初始值为 false, 通过将当前棋子的(i, j) 值传递给四个方向的五子相连函数来判断是否有 true 值存在,如果有,那么游戏结束,棋盘无法再被点击。

// 8.1 定义一个变量标识,是否结束游戏
let endGame = false// ...
// 8. 判断是否有人已经获胜,endGame为true,则无法点击
if (endGame) {// 游戏结束return
}// ...
// 7.判断当前是否已有对应的棋子连成5颗,endGame为true则出现获胜提示字
endGame = checkVertical(i, j)
if(endGame) {tip.innerText = `${isBlack?'黑': '白'}方获胜!`return
}

28-处理棋子非连续的情况

如果相邻的棋子都不是同色的,直接 break 这次的判断循环。

// 如果棋子已经大于一个指定的次数,或者相邻棋子不是同色的(同色棋子不连续),就不找了
if (count >= 5 || (circles[row][col - up] != target && circles[row][col + down] != target)) {break;
}

29-横向判断是否获胜

【b站视频内提供的代码(有bug)】

// 横向查找是否有5个连续相同的棋子
function checkHorizontal(row, col) {// 记录向左的次数let left = 0;// 记录向右的次数let right = 0;let times = 0;// 定义当前总共有几个已经连在一起let count = 1; // 初始值,自己本身算1个// 为避免出现死循环,设置一个循环上限 10000while (times < 17) {times++;let target = isBlack ? 'black' : 'white';// 以 row, col 为起点,在二维数组里向左查找left++;if (circles[row-left][col] && circles[row-left][col] == target) {count++;};// 以 row, col 为起点,在二维数组里向右查找right++;if (circles[row+right][col] && circles[row+right][col] == target) {count++;};// 如果棋子已经大于一个指定的次数,或者相邻棋子不是同色的(同色棋子不连续),就不找了if (count >= 5 || (circles[row-left][col] != target && circles[row+right][col] != target)) {break;}}return count >= 5;
}

 最终我们需要4个方向的判断,所以这里会有4个判断函数,上下、左右、左上右下、右上左下。

// 7.判断当前是否已有对应的棋子连成5颗,endGame为true则出现获胜提示字
endGame = checkVertical(i, j) || checkHorizontal(i, j)

30-斜向判断是否获胜

判断方向在左上右下时,方向往左上延伸,那么X-, Y-,方向往右下延伸,那么X+, Y+。

判断方向在右上左下时,方向往右上延伸,那么X+, Y-,方向往左下延伸,那么X-, Y+。

【完整代码-bug修复版本】

落子靠近棋盘四周一圈时,如果要判断(不存在的)超出棋盘范围的棋子代码会报错,所以进行了 if 判断。

* 如果还有其他bug,建议自己修正一下。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>html,body {background: #eee;}canvas {display: block;margin: 0 auto;background-color: #ebc78f;}.tip {text-align: center;padding: 16px;color: #666;}</style>
</head><body><div class="tip">请黑棋落子</div><script>// 1.创建canvaslet canvas = document.createElement('canvas')canvas.width = 800canvas.height = 800document.body.append(canvas)// 获取文字提示 tip 元素let tip = document.querySelector('.tip')// 2.获取 contextlet context = canvas.getContext('2d')// 3.画棋盘// 3.1 棋盘是由多条横线和纵线组合而成,一格按50px算,左右余宽 50px, (800-50-50) / 50 = 14,所以我们需要14条线for (let i = 1; i < 16; i++) {// 把线段的开头表示出来(横线)context.moveTo(50, 50 * i)  // 起点context.lineTo(750, 50 * i)  // 终点context.stroke()}for (let i = 1; i < 16; i++) {// 把线段的开头表示出来(竖线)context.moveTo(50 * i, 50)  // 起点context.lineTo(50 * i, 750)  // 终点context.stroke()}// 6. 使用一个二维数组把所有的棋子位置存储起来let circles = [];// 棋盘有15列,每个i指代每一列for (let i = 1; i < 16; i++) {// circles[i]里的每一项都是一个空数组circles[i] = []}// console.log(circles);// 5.使用一个变量保存当前的棋子颜色let isBlack = true// 8.1 定义一个变量标识,是否结束游戏let endGame = false// 4. 当点击在棋盘里的时候,绘制一个棋子canvas.addEventListener('click', e => {let { offsetX, offsetY } = e// 判断点击的位置边界,如果超出棋盘范围则不落棋子if (offsetX < 25 || offsetY < 25 || offsetX > 775 || offsetY > 775) {return;}// 格子所在的位置let i = Math.floor((offsetX + 25) / 50)let j = Math.floor((offsetY + 25) / 50)// 8. 判断是否有人已经获胜,endGame为true,则无法点击if (endGame) {// 游戏结束return}// 6.2 判断当前位置是否已经存在棋子if (circles[i][j]) {// 提醒用户, 这里已有棋子tip.innerText = `不能重复落子!当前是${isBlack ? '黑' : '白'}棋的回合`return;}let x = i * 50  // 让棋子在网格线正确的位置let y = j * 50context.beginPath()context.arc(x, y, 20, 0, 2 * Math.PI)// 6.1 把棋子的坐标存到二维数组里circles[i][j] = isBlack ? 'black' : 'white'// console.log(circles);        // 设置黑白棋子的渐变色let gBlack = context.createRadialGradient(x - 8, y - 8, 0, x, y, 20)gBlack.addColorStop(0, '#999')gBlack.addColorStop(1, '#000')let gWhite = context.createRadialGradient(x - 5, y - 10, 18, x, y, 40)gWhite.addColorStop(0, '#fff')gWhite.addColorStop(1, '#666')// 判断当前棋子颜色变量,给棋子黑白不同颜色context.fillStyle = isBlack ? gBlack : gWhite// 视频里老师的代码// let tx = isBlack ? x - 10 : x + 10;// let ty = isBlack ? y - 10 : y + 10;// let g = context.createRadialGradient(tx, ty, 0, tx, ty, 30);// g.addColorStop(0, isBlack ? '#ccc' : '#666');// g.addColorStop(1, isBlack ? '#000' : '#fff');// context.fillStyle = g// 视频里老师的代码 ENDcontext.fill()context.closePath()// 7.判断当前是否已有对应的棋子连成5颗,endGame为true则出现获胜提示字endGame = checkVertical(i, j) || checkHorizontal(i, j) || checkNWtoSE(i, j) || checkNEtoSW(i, j)if (endGame) {tip.innerText = `${isBlack ? '黑' : '白'}方获胜!`return}// 提醒用户换人let text = isBlack ? '请白棋落子' : '请黑棋落子'tip.innerText = textisBlack = !isBlack})// // 开始判断4个方向的棋子相连情况//// 纵向查找是否有5个连续相同的棋子function checkVertical(row, col) {// 记录向上的次数let up = 0;// 记录向下的次数let down = 0;let target = isBlack ? 'black' : 'white';let times = 0;// 定义当前总共有几个已经连在一起let count = 1; // 初始值,自己本身算1个// 5个棋子连成线即可结束 times < 6while (times < 6) {times++;// 探寻上边up++;// 当col - up > 0,说明棋子的上侧还在棋盘内,开始进行判断if (col - up > 0) {if (circles[row][col - up] == target) {count++;}}// 探寻下边down++;// 当col+down < 16,说明棋子的下侧还在棋盘内,开始进行判断if (col + down < 16) {if (circles[row][col + down] == target) {count++;}}// 在col - up与col + down都在棋盘里的情况在,如果相邻棋子不是target,则break,或如果count已满足5颗相连,则breakif (col - up > 0 && col + down < 16) {if (count >= 5 || (circles[row][col - up] != target && circles[row][col + down] != target)) {break;}}}return count >= 5;}// 横向查找是否有5个连续相同的棋子function checkHorizontal(row, col) {// 记录向左的次数let left = 0;// 记录向右的次数let right = 0;let target = isBlack ? 'black' : 'white';let times = 0;// 定义当前总共有几个已经连在一起let count = 1; // 初始值,自己本身算1个// 为避免出现死循环,设置一个循环上限 5while (times < 6) {times++;// 探寻左边left++;// 当row-left>0,说明棋子的左侧还在棋盘内,开始进行判断if (row - left > 0) {if (circles[row - left][col] == target) {count++;}}right++;// 当row+right<16,说明棋子的右侧还在棋盘内,开始进行判断if (row + right < 16) {if (circles[row + right][col] == target) {count++;}}if (row + right < 16 && row - left > 0) {if (count >= 5 || (circles[row + right][col] != target && circles[row - left][col] != target)) {break;}}}return count >= 5;}// 判断 \ 左上到右下的方向function checkNWtoSE(row, col) {let lt = 0; // 左上let rb = 0; // 右下let target = isBlack ? 'black' : 'white';let times = 0;let count = 1; // 初始值,自己本身算1个while (times < 5) {times++;// 探寻左上方向lt++;if (col - lt > 0 && row - lt > 0) {if (circles[row - lt][col - lt] == target) {count++;}}// 探寻右下方向rb++;if (row + rb < 16 && col + rb < 16) {if (circles[row + rb][col + rb] == target) {count++;}}if (row - lt > 0 && col - lt && row + rb < 16 && col + rb < 16) {if (count >= 5 || (circles[row - lt][col - lt] != target && circles[row + rb][col + rb] != target)) {break;}}}return count >= 5;}// 判断 / 右上到左下的方向function checkNEtoSW(row, col) {let rt = 0; // 右上let lb = 0; // 左下let target = isBlack ? 'black' : 'white';let times = 0;let count = 1; // 初始值,自己本身算1个while (times < 5) {times++;// 探寻右上rt++;if (col - rt > 0 && row + rt < 16) {if (circles[row + rt][col - rt] && circles[row + rt][col - rt] == target) {count++;};}// 探寻左下lb++;if (row - lb > 0 && col + lb < 16) {if (circles[row - lb][col + lb] && circles[row - lb][col + lb] == target) {count++;};}if (row - lb > 0 && col + lb < 16) {if (count >= 5 || (circles[row + rt][col - rt] != target && circles[row - lb][col + lb] != target)) {break;}}}return count >= 5;}</script>
</body></html>

相关文章:

20-30 五子棋游戏

20-分析五子棋的实现思路_哔哩哔哩_bilibili20-分析五子棋的实现思路是一次性学会 Canvas 动画绘图&#xff08;核心精讲50个案例&#xff09;2023最新教程的第21集视频&#xff0c;该合集共计53集&#xff0c;视频收藏或关注UP主&#xff0c;及时了解更多相关视频内容。https:…...

PYH与MAC的桥梁MII/MIIM

在学习车载互联网时&#xff0c;看到了一句话&#xff0c;Processor通过DMA直接存储访问与MAC之间进行数据的交互&#xff0c;MAC通过MII介质无关接口与PHY之间进行数据的交互。常见的以太网硬件结构是&#xff0c;将MAC集成进Processor芯片&#xff0c;将PHY留在Processor片外…...

pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)

以下是一个完整的词嵌入&#xff08;Word Embedding&#xff09;示例代码&#xff0c;使用 modelscope 下载 tiansz/bert-base-chinese 模型&#xff0c;并通过 transformers 加载模型&#xff0c;获取中文句子的词嵌入。 from modelscope.hub.snapshot_download import snaps…...

探秘 TCP TLP:从背景到实现

回家的路上还讨论了个关于 TCP TLP 的问题&#xff0c;闲着无事缕一缕。本文内容参考自 Tail Loss Probe (TLP): An Algorithm for Fast Recovery of Tail Losses 以及 Linux 内核源码。 TLP&#xff0c;先说缘由。自 TCP 引入 Fast retrans 机制就是为了尽力避免 RTO&#xf…...

MCU内部ADC模块误差如何校准

本文章是笔者整理的备忘笔记。希望在帮助自己温习避免遗忘的同时&#xff0c;也能帮助其他需要参考的朋友。如有谬误&#xff0c;欢迎大家进行指正。 一、ADC误差校准引言 MCU 片内 ADC 模块的误差总包括了 5 个静态参数 (静态失调&#xff0c;增益误差&#xff0c;微分非线性…...

国产之光DeepSeek架构理解与应用分析

目录 初步探索DeepSeek的设计 一、核心架构设计 二、核心原理与优化 三、关键创新点 四、典型应用场景 五、与同类模型的对比优势 六、未来演进方向 从投入行业生产的角度看 一、DeepSeek的核心功能扩展 二、机械电子工程产业中的具体案例 1. 预测性维护&#xff08;Predictive…...

群晖NAS安卓Calibre 个人图书馆

docker 下载镜像johngong/calibre-web&#xff0c;安装之 我是本地的/docker/xxx/metadata目录 映射到 /usr/local/calibre-web/app/cps/metadata_provider CALIBREDB_OTHER_OPTION 删除 CALIBRE_SERVER_USER calibre_server_user 缺省用户名口令 admin admin123 另外有个N…...

openRv1126 AI算法部署实战之——Tensorflow模型部署实战

在RV1126开发板上部署Tensorflow算法&#xff0c;实时目标检测RTSP传输。视频演示地址 rv1126 yolov5 实时目标检测 rtsp传输_哔哩哔哩_bilibili ​ 一、准备工作 从官网下载tensorflow模型和数据集 手动在线下载&#xff1a; https://github.com/tensorflow/models/b…...

HTML特殊符号的使用示例

目录 一、基本特殊符号的使用 1、空格符号&#xff1a; 2、小于号 和 大于号&#xff1a; 3、引号&#xff1a; 二、版权、注册商标符号的使用 1、版权符号&#xff1a;© 2、注册商标符号&#xff1a; 三、数学符号的使用 四、箭头符号的使用 五、货币符号的使用…...

如何对系统调用进行扩展?

扩展系统调用是操作系统开发中的一个重要任务。系统调用是用户程序与操作系统内核之间的接口,允许用户程序执行内核级操作(如文件操作、进程管理、内存管理等)。扩展系统调用通常包括以下几个步骤: 一、定义新系统调用 扩展系统调用首先需要定义新的系统调用的功能。系统…...

【MFC】C++所有控件随窗口大小全自动等比例缩放源码(控件内字体、列宽等未调整) 20250124

MFC界面全自动等比例缩放 1.在初始化里 枚举每个控件记录所有控件rect 2.在OnSize里&#xff0c;根据当前窗口和之前保存的窗口的宽高求比例x、y 3.枚举每个控件&#xff0c;根据比例x、y调整控件上下左右,并移动到新rect struct ControlInfo {CWnd* pControl;CRect original…...

前端 | 深入理解Promise

1. 引言 JavaScript 是一种单线程语言&#xff0c;这意味着它一次仅能执行一个任务。为了处理异步操作&#xff0c;JavaScript 提供了回调函数&#xff0c;但是随着项目处理并发任务的增加&#xff0c;回调地狱 (Callback Hell) 使异步代码很难维护。为此&#xff0c;ES6带来了…...

【视频+图文讲解】HTML基础2-html骨架与基本语法

图文教程 基本骨架 举个例子&#xff0c;下图所展示的为html的源代码 -!DOCTYPE&#xff1a;表示文档类型&#xff08;后边写的html表示文档类型是html&#xff09;&#xff1b;其中“&#xff01;”表示声明 只要是加这个声明标签的&#xff0c;浏览器就会把下边的源代码当…...

LabVIEW在电机自动化生产线中的实时数据采集与生产过程监控

在电机自动化生产线中&#xff0c;实时数据采集与生产过程监控是确保生产效率和产品质量的重要环节。LabVIEW作为一种强大的图形化编程平台&#xff0c;可以有效实现数据采集、实时监控和自动化控制。详细探讨如何利用LabVIEW实现这一目标&#xff0c;包括硬件选择、软件架构设…...

《深入理解HTTP交互与数据监控:完整流程与优化实践》

文章目录 &#x1f310; 全链路解析&#xff1a;HTTP请求响应与数据可视化监控一、HTTP请求响应全流程解析1. 全链路交互流程图2.关键技术实现2.1 前端请求构造&#xff08;ES6语法示例&#xff09;2.2 服务端处理架构&#xff08;Node.js/Express&#xff09; 二、数据可视化监…...

pytorch使用SVM实现文本分类

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 完整代码&#xff1a; import torch import torch.nn as nn import torch.optim as optim import jieba import numpy as np from sklearn.model_selection import train_test_split from sklearn.feature_extract…...

Recommender Systems with Large Models

一、引言 信息爆炸时代&#xff0c;用户面临信息过载&#xff0c;传统推荐系统依赖经典算法&#xff0c;难以满足需求。大模型基于深度学习&#xff0c;经大规模预训练&#xff0c;具备强大能力&#xff0c;能实现更精准推荐&#xff0c;为推荐系统发展开辟新路径。 二、大模…...

团体程序设计天梯赛-练习集——L1-028 判断素数

前言 一道10分的题目&#xff0c;相对来说比较简单&#xff0c;思考的时候要仔细且活跃&#xff0c;有时候在写代码的时候一些代码的出现很多余&#xff0c;并且会影响最后的结果 L1-028 判断素数 本题的目标很简单&#xff0c;就是判断一个给定的正整数是否素数。 输入格式…...

SCRM开发为企业提供全面客户管理解决方案与创新实践分享

内容概要 在当今的商业环境中&#xff0c;客户关系管理&#xff08;CRM&#xff09;变得越来越重要。而SCRM&#xff08;社交客户关系管理&#xff09;作为一种新兴的解决方案&#xff0c;正在帮助企业彻底改变与客户的互动方式。快鲸SCRM是一个引人注目的工具&#xff0c;它通…...

Axure PR 9 旋转效果 设计交互

大家好&#xff0c;我是大明同学。 这期内容&#xff0c;我们将学习Axure中的旋转效果设计与交互技巧。 旋转 创建旋转效果所需的元件 1.打开一个新的 RP 文件并在画布上打开 Page 1。 2.在元件库中拖出一个按钮元件。 创建交互 创建按钮交互状态 1.选中按钮元件&#xf…...

自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

代码&#xff1a; import torch import numpy as np import torch.nn as nn from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score# 定义数据&#xff1a;x_data 是特征&#xff0c;y_data 是标签&#xff08;目标值&#xff09; data [[-0…...

Linux02——Linux的基本命令

目录 ls 常用选项及功能 综合示例 注意事项 cd和pwd命令 cd命令 pwd命令 相对路径、绝对路径和特殊路径符 特殊路径符号 mkdir命令 1. 功能与基本用法 2. 示例 3. 语法与参数 4. -p选项 touch-cat-more命令 1. touch命令 2. cat命令 3. more命令 cp-mv-rm命…...

MySQL数据库(二)- SQL

目录 ​编辑 一 DDL (一 数据库操作 1 查询-数据库&#xff08;所有/当前&#xff09; 2 创建-数据库 3 删除-数据库 4 使用-数据库 (二 表操作 1 创建-表结构 2 查询-所有表结构名称 3 查询-表结构内容 4 查询-建表语句 5 添加-字段名数据类型 6 修改-字段数据类…...

Docker自定义镜像

Dockerfile自定义镜像 一&#xff1a;镜像结构 镜像是将应用程序及其需要的系统函数库、环境、配置、依赖打包而成。 我们以MySQL为例&#xff0c;来看看镜像的组成结构&#xff1a; 简单来说&#xff0c;镜像就是在系统函数库、运行环境基础上&#xff0c;添加应用程序文件、…...

网络协议基础

文章目录 前言一、网络协议分层1.应用层2.传输层3.网络层4.数据链路层5.物理层 二、图解IP1.IP基本认识&#xff08;1&#xff09;IP的作用&#xff08;2&#xff09;IP与MAC的关系 2.IP地址的基础知识&#xff08;1&#xff09;IP地址的定义&#xff08;2&#xff09;IP地址的…...

c语言进阶(简单的函数 数组 指针 预处理 文件 结构体)

c语言补充 格式 void函数头 {} 中的是函数体 sum函数名 &#xff08;&#xff09; 参数表 #include <stdio.h>void sum(int begin, int end) {int i;int sum 0;for (i begin ; i < end ; i) {sum i;}printf("%d到%d的和是%d\n", begin, end, sum); …...

Pytorch框架从入门到精通

目录 一、Tensors 1.1 初始化一个Tensor 1&#xff09;赋值初始化 2&#xff09;从 NumPy 数组初始化 3&#xff09;从另一个张量 4&#xff09;使用随机值或常量值 1.2 Tensor 的属性 1.3 对 Tensor 的操作 1.3.1 总体介绍 1.3.2 索引和切片 1.3.3 算术运算 矩阵乘…...

Vue.js组件开发-实现全屏图片文字缩放切换特效

使用 Vue 实现全屏图片文字缩放切换特效 步骤 创建 Vue 项目&#xff1a;使用 Vue CLI 来快速创建一个新的 Vue 项目。设计组件结构&#xff1a;创建一个包含图片和文字的组件&#xff0c;并实现缩放和切换效果。实现样式&#xff1a;使用 CSS 来实现全屏显示、缩放和切换动画…...

在 WSL2 中重启 Ubuntu 实例

在 WSL2 中重启 Ubuntu 实例&#xff0c;可以按照以下步骤操作&#xff1a; 方法 1: 使用 wsl 命令 关闭 Ubuntu 实例: 打开 PowerShell 或命令提示符&#xff0c;运行以下命令&#xff1a; wsl --shutdown这会关闭所有 WSL2 实例。 重新启动 Ubuntu: 再次打开 Ubuntu&#x…...

Flutter 新春第一弹,Dart 宏功能推进暂停,后续专注定制数据处理支持

在去年春节&#xff0c;Flutter 官方发布了宏&#xff08;Macros&#xff09;编程的原型支持&#xff0c; 同年的 5 月份在 Google I/O 发布的 Dart 3.4 宣布了宏的实验性支持&#xff0c;但是对于 Dart 内部来说&#xff0c;从启动宏编程实验开始已经过去了几年&#xff0c;但…...

Signature

打开得到加密脚本&#xff1a; import ecdsa import randomdef ecdsa_test(dA,k):sk ecdsa.SigningKey.from_secret_exponent(secexpdA,curveecdsa.SECP256k1)sig1 sk.sign(databHi., kk).hex()sig2 sk.sign(databhello., kk).hex()r1 int(sig1[:64], 16)s1 int(sig1[64:…...

UE求职Demo开发日志#18 数据表获取物品信息,添加背包模块

1 把获取物品信息改为读取数据表 先创建结构&#xff0c;暂时有这几个属性&#xff1a; USTRUCT(BlueprintType) struct ARPG_CPLUS_API FMyItemData:public FTableRowBase {GENERATED_USTRUCT_BODY()UPROPERTY(EditAnywhere, BlueprintReadWrite)int ItemId;//物品Id&#x…...

neo4j-community-5.26.0 create new database

1.edit neo4j.conf 把 # The name of the default database initial.dbms.default_databasehonglouneo4j # 写上自己的数据库名称 和 # Name of the service #5.0 server.windows_service_nameneo4j #4.0 dbms.default_databaseneo4j #dbms.default_databaseneo4jwind serve…...

项目中用的网关Gateway及SpringCloud

在现代微服务架构中&#xff0c;网关&#xff08;Gateway&#xff09;起到了至关重要的作用。它不仅负责路由请求&#xff0c;还提供了统一的认证、授权、负载均衡、限流等功能。Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个重要组件&#xff0c;专门为微服务架构提…...

​《Ollama Python 库​》

Ollama Python 库 Ollama Python 库提供了将 Python 3.8 项目与 Ollama 集成的最简单方法。 先决条件 应该安装并运行 Ollama拉取一个模型以与库一起使用&#xff1a;例如ollama pull <model>ollama pull llama3.2 有关可用模型的更多信息&#xff0c;请参阅 Ollama.com。…...

大模型概述(方便不懂技术的人入门)

1 大模型的价值 LLM模型对人类的作用&#xff0c;就是一个百科全书级的助手。有多么地百科全书&#xff0c;则用参数的量来描述&#xff0c; 一般地&#xff0c;大模型的参数越多&#xff0c;则该模型越好。例如&#xff0c;GPT-3有1750亿个参数&#xff0c;GPT-4可能有超过1万…...

Ubuntu16.04编译安装Cartographer 1.0版本

说明 官方文档 由于Ubuntu16.04已经是很老的系统&#xff0c;如果直接按照Cartographer官方安装文档安装会出现代码编译失败的问题&#xff0c;本文给出了解决这些问题的办法。正常情况下执行本文给出的安装方法即可成功安装。 依赖安装 # 这里和官方一致 # Install the req…...

AI-ISP论文Learning to See in the Dark解读

论文地址&#xff1a;Learning to See in the Dark 图1. 利用卷积网络进行极微光成像。黑暗的室内环境。相机处的照度小于0.1勒克斯。索尼α7S II传感器曝光时间为1/30秒。(a) 相机在ISO 8000下拍摄的图像。(b) 相机在ISO 409600下拍摄的图像。该图像存在噪点和色彩偏差。©…...

2 MapReduce

2 MapReduce 1. MapReduce 介绍1.1 MapReduce 设计构思 2. MapReduce 编程规范3. Mapper以及Reducer抽象类介绍1.Mapper抽象类的基本介绍2.Reducer抽象类基本介绍 4. WordCount示例编写5. MapReduce程序运行模式6. MapReduce的运行机制详解6.1 MapTask 工作机制6.2 ReduceTask …...

OpenCV:SIFT关键点检测与描述子计算

目录 1. 什么是 SIFT&#xff1f; 2. SIFT 的核心步骤 2.1 尺度空间构建 2.2 关键点检测与精细化 2.3 方向分配 2.4 计算特征描述子 3. OpenCV SIFT API 介绍 3.1 cv2.SIFT_create() 3.2 sift.detect() 3.3 sift.compute() 3.4 sift.detectAndCompute() 4. SIFT 关…...

初识Cargo:Rust的强大构建工具与包管理器

初识Cargo&#xff1a;Rust的强大构建工具与包管理器 如果你刚刚开始学习Rust&#xff0c;一定会遇到一个名字&#xff1a;Cargo。Cargo是Rust的官方构建工具和包管理器&#xff0c;它让Rust项目的创建、编译、测试和依赖管理变得非常简单。本文将带你快速了解Cargo的基本用法…...

LightM-UNet(2024 CVPR)

论文标题LightM-UNet: Mamba Assists in Lightweight UNet for Medical Image Segmentation论文作者Weibin Liao, Yinghao Zhu, Xinyuan Wang, Chengwei Pan, Yasha Wang and Liantao Ma发表日期2024年01月01日GB引用> Weibin Liao, Yinghao Zhu, Xinyuan Wang, et al. Ligh…...

2025年02月01日Github流行趋势

项目名称&#xff1a;oumi 项目地址url&#xff1a;https://github.com/oumi-ai/oumi 项目语言&#xff1a;Python 历史star数&#xff1a;544 今日star数&#xff1a;103 项目维护者&#xff1a;xrdaukar, oelachqar, taenin, wizeng23, kaisopos 项目简介&#xff1a;一切你需…...

自动化测试框架搭建-封装requests-优化

目的 1、实际的使用场景&#xff0c;无法避免的需要区分GET、POST、PUT、PATCH、DELETE等不同的方式请求&#xff0c;以及不同请求的传参方式 2、python中requests中&#xff0c;session.request方法&#xff0c;GET请求&#xff0c;只支持params传递参数 session.request(me…...

什么是线性化PDF?

线性化PDF是一种特殊的PDF文件组织方式。 总体而言&#xff0c;PDF是一种极为优雅且设计精良的格式。PDF由大量PDF对象构成&#xff0c;这些对象用于创建页面。相关信息存储在一棵二叉树中&#xff0c;该二叉树同时记录文件中每个对象的位置。因此&#xff0c;打开文件时只需加…...

XML DOM 浏览器差异

DOM 解析中的浏览器差异 所有现代的浏览器都支持 W3C DOM 规范。 然而&#xff0c;浏览器之间是有差异的。一个重要的差异是&#xff1a; 处理空白和换行的方式 DOM - 空白和换行 XML 经常在节点之间包含换行或空白字符。这是在使用简单的编辑器&#xff08;比如记事本&…...

电子电气架构 --- 汽车电子拓扑架构的演进过程

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…...

01-六自由度串联机械臂(ABB)位置分析

ABB工业机器人&#xff08;IRB2600&#xff09;如下图所示&#xff08;d1444.8mm&#xff0c;a1150mm&#xff0c;a2700mm&#xff0c;a3115mm&#xff0c;d4795mm&#xff0c;d685mm&#xff09;&#xff0c;利用改进DH法建模&#xff0c;坐标系如下所示&#xff1a; 利用改进…...

04树 + 堆 + 优先队列 + 图(D1_树(D6_B树(B)))

目录 一、学习前言 二、基本介绍 三、特性 1. 从概念上说起 2. 举个例子 四、代码实现 节点准备 大体框架 实现分裂 实现新增 实现删除 五、完整源码 一、学习前言 前面我们已经讲解过了二叉树、二叉搜索树&#xff08;BST&#xff09;、平衡二叉搜索树&#xff08…...

350.两个数组的交集 ②

目录 题目过程解法 题目 给你两个整数数组 nums1 和 nums2 &#xff0c;请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数&#xff0c;应与元素在两个数组中都出现的次数一致&#xff08;如果出现次数不一致&#xff0c;则考虑取较小值&#xff09;。可以不考虑…...