国际象棋
快速阅读 记录上学时做过的一个国际象棋软件。 功能概述 玩家对战:玩家之间轮流控制各自的棋子,吃掉对方的王获得胜利。合法的落点高亮,不合法的落点不对鼠标做出响应。 人机对战:玩家通过鼠标控制自己的棋子,AI通过搜索算法获得将要移动的棋子及移动的目标位置。AI走棋没有控制阶段但设置了完整的过渡动画。 控制面板:控制面板能够修改游戏模式、重置游戏进度、调整AI难度。 特殊规则: 兵的升变:本方任何一个兵直进达到对方底线时,即可升变为除 “王” 和 “兵” 以外的任何一种棋子。 王车易位:这是国际象棋中比较特殊的行棋规则,车和王在一些情况下可以互换位置。 吃过路兵:如果对方的兵第一次行棋且直进两格,刚好形成本方有兵与其横向紧贴并列,则本方的兵可以立即斜进,把对方的兵吃掉,并视为一步棋。 核心节点 搜索算法 deepSearch(depth, chessBoard, AIRound, parentIndex) depth 代表搜索的深度,每次递归 -1。 chessBoard 是搜索算法需要用到的棋盘数组。 AIRound 用来判断此轮搜索是否为 AI 走棋,若为AI走棋则遍...
五子棋
快速阅读 记录上学时做过的一个五子棋软件。 功能概述 可以选择玩家对战 / 人机对战的五子棋游戏。 按键控制 按键 0 1 2 3 4 5 6 7 8 9 a b c d e:控制行列线坐标 -> 开启对应线条闪动 Player1 控制时线条高亮色为红色,Player2 / AI 控制时高亮色为青色。 按键 - 清除列线闪动(列线已激活时) 清除行线闪动(列线已锁定、行线已激活时) 解锁列线 -> 开启列线闪动(列线已锁定、行线未激活时) 按键 + 锁定列线 -> 修改列线为高亮(列线已激活时) 生成棋子 -> 解锁列线 -> 取消列线高亮 -> 清除行线闪动 -> 锁定 Player1 按键 -> 解锁 Player2 按键或 AI 控制(列线已锁定、行线已激活时) 系统控制 T:显示 / 隐藏控制面板 R:切换模式(进程未结束时)/ 重置棋盘(进程已结束,棋盘已满或任意一方胜利时) Player2 对应的控制按键为:小键盘 0 1 2 3 4 5 6 7 8 9 . ↑ ← ↓ → 和 小键盘 + -...
媒体播放器
快速阅读 记录大一暑假做过的一个媒体播放器软件。 功能概述 基于 JavaScript 和 Electron 实现的媒体播放器,用于播放视频和音频,可以修改播放速度、显示歌词、修改轮播逻辑、切换主题、缩放页面。 界面划分 上栏:包括白天/夜间模式切换、时间显示、媒体搜索框、消息提醒。 侧栏:包括主页、电影页、MV 页、音频页、自定义页、资源库 ABC。 主栏:显示选中的页面内容。 下栏:包括控制区、进度条、功能区。 按键控制 W A S:显示 / 隐藏上、侧、下栏 D:进入 / 退出主栏全屏 ← →:播放回退 / 播放快进 ↑ ↓:切换到上一个页面 / 下一个页面 F:进入 / 退出画中画 G:进入 / 退出视频全屏 Q:进入 / 退出缩放屏状态 R:打开 / 关闭主题窗口 T:打开 / 关闭模式窗口 V:打开 / 关闭词条窗口 B:打开 / 关闭视频窗口 1 2 3 4 5 6 7 8:切换到第 1 / 2 / 3 / 4 / 5 / 6 / 7 / 8 个页面 核心节点 轮播图:保存元素序列到数组,所有的元素横向排列,通过设定整体偏移距离实现轮播图效果。 缩略图:设...
音频播放器
快速阅读 记录大一寒假做过的一个音频播放器软件。 功能概述 基于 C语言 和 EasyX图形库 实现的音频播放器,完成了音频控制、轮播、搜索、收藏等功能。 界面划分 上栏:包括时间显示和搜索框。 侧栏:包括主页、最近播放序列、最近更新序列、音频库 ABCD。 主栏:显示选定的页面内容。 下栏:包括控制区、进度条、轮播设置。 核心节点 这是用绘图代码制作的应用程序,所有的视觉元素和视觉效果都是通过在给定坐标处重复绘制基本几何体实现的,由于绘图代码没有控件,时间轴、拖动条和所有的悬停点击交互效果都需要单独设计对应的绘图逻辑。 这种程序的优点是自由度高,可以严格实现自己的想要的效果,缺点是代码量大,很难实现平滑的过渡动画。 运行效果 实现过程 2021 年 1 月 27 日 一个基于图形库的音频播放器,看看多久可以做完… [{"url":"/img/captures/audio-player/ch2-01.jpg...
排序算法
冒泡排序 冒泡排序(Bubble Sort)是一种 交换类 的基础排序算法,重复遍历待排序数组,依次 比较相邻两个元素,若顺序错误则交换二者,每一轮遍历都会将当前 未排序部分 中最大(或最小)的元素 “冒泡” 到末尾。 交换类排序算法通过 比较并交换元素位置 来实现排序,主要操作是相邻或远距离的元素互换。 典型算法 冒泡排序:相邻元素两两比较,大值逐轮"冒泡"到末尾。 快速排序:选定基准值,通过交换将序列分为左右两部分,递归处理。 核心思想 冒泡排序的核心思想是 相邻元素两两比较,通过不断交换将最值逐位后移。 每一轮从前往后遍历,比较每一对相邻元素,若前者大于后者则交换。这个过程中,较大的元素就像气泡一样,一步步 “冒泡” 到当前未排序区间的末尾。 每完成一轮,末尾就多一个已排好的最大值,下一轮比较范围缩短一位,若某轮无交换则提前结束。 实现过程 以升序排序为例: 进行一轮循环,每次循环都找到 未排序部分 的最大元素并交换到末尾,只需要查找 n-1 次就能完成排序(最后一个元素不需要排序)。 123for (let i = 0; i < n - 1...
异步编程
异步编程体系 JS 是 单线程 + 事件循环,所有耗时操作丢给浏览器 / Node 底层多线程处理,完成后把回调推入 任务队列,主线程同步代码执行完再取队列执行。所有异步方案,全部基于 回调函数入队执行 这套底层机制搭建。 回调函数模式 回调函数模式是 JS 异步编程 最原始、最通用 的实现方式,所有更高层的异步方案本质都是 对回调的封装。 核心逻辑 异步操作执行完成后,调用预先传入的回调函数来传递结果,通常遵循 错误优先 的约定(Node.js 生态的统一规范)。 错误优先:第一个参数永远是 错误对象,成功时 error 为 null,后续为结果。 错误优先回调成功 / 失败双回调123456789// Node 文件读取 APIfs.readFile("./a.txt", function (err, data) { if (err) { // 单独处理当前层错误 console.error(err); return; } console.log(data.toString());});1...
遍历
数组遍历 全量遍历 forEach 遍历数组,对每一项执行回调函数,无返回值,除非抛出错误否则 无法中断遍历。 arr.forEach(callback(currentValue, index, array), thisArg) 参数列表 参数 说明 currentValue 当前遍历的元素 index 当前元素索引(可选) array 调用方法的原数组(可选) thisArg 指定回调内的this指向(可选) 调用示例 1234567891011121314151617const fruits = ["苹果", "香蕉", "橙子"];const context = { prefix: "我喜欢的水果:", printFruit: function (name) { console.log(this.prefix + name); },};fruits.forEach(function (currentValue, ...
垃圾回收
内存泄露 程序在运行过程中,已经不再需要使用的内存,没有被操作系统或垃圾回收机制正确释放,导致 可用内存持续减少 的现象即 内存泄露。 内存泄露的场景 1. 意外的全局变量 12345678910function leak() { // 没有 var/let/const,直接赋值 leakedVar = "这个变量挂在了 window 上"; // 在非严格模式下,函数内部的 this 指向 window this.anotherLeak = "我也是全局的";}leak();// leakedVar 和 window.anotherLeak 永远无法回收,直到页面刷新 使用 use strict 严格模式,它会禁止自动创建全局变量。 隐式全局变量:在非严格模式下,直接给一个未声明的变量赋值,JS 不会报错,会自动把这个变量挂载到全局对象上,变成一个全局变量。 2. 被遗忘的定时器、事件监听器 12345678910const btn = document.querySelector("#btn&qu...









