基于Canvas的吃豆人小游戏(附完整源码,TypeScript)

用canvas画飞机大战(一步步详解附带源代码,源码和素材上传到csdn,可以免费下载) 前端canvas飞机大战,文章里附带源码及步骤详解.源码及图片素材我也上传在csdn,需要的可以免费下载 阅读详情

 

🎉 经典游戏的魅力,永不褪色!最终游戏效果图如上,希望你能通过这篇文章,重新体验到吃豆人的乐趣!

目录

背景介绍

技术要点

1. TypeScript 语言特点及优势

2. HTML5 Canvas 2D 绘图 API

3. React 状态管理与组件化

4. 游戏逻辑与碰撞检测

5. 动画与帧循环

完整代码

源码下载

代码分析

1. 程序初始化与显示设置

2. 游戏画布的绘制

3. 吃豆人和幽灵的移动逻辑

4. 碰撞检测与游戏结束条件

5. 爆炸效果的实现

6. 总结

注意事项

写在后面

版权声明

参考资料


背景介绍

吃豆人(Pac-Man)是一款经典的街机游戏,自1980年推出以来,一直是游戏界的标志性作品。玩家控制一个黄色的小圆点,在迷宫中移动,吃掉所有的豆子,同时躲避追逐的幽灵。当玩家触碰到幽灵时,游戏结束。这款游戏不仅考验玩家的反应能力,还考验策略和规划能力。

在本项目中,我们将使用 TypeScript、React 和 HTML5 Canvas 来实现一个简化版的吃豆人游戏。通过这个项目,你将了解到如何结合现代前端技术来实现经典游戏的复刻,并掌握游戏开发中的一些核心技术。


技术要点

实现吃豆人游戏需要掌握以下关键技术,它们共同构成了实现这一经典游戏的基础。

1. TypeScript 语言特点及优势

TypeScript 是 JavaScript 的超集,提供了类型系统和面向对象编程的支持。它在实现吃豆人游戏中的主要优势包括:

  • 类型安全:通过类型注解减少运行时错误,提升代码的可维护性。

  • 面向对象编程:支持类和接口,便于将游戏对象(如吃豆人、幽灵、豆子等)封装为独立的模块。

  • 工具友好:与现代开发工具(如 VS Code)集成良好,提供智能提示和代码检查功能。

2. HTML5 Canvas 2D 绘图 API

HTML5 Canvas 提供了强大的 2D 绘图能力,是实现游戏画面的核心工具。关键特性包括:

  • 绘图上下文:通过 getContext('2d') 获取绘图上下文,支持绘制图形、文本和图像。

  • 图形绘制:使用 arc、fillRect 等方法绘制圆形豆子、矩形障碍物和吃豆人。

  • 透明度和渐变:通过 fillStyle 和 globalAlpha 控制颜色透明度,实现爆炸效果的渐变。

3. React 状态管理与组件化

虽然游戏的核心逻辑主要依赖 Canvas 和 TypeScript,但 React 提供了组件化开发的优势:

  • 状态管理:通过 useState 和 useEffect 管理游戏状态,避免不必要的重新渲染。

  • 事件处理:通过 React 的事件系统(如键盘事件)增强交互性,允许玩家通过键盘控制吃豆人移动。

  • 组件化:将游戏的不同部分(如游戏画布、爆炸效果等)拆分为独立的组件,提升代码的可读性和可维护性。

4. 游戏逻辑与碰撞检测

游戏的核心逻辑包括:

  • 移动逻辑:控制吃豆人和幽灵的移动。

  • 碰撞检测:检测吃豆人是否吃到豆子,以及是否与幽灵碰撞。

  • 游戏结束条件:当吃豆人与幽灵碰撞时,游戏结束。

5. 动画与帧循环

动画效果的实现依赖于高效的帧循环,核心技术包括:

  • requestAnimationFrame:浏览器提供的 API,用于实现平滑的动画效果。它会自动根据屏幕刷新率调整帧率,确保动画的流畅性。

  • 帧循环逻辑:在每一帧中更新游戏状态、清除画布并重新绘制,实现动态效果。


完整代码

以下是实现吃豆人游戏的完整代码:

index.tsx(游戏主逻辑,核心)

import React, { useState, useEffect, useCallback } from 'react';
import { GameCanvas } from './components/GameCanvas';
import { ExplosionEffect } from './components/ExplosionEffect';
import { GameState, Position, Ghost, Dot, Obstacle } from './types';

