五子棋游戏
五子棋 - deveco
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>五子棋 - deveco</title><style>body {font-family: Arial, sans-serif;display: flex;flex-direction: column;align-items: center;background-color: #f5f5f5;}h1 {color: #333;}#board {display: flex;flex-direction: column;background-color: #dcb35c;padding: 10px;border-radius: 5px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);margin: 20px 0;}.row {display: flex;}.cell {width: 30px;height: 30px;border: 1px solid #000;display: flex;justify-content: center;align-items: center;position: relative;cursor: pointer;}.piece {width: 24px;height: 24px;border-radius: 50%;}.black {background-color: #000;box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);}.white {background-color: #fff;box-shadow: 0 0 5px rgba(0, 0, 0, 0.5);}#status {font-size: 18px;font-weight: bold;margin: 10px 0;}button {padding: 10px 20px;background-color: #4CAF50;color: white;border: none;border-radius: 5px;cursor: pointer;font-size: 16px;margin: 0 5px;}#controls {display: flex;margin-bottom: 15px;}.difficulty {margin-top: 15px;}select {padding: 5px;margin-left: 10px;}</style>
</head>
<body><h1>五子棋</h1><div id="status">当前玩家:黑棋</div><div id="controls"><button id="restart">重新开始</button><button id="toggle-ai">切换AI模式</button></div><div class="difficulty">难度: <select id="ai-level"><option value="easy">简单</option><option value="medium" selected>中等</option><option value="hard">困难</option></select></div><div id="board"></div><script>// 游戏状态const gameState = {board: [],currentPlayer: 1, // 1=黑棋, 2=白棋gameOver: false,size: 15,aiEnabled: true,aiPlayer: 2, // AI默认使用白棋aiLevel: 'medium'};// 初始化棋盘function initGame() {gameState.board = Array(gameState.size).fill().map(() => Array(gameState.size).fill(0));gameState.currentPlayer = 1;gameState.gameOver = false;renderBoard();// 更新AI状态按钮document.getElementById('toggle-ai').textContent = gameState.aiEnabled ? "关闭AI模式" : "开启AI模式";}// 渲染棋盘function renderBoard() {const board = document.getElementById('board');board.innerHTML = '';for (let i = 0; i < gameState.size; i++) {const row = document.createElement('div');row.className = 'row';for (let j = 0; j < gameState.size; j++) {const cell = document.createElement('div');cell.className = 'cell';if (gameState.board[i][j] === 1) {const piece = document.createElement('div');piece.className = 'piece black';cell.appendChild(piece);} else if (gameState.board[i][j] === 2) {const piece = document.createElement('div');piece.className = 'piece white';cell.appendChild(piece);}cell.addEventListener('click', () => makeMove(i, j));row.appendChild(cell);}board.appendChild(row);}// 更新状态const status = document.getElementById('status');if (gameState.gameOver) {const winner = gameState.currentPlayer === 1 ? '黑棋' : '白棋';const isAI = gameState.aiEnabled && gameState.currentPlayer === gameState.aiPlayer;status.textContent = `游戏结束,${winner}${isAI ? '(AI)' : ''}胜利!`;} else {const currentPlayerText = gameState.currentPlayer === 1 ? '黑棋' : '白棋';const isAI = gameState.aiEnabled && gameState.currentPlayer === gameState.aiPlayer;status.textContent = `当前玩家:${currentPlayerText}${isAI ? '(AI思考中...)' : ''}`;}}// 落子function makeMove(row, col) {// 如果游戏结束或该位置已有棋子,则不允许落子if (gameState.gameOver || gameState.board[row][col] !== 0) {return;}// 如果当前是AI回合且AI启用,则忽略玩家点击if (gameState.aiEnabled && gameState.currentPlayer === gameState.aiPlayer) {return;}// 玩家落子gameState.board[row][col] = gameState.currentPlayer;// 检查是否获胜if (checkWin(row, col)) {gameState.gameOver = true;renderBoard();return;}// 切换玩家gameState.currentPlayer = gameState.currentPlayer === 1 ? 2 : 1;renderBoard();// 如果AI启用且现在是AI回合,则AI落子if (gameState.aiEnabled && gameState.currentPlayer === gameState.aiPlayer && !gameState.gameOver) {setTimeout(makeAIMove, 500); // 延迟500ms,让玩家能看到自己的落子}}// AI落子function makeAIMove() {if (gameState.gameOver) return;const move = findBestMove();if (move) {gameState.board[move.row][move.col] = gameState.aiPlayer;if (checkWin(move.row, move.col)) {gameState.gameOver = true;renderBoard();return;}gameState.currentPlayer = gameState.currentPlayer === 1 ? 2 : 1;renderBoard();}}// AI寻找最佳落子位置function findBestMove() {const aiLevel = gameState.aiLevel;const emptyPositions = [];// 找出所有空位置for (let i = 0; i < gameState.size; i++) {for (let j = 0; j < gameState.size; j++) {if (gameState.board[i][j] === 0) {emptyPositions.push({row: i, col: j});}}}// 如果是第一步,随机选择靠近中心的位置if (emptyPositions.length === gameState.size * gameState.size) {const center = Math.floor(gameState.size / 2);const offset = Math.floor(Math.random() * 3) - 1; // -1, 0, 或 1return {row: center + offset,col: center + Math.floor(Math.random() * 3) - 1};}// 评估每个位置的分数const movesWithScores = emptyPositions.map(pos => {return {...pos,score: evaluatePosition(pos.row, pos.col, aiLevel)};});// 根据难度增加随机性if (aiLevel === 'easy') {// 简单模式有50%概率随机落子if (Math.random() < 0.5) {return emptyPositions[Math.floor(Math.random() * emptyPositions.length)];}} else if (aiLevel === 'medium') {// 中等模式有20%概率不选最佳位置if (Math.random() < 0.2) {movesWithScores.sort((a, b) => b.score - a.score);const topMoves = movesWithScores.slice(0, Math.min(5, movesWithScores.length));return topMoves[Math.floor(Math.random() * topMoves.length)];}}// 选择分数最高的位置movesWithScores.sort((a, b) => b.score - a.score);return movesWithScores[0];}// 评估位置分数function evaluatePosition(row, col, aiLevel) {const humanPlayer = gameState.aiPlayer === 1 ? 2 : 1;let score = 0;// 优先考虑靠近中心的位置const center = Math.floor(gameState.size / 2);const distanceFromCenter = Math.abs(row - center) + Math.abs(col - center);score -= distanceFromCenter;// 检查周围是否有棋子let hasNeighbor = false;for (let i = Math.max(0, row - 2); i <= Math.min(gameState.size - 1, row + 2); i++) {for (let j = Math.max(0, col - 2); j <= Math.min(gameState.size - 1, col + 2); j++) {if (gameState.board[i][j] !== 0) {hasNeighbor = true;break;}}if (hasNeighbor) break;}if (!hasNeighbor) {return score - 50; // 远离所有棋子的位置不太好}// 检查各个方向的得分const directions = [[0, 1], // 水平[1, 0], // 垂直[1, 1], // 右下对角线[1, -1] // 右上对角线];for (const [dr, dc] of directions) {// 检查AI自己的得分score += evaluateDirection(row, col, dr, dc, gameState.aiPlayer) * 2;// 检查阻止对手的得分const humanScore = evaluateDirection(row, col, dr, dc, humanPlayer);// 如果对手即将获胜,优先阻止if (humanScore >= 100) {score += humanScore * 1.5;} else {score += humanScore;}}// 根据难度调整if (aiLevel === 'hard') {// 困难模式增加攻击性,更注重自己的连子score *= 1.2;} else if (aiLevel === 'easy') {// 简单模式减弱AI能力score *= 0.7;}return score;}// 评估某个方向上的得分function evaluateDirection(row, col, dr, dc, player) {const opponent = player === 1 ? 2 : 1;let score = 0;// 模拟在该位置放置棋子const tempBoard = JSON.parse(JSON.stringify(gameState.board));tempBoard[row][col] = player;// 检查连续棋子let count = 1; // 包括当前位置let open = [true, true]; // 两端是否开放// 正向检查for (let i = 1; i < 5; i++) {const r = row + i * dr;const c = col + i * dc;if (r >= 0 && r < gameState.size && c >= 0 && c < gameState.size) {if (tempBoard[r][c] === player) {count++;} else if (tempBoard[r][c] === opponent) {open[0] = false;break;} else {break;}} else {open[0] = false;break;}}// 反向检查for (let i = 1; i < 5; i++) {const r = row - i * dr;const c = col - i * dc;if (r >= 0 && r < gameState.size && c >= 0 && c < gameState.size) {if (tempBoard[r][c] === player) {count++;} else if (tempBoard[r][c] === opponent) {open[1] = false;break;} else {break;}} else {open[1] = false;break;}}// 根据连续棋子数和开放端计算得分const openEnds = (open[0] ? 1 : 0) + (open[1] ? 1 : 0);if (count >= 5) return 10000; // 五连珠,必胜if (count === 4) {if (openEnds === 2) return 5000; // 活四if (openEnds === 1) return 1000; // 冲四}if (count === 3) {if (openEnds === 2) return 500; // 活三if (openEnds === 1) return 100; // 冲三}if (count === 2) {if (openEnds === 2) return 50; // 活二if (openEnds === 1) return 10; // 冲二}if (count === 1) {if (openEnds === 2) return 5; // 活一if (openEnds === 1) return 1; // 冲一}return 0;}// 检查是否获胜function checkWin(row, col) {const directions = [[0, 1], // 水平[1, 0], // 垂直[1, 1], // 右下对角线[1, -1] // 右上对角线];const player = gameState.board[row][col];for (const [dr, dc] of directions) {let count = 1;// 正向检查for (let i = 1; i < 5; i++) {const r = row + i * dr;const c = col + i * dc;if (r >= 0 && r < gameState.size && c >= 0 && c < gameState.size && gameState.board[r][c] === player) {count++;} else {break;}}// 反向检查for (let i = 1; i < 5; i++) {const r = row - i * dr;const c = col - i * dc;if (r >= 0 && r < gameState.size && c >= 0 && c < gameState.size && gameState.board[r][c] === player) {count++;} else {break;}}if (count >= 5) {return true;}}return false;}// 启动游戏document.addEventListener('DOMContentLoaded', () => {initGame();// 重新开始按钮document.getElementById('restart').addEventListener('click', initGame);// 切换AI模式按钮document.getElementById('toggle-ai').addEventListener('click', () => {gameState.aiEnabled = !gameState.aiEnabled;document.getElementById('toggle-ai').textContent = gameState.aiEnabled ? "关闭AI模式" : "开启AI模式";// 如果切换到AI模式且当前是AI回合,则AI立即落子if (gameState.aiEnabled && gameState.currentPlayer === gameState.aiPlayer && !gameState.gameOver) {setTimeout(makeAIMove, 500);}});// 难度选择document.getElementById('ai-level').addEventListener('change', (e) => {gameState.aiLevel = e.target.value;});});</script>
</body>
</html>
相关文章:
五子棋游戏
五子棋 - deveco <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>五子棋 - deveco</title>…...
Vue3.5 企业级管理系统实战(十):面包屑导航组件
1 breadcrumb 组件 1.1 安装插件 path-to-regexp 首先,我们需要安装插件 path-to-regexp,以便在下面的面包屑组件中对路由地址进行解析。 path-to-regexp是一个 JavaScript 库,可将路径字符串转化为正则表达式,广泛用于 Web 开发…...
【python】OpenCV—Hand Detection
文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、参考6、其它手部检测和手势识别的方案 更多有趣的代码示例,可参考【Programming】 1、功能描述 基于 opencv-python 和 mediapipe 进行手部检测 2、代码实现 导入必要的库函数 import cv2 import media…...
[ComfyUI] SDXL Prompt Styler 自定义节点的作用解析
1. SDXL Prompt Styler 的位置与基本功能 在 ComfyUI 的 “新建节点” → “实用工具” 下,可以找到 Style 节点(SDXL Prompt Styler)。该节点的主要作用是对输入的描述进行结构化处理,并在转换为 Stable Diffusion XL (SDXL) 提示词时,自动补充风格相关的内容,使提示词…...
Oracle-rman restore遭遇RMAN-03002与ORA-19563
文章目录 在原DB上检查是否有重复的文件名:查看rman恢复的日志修正重名部分重新执行rman恢复结论: 在 RMAN 恢复过程中,遇到RMAN-03002连同ORA-19563:错误。 操作是将 Oracle 10.0.5的数据库备份从 RMAN備份恢复到另一台测试主机的同一个目录…...
FPGA中串行执行方式之使用时钟分频或延迟的方式
FPGA中串行执行方式之使用时钟分频或延迟的方式 在FPGA设计中,时钟分频和延迟是两种常用的技术,用于控制信号的时序或调整信号的频率。它们可以用来实现简单的串行逻辑、状态转移或其他需要时间控制的场景。 时钟分频(Clock Division) 基本原理:时钟分频是通过将输入…...
Dubbo 全面解析:从 RPC 核心到服务治理实践
一、分布式系统与 RPC 框架概述 在当今互联网时代,随着业务规模的不断扩大,单体架构已经无法满足高并发、高可用的需求,分布式系统架构成为主流选择。而在分布式系统中,远程服务调用(Remote Procedure Call࿰…...
JavaScript 调试入门指南
JavaScript 调试入门指南 一、调试准备阶段 1. 必备工具配置 浏览器套件:安装最新Chrome102+,开启实验性功能(地址栏输入chrome://flags/#enable-devtools-experiments)编辑器集成:VS Code安装以下扩展: JavaScript Debugger:支持浏览器与Node.js双端调试Error Lens:实…...
不能将下载行为传输到IDM
目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 安装IDM后,调用IDM下载软件显示:不能将下载行为传输到IDM,Error 0x80029C4A 二、原因分析 可能是识别浏览器插件不到,或者本地的插件版本不对导致的 三…...
spring security 认证流程分析
Spring Security 认证流程分析 Spring Security 的认证流程是一个模块化且可扩展的过程,核心围绕 过滤器链 和 认证组件 协作实现。以下是详细流程分析: 1. 请求拦截与过滤器链 • 入口:所有 HTTP 请求经过 Spring Security 的过滤器链。 •…...
Docker Compose 部署 Loki
官方文档:https://grafana.com/docs/loki/latest/setup/install/docker/ 环境准备 安装 Docker和Docker Compose 参考:https://qiangsh.blog.csdn.net/article/details/125375187 创建loki目录 mkdir -p /opt/loki/config mkdir -p /data/monitoring…...
nuxt3 seo优化
在 Nuxt3 中,通过 nuxtjs/seo、nuxtjs/sitemap 和 nuxtjs/robots 模块可以生成包含动态链接的站点地图(sitemap.xml),但具体是“实时生成”还是“部署时生成”,取决于你的配置方式和数据更新频率。以下是具体分析&…...
CentOS 8 Stream 配置在线yum源参考 —— 筑梦之路
CentOS 8 Stream ISO 文件下载地址:http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_64/CentOS-Stream-8-20240603.0-x86_64-dvd1.isoCentOS 8 Stream 网络引导ISO 文件下载地址:http://mirrors.aliyun.com/centos-vault/8-stream/isos/x86_6…...
uniapp 在app上 字体如何不跟着系统字体大小变
在UniApp开发中,默认情况下App的字体可能会跟随系统字体设置而变化。如果你希望保持固定的字体样式,不随系统字体设置改变,可以采用以下几种方法: 方法一:全局CSS设置 在App.vue的样式中添加以下CSS: /*…...
leetcode141.环形链表
直接快慢指针,如果有环,那么快指针一定会在成环的起始点与慢指针相遇 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ pu…...
【HTML5游戏开发教程】零基础入门合成大西瓜游戏实战 | JS物理引擎+Canvas动画+完整源码详解
《从咖啡杯到财务自由:一个程序员的合成之旅——当代码遇上物理引擎的匠心之作》 🌟 这是小游戏开发系列的第四篇送福利文章,感谢一路以来支持和关注这个项目的每一位朋友! 💡 文章力求严谨,但难免有疏漏之…...
【C#语言】深入理解C#多线程编程:从基础到高性能实践
文章目录 ⭐前言⭐一、多线程的本质价值🌟1、现代计算需求🌟2、C#线程演进史 ⭐二、线程实现方案对比🌟1、传统线程模型🌟2、现代任务模型(推荐)🌟3、异步编程范式 ⭐三、线程安全深度解析&…...
短信验证码安全需求设计
背景: 近期发现部分系统再短信充值频繁,发现存在恶意消耗短信额度现象,数据库表排查,发现大量非合法用户非法调用短信接口API导致额度耗尽。由于系统当初设计存在安全缺陷,故被不法分子进行利用,造成损失。…...
selenium实现自动登录项目(5)
1、163邮箱自动登录功能 遇到的问题: 1、登录页面,在定位表单时候,采用id,xpath,css selector都无法定位成功,因为id后面有个随机生成的数字(//*[id"x-URS-iframe1741925838640.6785&quo…...
多 线 程
一.基本知识 线程:线程是操作系统能够运行调度的最小单位 进程:进程是程序执行实体 多线程应用场景:拷贝、迁移大文件,加载大量的资源文件 并发:有多个指令在单个cpu上交替执行 并行:在同一时刻人&…...
C#:类型定义中使用问号(?)
在 C# 中,类型定义中的问号(?)主要用于控制类型的可空性,但具体行为因类型(值类型或引用类型)和 C# 版本而异。以下是清晰分类的说明: 一、可空值类型(T?,适用于所…...
基于飞腾FT2000+服务器主板与DeepSeek大模型的国产化AI算力探索
随着国产化处理器和AI技术的快速发展,自主可控的算力解决方案日益受到关注。国内大模型技术飞速发展,Deepseek等大模型在自然语言处理、计算机视觉等领域展现出强大的能力。面对大模型的计算需求,服务器硬件的国产化成为重要趋势。 飞腾FT20…...
知识篇 | Oracle的 TEMP表空间管理和优化
Oracle临时表空间(TEMP)是数据库中用于存储会话级临时数据的核心组件,主要用于支持需要中间结果集的操作(如排序、哈希连接)。其数据在事务结束或会话终止后自动释放,不持久化存储。 核心特点:…...
鸿蒙进行视频上传,使用 request.uploadFile方法
一.拉起选择器进行视频选择,并且创建文件名称 async getPictureFromAlbum() {// 拉起相册,选择图片let PhotoSelectOptions new photoAccessHelper.PhotoSelectOptions();PhotoSelectOptions.MIMEType photoAccessHelper.PhotoViewMIMETypes.VIDEO_TY…...
如何下载 Postman?快速指南!
Postman 是一款非常受欢迎的 API 测试工具。它最初是作为一个 Chrome 插件发布,后来发展成为一款独立的跨平台软件,支持 Windows、Mac、Linux 等操作系统。 Postman 怎么下载教程(2025最新版)?...
Angular由一个bug说起之十五:自定义基于Overlay的Tooltip
背景 工具提示(tooltip)是一个常见的 UI 组件,用于在用户与页面元素交互时提供额外的信息。由于angular/material/tooltip的matTooltip只能显示纯文本,所以我们可以通过自定义Directive来实现一个灵活且功能丰富的tooltip Overlay…...
M系mac怎么关闭sip
SIP是系统级的权限操作,我们无法直接关闭它。记录一下如何成功关闭SIP。 一. 查看自己mac的sip是否关闭,终端中输入该下命令: csrutil status 未关闭:System Integrity Protection status: enabled. 已关闭:System…...
Kafka 的延迟队列、死信队列和重试队列
总结一下实现的方法: 1、延迟队列,首先kafka是没有延迟队列的,那要实现延迟队列的话,就得使用其他方法。在发送消息的时候加上时间戳,再在时间戳上面加上延迟时间。消费的时候判断一下,有没有到达延迟时间&…...
OpenCV正确安装及环境变量配置
安装OpenCV(v4.6.0)安装Python(3.10.6)安装VS2022的C桌面开发,手动勾选Windows 10 SDK和MSVC安装CMake(3.31.6)在.npmrc配置pnpm config set auto-approve-builds true运行pnpm install 接下来是…...
分布式系统的CAP理论、事务和锁实现
分布式系统核心概念 1. CAP理论 CAP理论指出,分布式系统最多同时满足以下三项中的两项: 一致性(CC):所有节点访问同一份最新数据。可用性(AA):每个请求都能在合理时间内获得非错误…...
JBDev - Theos下一代越狱开发工具
JBDev - Theos下一代越狱开发工具 自越狱诞生以来,Theos一直是越狱开发的主流工具,大多数开发者使用Theos编译代码,再用lldb手动调试。JBDev简化了这个过程,项目地址https://github.com/lich4/JBDev 简介 JBDev用于Xcode越狱开…...
vue3自定义动态锚点列表,实现本页面锚点跳转效果
需求:当前页面存在多个模块且内容很长时,需要提供一个锚点列表,可以快速查看对应模块内容 实现步骤: 1.每个模块添加唯一id,添加锚点列表div <template><!-- 模块A --><div id"modalA">…...
华为、浪潮、华三链路聚合概述
1、华为 链路聚合可以提高链路带宽和链路冗余性。有三种类型,分别是手工链路聚合,静态lacp链路聚合,动态lacp链路聚合。 手工链路模式:也称负载分担模式,需手动指定链路,各链路之间平均分担流量。静态LAC…...
RUBY报告系统
我们常用GFP及其变体如RFP、YFP、mCherry等作为基因表达的报告蛋白——需要荧光显微镜制片观察;此外还有GUS或荧光素酶作为报告酶——需要添加底物。 RUBY报告系统则与众不同,其作用原理是:将酪氨酸转化为鲜艳的红色甜菜碱,无需使…...
HO与OH差异之Navigation三
在上一篇内容中我们介绍了HO与OH差异之Navigator,我们也了解了Navigator的基本概念和大致了解了一下他的基础用法,既然谈到差异肯定就不止这两种差异,今天就让我们来了解第三种差异NavRouter,其中在HO中我们并没有这种路由方式但是…...
PyTorch处理数据--Dataset和DataLoader
在 PyTorch 中,Dataset 和 DataLoader 是处理数据的核心工具。它们的作用是将数据高效地加载到模型中,支持批量处理、多线程加速和数据增强等功能。 一、Dataset:数据集的抽象 Dataset 是一个抽象类,用于表示数据集的接口。你…...
Linux搭建NFS服务
1.概述 Network File System的缩写,它最大的功能是可以通过网络使用挂载的方式,让不同的机器、不同的操作系统可以共享彼此的文件 2.名称 软件名 nfs-utils服务名 nfs或者nfs-server 3.端口 nfs-server tcp/2049 负责建立连接 rpcbind tcp/111 负责…...
ubuntu服务器server版安装,ssh远程连接xmanager管理,改ip网络连接。图文教程
ventoy启动服务器版iso镜像,注意看server名称,跟之前desktop版ubuntu不一样。没有gui界面。好,进入命令行界面。语言彻底没汉化了,选英文吧,别的更看不懂。 跟桌面版ubuntu类似,选择是否精简系统࿰…...
GC overhead limit exceeded---Java 虚拟机 (JVM) 在进行垃圾回收内存量非常少解决
背景: 我正在跑一个数据处理较为复杂的程序。然后调试了很多遍,出现了GC问题,如下图bug. GC overhead limit exceeded-这个bug错误通常表示 Java 虚拟机 (JVM) 在进行垃圾回收时花费了过多的时间,并且回收的内存量非常少。…...
Pytorch学习笔记(十二)Learning PyTorch - NLP from Scratch
这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 NLP from Scratch 部分。 官网链接:https://pytorch.org/tutorials/intermediate/nlp_from_scratch_index.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m 提取码: …...
学习日记0327
A cross-domain knowledge tracing model based on graph optimal transport 我们使用gnn来学习这些节点的特征。在此基础上,我们使用显式分布距离度量对齐来自两个不同域的特征向量,旨在最小化域差异,实现最大的跨域知识转移。 AEGOT-CDKT…...
Postman 下载文件指南:如何请求 Excel/PDF 文件?
在 Postman 中进行 Excel/PDF 文件的请求下载和导出,以下是简明的步骤,帮助你轻松完成任务。首先,我们将从新建接口开始,逐步引导你完成整个过程。 Postman 请求下载/导出 excel/pdf 文件教程...
【HTML】验证与调试工具
个人主页:Guiat 归属专栏:HTML CSS JavaScript 文章目录 1. HTML 验证工具概述1.1 验证的重要性1.2 常见 HTML 错误类型 2. W3C 验证服务2.1 W3C Markup Validation Service2.2 使用 W3C 验证器2.3 验证结果解读 3. 浏览器开发者工具3.1 Chrome DevTools…...
头歌实践教学平台--【数据库概论】--SQL
一、表结构与完整性约束的修改(ALTER) 1.修改表名 USE TestDb1; alter table your_table rename TO my_table; 2.添加与删除字段 #语句1:删除表orderDetail中的列orderDate alter table orderDetail drop orderDate; #语句2:添加列unitPrice alter t…...
2025.03.27【基因分析新工具】| MAST:解锁基因表达差异分析与网络构建
文章目录 1. MAST工具简介:探索生物信息分析的新利器1.1 什么是MAST工具?1.2 MAST工具的优势1.3 MAST工具的应用场景 2. MAST的安装方法:轻松入门的第一步2.1 安装R语言环境2.2 安装MAST包2.3 安装依赖库 3. MAST常用命令:掌握数据…...
JVM - 垃圾回收基本问题
通过一些问题来讨论在 JVM 中,垃圾回收的一些基本问题 为什么要有垃圾回收?Java 垃圾回收中是如何判断一个对象死亡的?请简单介绍一下刚才说到了引用计数法,引用计数法存在什么问题?刚才说到了可达性分析,…...
Python 爬虫案例
以下是一些常见的 Python 爬虫案例,涵盖了不同的应用场景和技术点: 1. 简单网页内容爬取 案例:爬取网页标题和简介 import requests from bs4 import BeautifulSoup url "https://www.runoob.com/" response requests.get(url) …...
从零构建大语言模型全栈开发指南:第三部分:训练与优化技术-3.1.3分布式数据加载与并行处理(PyTorch DataLoader优化)
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 3.1.3 分布式数据加载与并行处理(`PyTorch DataLoader`优化)1. 大规模数据加载的挑战与瓶颈分析1.1 数据加载流程的时间分解2. PyTorch DataLoader的深度优化策略2.1 核心参数调优2.2 分布式数据分片策…...
2025年- G31-Lc105-102. 二叉树层次遍历--java版
1.题目描述 2.思路 思路一: 使用 队列 Queue 来存储当前层的所有节点。关键点在于 levelSize queue.size() 这一行,它决定了当前层的节点数量。 3.代码实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* Tr…...
Redis 和 MySQL双写一致性的更新策略有哪些?常见面试题深度解答。
目录 一. 业务数据查询,更新顺序简要分析 二. 更新数据库、查询数据库、更新缓存、查询缓存耗时对比 2.1 更新数据库(最慢) 2.2 查询数据库(较慢) 2.3 更新缓存(次快) 2.4 查询缓存&#…...