const CELL_SIZE = 40;
const GAME_SPEED = 150;
const GHOST_COLORS = ['#FFB6C1', '#87CEEB', '#98FB98', '#DDA0DD'];
const GRID_COLS = 10;
const GRID_ROWS = 10;

// 初始化豆子
const initializeDots = (): Dot[] => {
  const dots: Dot[] = [];
  for (let x = 0; x < GRID_COLS; x++) {
    for (let y = 0; y < GRID_ROWS; y++) {
      dots.push({
        position: { x: x * CELL_SIZE, y: y * CELL_SIZE },
        eaten: false
      });
    }
  }
  return dots;
};

// 初始化障碍物
const initializeObstacles = (): Obstacle[] => {
  const obstacles: Obstacle[] = [];
  const numObstacles = 8; // 障碍物数量
  
  for (let i = 0; i < numObstacles; i++) {
    let position;
    do {
      position = {
        x: Math.floor(Math.random() * GRID_COLS) * CELL_SIZE,
        y: Math.floor(Math.random() * GRID_ROWS) * CELL_SIZE
      };
    } while (
      // 确保障碍物不会出现在起始位置和其他障碍物位置
      (position.x === 0 && position.y === 0) ||
      obstacles.some(obs => 
        obs.position.x === position.x && 
        obs.position.y === position.y
      )
    );
    
    obstacles.push({ position });
  }
  return obstacles;
};

// 检查是否与障碍物碰撞
const checkObstacleCollision = (position: Position, obstacles: Obstacle[]): boolean => {
  return obstacles.some(obstacle => 
    obstacle.position.x === position.x && 
    obstacle.position.y === position.y
  );
};

export const PacmanGame: React.FC = () => {
  const [gameState, setGameState] = useState<GameState>({
    pacman: {
      position: { x: 0, y: 0 },
      direction: 'right',
      mouthOpen: true
    },
    ghosts: GHOST_COLORS.map((color, index) => {
      // 将怪物放在地图右下角区域
      const row = Math.floor(GRID_ROWS * 0.7) + index % 2; // 从70%的位置开始
      const col = Math.floor(GRID_COLS * 0.7) + Math.floor(index / 2); // 从70%的位置开始
      return {
        position: { 
          x: Math.min(col, GRID_COLS - 1) * CELL_SIZE,
          y: Math.min(row, GRID_ROWS - 1) * CELL_SIZE
        },
        color,
        direction: 'right'
      };
    }),
    dots: initializeDots(),
    obstacles: initializeObstacles(),
    gameOver: false,
    score: 0
  });

  const [showExplosion, setShowExplosion] = useState(false);
  const [explosionPosition, setExplosionPosition] = useState<Position>({ x: 0, y: 0 });

  const moveGhosts = useCallback(() => {
    setGameState(prev => ({
      ...prev,
      ghosts: prev.ghosts.map(ghost => {
        const newPosition = { ...ghost.position };
        const step = CELL_SIZE;

        let attempts = 0;
        let validMove = false;
        
   
微信H5小游戏开发实战:从Phaser 3到完整项目部署 H5游戏开发是前端技术栈的重要应用领域,其核心在于利用Canvas或WebGL实现高性能图形渲染,并结合现代前端工程化工具构建可维护的项目。通过游戏引擎(如Phaser 3)管理场景、物理与动画,开发者能高效实现复杂游戏逻辑。在微信生态中,H5小游戏的价值在于其强大的社交传播能力与便捷的分发渠道。本文聚焦于实战,详细拆解了如何利用对象池技术优化Canvas渲染性能,并系统阐述了对接微信JSSDK实现登录、支付与分享功能的关键步骤与避坑指南,最终完成一个可上线部署的完整项目。 阅读详情

相关推荐

微信小游戏开发实战:一人工作室的轻量架构与真机优化

微信小游戏并非普通H5游戏,而是运行于微信自研WASM沙箱、受严格资源加载与交互时序约束的轻量级应用平台。其核心原理在于依托X5内核(Android)与WebView(iOS)实现跨端一致渲染,通过CDN预加载校验、手势触发AudioContext、Canvas双模适配等机制保障性能与体验。技术价值体现在极低的用户获取成本、天然社交裂变通路及免安装即用的传播效率。典型应用场景包括休闲游戏、互动营销、校园轻应用及学生毕设项目。本文聚焦一人工作室真实路径,深入解析TypeScript原生Canvas方案、Min

weixin_34015336的博客 306

一人工作室做微信小游戏的实战避坑指南

微信小游戏是一种运行在微信客户端JS沙箱中的轻量级WebGL/Canvas应用,其核心约束包括4MB主包限制、CDN资源加载、白名单API调用及ES5兼容性要求。理解这些底层原理,是规避打包失败、真机白屏、审核驳回等高频问题的技术前提。Cocos Creator 2.4.10凭借原生微信平台支持、低包体输出与稳定TS集成,成为个人开发者最可行的工程底座;而TypeScript则通过精准类型定义与异步错误分类,显著提升开发健壮性。本文聚焦一人工作室真实作战半径,覆盖环境适配、包体压缩、真机调试与审核合规四大关

weixin_34342905的博客 274

一人工作室微信小游戏高效开发实战指南

微信小游戏是一种轻量级、高传播性的Web技术应用形态,依托Canvas 2D渲染、小程序API和微信支付生态构建闭环体验。其核心原理在于利用原生JavaScript/TypeScript直接调用wx接口,规避重型引擎带来的包体膨胀与兼容风险;技术价值体现在快速验证、低门槛上线与高ROI运营上。典型应用场景包括休闲游戏、互动营销、教育工具等对启动速度与分发效率敏感的领域。本文聚焦‘一人工作室’模式,结合Vibe Coding理念与AI编程提效实践,系统拆解从环境搭建、Canvas精简渲染、支付合规到审核避坑的

weixin_34050005的博客 248

一人工作室微信小游戏实战:从game.json到上线留存全链路

微信小游戏开发本质是轻量级、高迭代的工程实践,核心在于环境配置可靠性、构建链路可控性与真机验证闭环。TypeScript在此场景下并非语法炫技,而是保障单人长期维护与逻辑一致性的关键约束;game.json作为运行时‘宪法’,其字段大小写、数组格式与动态开关策略直接决定API可用性与包体积。结合Cocos Creator微信专用构建模板、开发者工具真机调试三步法及软著受理号驱动的冷启动节奏,一人开发者可绕过Unity打包陷阱,在72小时内完成MVP验证。本文聚焦可落地的配置规范、避坑清单与极简数据监控方案,

weixin_34242331的博客 405

JavaScript实现吃豆游戏(附完整源码)

JavaScript实现吃豆游戏(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 429

微信小游戏宝可梦图鉴完整源码解析与实战

微信小游戏自诞生以来,凭借其无需下载安装、即点即玩的便捷性,以及微信平台的巨大用户群体,迅速成为开发者和投资者关注的焦点。本章节旨在为读者提供微信小游戏框架应用的入门级知识和背景信息,帮助读者理解微信小游戏的基本概念、技术特性和开发环境。微信小游戏是基于微信平台,运行在微信内部的网页游戏。它利用HTML5技术,结合微信的社交属性,让玩家能够在微信聊天窗口中直接玩游戏,分享游戏成绩到朋友圈或微信群。小游戏的开发框架主要是基于JavaScript语言,使用的是微信官方提供的小游戏开发文档和API。

weixin_28713083的博客 1108

html5塔防游戏源码_canvas绘图塔防游戏源码下载

html5塔防游戏源码_canvas绘图塔防游戏源码下载 html5塔防游戏源码_canvas绘图塔防游戏源码下载

html5 canvas我们要发财了游戏源码下载

html5 canvas我们要发财了游戏源码下载 html5 canvas我们要发财了游戏源码下载

html5 canvas实现的小游戏

利用html5 canvas制作的小游戏。

HTML5 CANVAS游戏开发实战(PDF和源代码)

第一部分 准备工作篇 第1章 准备工作 / 2 1.1 html5介绍 / 2 1.1.1 什么是html5 / 2 1.1.2 html5的新特性 / 2 1.2 canvas简介 / 5 1.2.1 canvas标签的历史 / 5 1.2.2 canvas的定义和用法 / 6 1.2.3 如何使用canvas来绘图 / 6 1.2.4 canvas的限制 / 7 1.3 开发与运行环境的准备 / 7 1.3.1 浏览器的支持 / 7 1.3.2 准备一个本地的服务器 / 8 1.4 开发工具的选择 / 8 1.5 测试与上传代码 / 12 1.6 javascript中的面向对象 / 13 1.6.1 类 / 13 1.6.2 静态类 / 16 .1.6.3 继承 / 16 1.7 小结 / 17 第二部分 基础知识篇 第2章 canvas基本功能 / 20 2.1 绘制基本图形 / 20 2.1.1 画线 / 20 2.1.2 画矩形 / 22 2.1.3 画圆 / 24 2.1.4 画圆角矩形 / 26 2.1.5 擦除canvas画板 / 27 2.2 绘制复杂图形 / 28 2.2.1 画曲线 / 28 2.2.2 利用clip在指定区域绘 图 / 30 2.2.3 绘制自定义图形 / 31 2.3 绘制文本 / 32 2.3.1 绘制文字 / 32 2.3.2 文字设置 / 33 2.3.3 文字的对齐方式 / 38 2.4 图片操作 / 41 2.4.1 利用drawimage绘制图片 / 41 2.4.2 利用getimagedata和putimagedata绘制图片 / 45 2.4.3 利用createimagedata新建像素 / 47 2.5 小结 / 49 第3章 canvas高级功能 / 50 3.1 变形 / 50 3.1.1 放大与缩小 / 50 3.1.2 平移 / 53 3.1.3 旋转 / 54 3.1.4 利用transform矩阵实现多样化的变形 / 56 3.2 图形的渲染 / 65 3.2.1 绘制颜色渐变效果的图形 / 65 3.2.2 颜色合成之globalcompositeoperation属性 / 67 3.2.3 颜色反转 / 69 3.2.4 灰度控制 / 70 3.2.5 阴影效果 / 71 3.3 自定义画板 / 72 3.3.1 画板的建立 / 72 3.3.2 canvas画布的导出功能 / 79 3.4 小结 / 81 第4章 lufylegend开源库件 / 82 4.1 lufylegend库件简介 / 82 4.1.1 工作原理 / 82 4.1.2 库件使用流程 / 83 4.2 图片的加载与显示 / 84 4.2.1 图片显示举例 / 84 4.2.2 lbitmapdata对象 / 86 4.2.3 lbitmap对象 / 87 4.3 层的概念 / 88 4.4 使用lgraphics对象绘图 / 90 4.4.1 绘制矩形 / 90 4.4.2 绘制圆 / 91 4.4.3 绘制任意多边形 / 92 4.4.4 使用canvas的原始绘图函数进行绘图 / 93 4.4.5 使用lsprite对象进行绘图 / 94 4.4.6 使用lgraphics对象绘制图片 / 95 4.5 文本 / 101 4.5.1 文本属性 / 101 4.5.2 输入框 / 102 4.6 事件 / 103 4.6.1 鼠标事件 / 103 4.6.2 循环事件 / 104 4.6.3 键盘事件 / 105 4.7 按钮 / 106 4.8 动画 / 108 4.9 小结 / 113 第三部分 开发实战篇 第5章 从简单做起—“石头剪子布”游戏 / 116 5.1 游戏分析 / 116 5.2 必要的javascript知识 / 117 5.2.1 随机数 / 117 5.2.2 条件分支 / 117 5.3 分层实现 / 117 5.4 各个层的基本功能 / 119 5.4.1 基本画面显示 / 119 5.4.2 结果层的显示 / 126 5.4.3 控制层的显示 / 127 5.5 出拳 / 129 5.6 结果判定 / 131 5.7 小结 / 137 第6章 开发“俄罗斯方块”游戏 / 138 6.1 游戏分析 / 138 6.2 必要的javascript知识 / 138 6.3 游戏标题画面显示 / 139 6.4 向游戏里添加方块 / 141 6.5 控制方块的移动 / 152 6.5.1 键盘事件 / 152 6.5.2 触屏事件 / 155 6.6 方块的消除和得分的显示 / 157 6.7 小结 / 160 第7章 开发“是男人就下一百层”游戏 / 161 7.1 游戏分析 / 161 7.2 游戏标题画面显示 / 161 7.3 读取图片与背景显示 / 162 7.4 添加一个静止的地板 / 167 7.5 添加游戏主角 / 170 7.5.1 让游戏主角出现在画面上 / 170 7.5.2 通过键盘事件来控制游戏主角的移动 / 177 7.5.3 通过触屏事件来控制游戏主角的移动 / 178 7.6 添加多种多样的地板 / 179 7.6.1 会消失的地板 / 179 7.6.2 带刺的地板 / 181 7.6.3 带有弹性的地板 / 182 7.6.4 向左和向右移动的地板 / 184 7.7 游戏数据的显示 / 187 7.8 游戏结束与重开 / 190 7.9 小结 / 192 第8章 开发射击类游戏 / 193 8.1 游戏分析 / 193 8.2 添加一架可控飞机 / 194 8.2.1 添加一个飞机类 / 194 8.2.2 可控飞机类 / 197 8.3 为飞机添加多样化的子弹 / 203 8.3.1 建立一个子弹类 / 203 8.3.2 单发子弹 / 205 8.3.3 多发子弹 / 207 8.3.4 环形子弹 / 208 8.3.5 反向子弹 / 209 8.4 添加敌机 / 209 8.4.1 建立一个敌机类 / 210 8.4.2 建立一个敌机boss类 / 214 8.5 碰撞检测 / 217 8.5.1 飞机与子弹的碰撞 / 217 8.5.2 我机与敌机的碰撞 / 220 8.6 子弹的变更 / 221 8.6.1 建立一个弹药类 / 222 8.6.2 弹药与我机的碰撞 / 223 8.7 飞机生命值的显示 / 225 8.8 游戏胜利与失败判定 / 226 8.9 小结 / 228 第9章 开发物理游戏 / 229 9.1 box2d简介 / 229 9.2 box2dweb在lufylegend库件中的使用 / 229 9.3 创建各种各样的物体 / 234 9.3.1 矩形物体 / 234 9.3.2 圆形物体 / 237 9.3.3 多边形物体 / 239 9.4 响应鼠标拖拽物体 / 242 9.5 关节(joint) / 243 9.5.1 距离关节(b2distancejointdef) / 243 9.5.2 旋转关节(b2revolutejointdef) / 245 9.5.3 滑轮关节(b2pulleyjointdef) / 247 9.5.4 移动关节(b2prismaticjoint) / 248 9.5.5 齿轮关节(b2gearjoint) / 250 9.5.6 悬挂关节(b2linejoint) / 252 9.5.7 焊接关节(b2weldjoint) / 253 9.5.8 鼠标关节(mouse joint) / 254 9.6 力 / 254 9.7 碰撞检测 / 256 9.8 镜头移动 / 260 9.9 做一个简单的物理游戏 / 263 9.10 小结 / 267 第10章 开发网络游戏 / 268 10.1 http通信 / 268 10.1.1 如何实现http通信 / 268 10.1.2 http通信的弊端 / 275 10.2 socket通信 / 275 10.2.1 区分socket通信和http通信 / 276 10.2.2 服务器端 / 276 10.2.3 客户端 / 281 10.3 利用websocket实现简单的聊天室 / 283 10.4 做一款多人在线的坦克大战 / 293 10.4.1 服务器 / 293 10.4.2 客户端 / 293 10.5 小结 / 307 第四部分 技能提高篇 第11章 提高效率的分析 / 310 11.1 绘图时使用小数的影响 / 310 11.2 drawimage和putimagedata的效率比较 / 311 11.3 区域更新和图片大小对绘图效率的影响 / 311 11.4 图片格式对绘图效率的影响 / 313 11.5 优化代码以提高整体效率 / 314 11.5.1 使用位运算 / 314 11.5.2 少用math静态类 / 316 11.5.3 优化算法 / 319 11.6 小结 / 322 · · · · · · (收起)

canvas简单游戏

canvas 实现2d 简单小游戏,点击出现蓝色攻击方块,攻击黑色方块得分,触碰红色方块游戏结束,黑色方块想灭完,游戏等级提升

HTML5用Canvas编写的游戏源码.zip

HTML5用Canvas编写的游戏源码.zip

医学成像学习笔记(一):核磁共振成像(MRI)k空间为何是图像频谱详解

前言   k空间是核磁共振成像图像重建的核心,可能很多人像笔者一样第一次学时会非常疑惑,为何k空间是图像的频域空间,观其填充过程,明明是空域信号的采样填充呀。网上很少有文章讨论这个问题,所以笔者在此写下自己的理解,供大家参考。 MRI位置编码   现在的MRI一次扫描的是一个断层或者多个断层,所谓断层就是一个有厚度的面,通过z方向梯度场来选择。我们扫描一个断层的目的是为了获得该断层各位置的质子情况,它们携带着组织的性质信息,反应出来的就是信号强度。如果整个断层都采用相同的磁场强度,而我们只能得到一个断

意疏的学习笔记 1万+

ZYNQ实战:PS端驱动DMA实现高效数据流转与验证

本文详细介绍了在ZYNQ平台上通过PS端驱动DMA实现高效数据流转的实战方法。从ZYNQ的PS与PL数据交互基础出发,深入解析DMA核心价值,包括硬件平台搭建、Vivado配置、PS端软件架构设计及性能优化技巧,帮助开发者提升数据传输效率与系统性能。

weixin_29192141的博客 436

自学 ABAP 和自学 SAP 的差别

有朋友在我的 ABAP 学习教程里留言: > 自学SAP是不是都要搭建虚拟服务器,然后自己去官网下载新版本SAP就可以吗 对于初学者,我们要搞清楚 ABAP 和 SAP 的区别。 ABAP 是一门编程语言,SAP 首先是德国软件公司的名称,也代表这家公司开发的一系列软件。SAP 公司开发的软件,我们有时也称产品,其功能能满足客户一个或者多个领域的业务需求。这些不同领域,我们也称为不同的业务模块,比如 ERP,CRM,SRM,HR 等等。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 6863

终于找到两个稳定好用的Docker镜像加速源,拉取速度提升几十倍!

国内使用Docker经常遇到镜像拉取慢、超时失败的问题🐳 本文分享两个亲测好用的免费镜像加速源⚡ 实测拉取速度从十几分钟缩短到几十秒,稳定性接近100%📊 支持一键配置脚本,支持多平台使用✨

XiaoqiangClub的博客 953

【深度学习新浪潮】Qwen门控注意力斩获NeurIPS 2025最佳论文!技术解析与代码实现

Qwen团队的门控注意力机制获得NeurIPS 2025最佳论文,不仅是中国AI研究的重大突破,更是大模型架构创新的重要里程碑。这项研究证明,通过巧妙的架构设计,可以在不显著增加计算成本的前提下,大幅提升模型性能。正如论文所展示的,用一个极其简单的改动,同时解决了Transformer架构中的多个核心问题,这正是优秀研究的价值所在。该技术已成功应用于Qwen3大模型,为通义千问系列产品的性能提升提供了坚实的技术支撑。轻量化大模型设计多模态统一架构专用领域大模型优化边缘计算场景部署。

专注:太空算力、AI infra、异构调度、大模型成本工程 570

工程师必收藏,Juniper(Junos)网络设备命令大全

不要直接删除配置 → 使用deactivate配置前先修改大配置用出现风险命令一律用写自动化时一律用格式真正会用 Juniper 的工程师,不是命令多,而是命令用得精。

网络技术联盟站 404

基于学术研究风云卫星数据下载教程

目录 一、相关网址 1.登录注册网址:国家卫星气象中心 2.风云数据服务客户端下载网址 3.风云卫星遥感数据服务网址 二、下载数据步骤 1.首先在注册登录网址,注册一个账户 2.待账户审核后,登录账户即可搜索并下载数据 三、相关工具下载 1.登录风云卫星遥感数据服务网址 2.NCSA HDFView软件 3.风云卫星数据(L1)处理软件包(FENGYUN Toolkit v1.1) 4.静止卫星云图分区图显示软件(SECView) 5.风云二号静止气象卫星数据及产品处理..

珞瑜的博客 1万+

ArcGIS实验教程——实验二:ArcGIS地理配准完整操作步骤

本文介绍ArcGIS 10.2中地理配准的完整操作流程,涵盖加载扫描地图、启用地理配准工具条、添加控制点(含经纬度输入与坐标系统选择)、均匀分布控制点以提升精度,并最终通过“更新地理配准”完成栅格数据的空间定位。强调控制点数量、分布及坐标系匹配的重要性,附带实验数据下载链接与获取方式,适用于初学者掌握扫描矢量化前的关键几何校正技能。

智慧空间实验室 9万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: DuckDB:QueryProfiler(查询分析器)
下一篇: 依赖管理在 DuckDB 扩展中的应用
Whoisbug
博客等级 码龄9年 894粉丝 57原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值