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

HarmonyOS 5.0应用开发——五子棋游戏(鸿蒙版)开发

【高心星出品】

文章目录

      • 五子棋游戏(鸿蒙版)开发
        • 运行效果
        • 开发步骤
          • 项目结构
          • 核心代码
            • 棋盘组件:
            • 游戏逻辑处理:
            • 主页面:

五子棋游戏(鸿蒙版)开发

五子棋是一款传统的两人策略型棋类游戏,游戏的目的是在棋盘上首先形成连续的五个同色棋子的玩家获胜。游戏规则简单,易于上手,但要达到高手水平则需要相当的策略和技巧。

基本规则:

  1. 棋盘 :五子棋通常在15×15的棋盘上进行。
  2. 棋子 :棋子分为黑白两色,双方各执一色。
  3. 开局 :黑方先行,之后轮流下子。
  4. 胜局 :第一个在棋盘上形成一个连续的五个同色棋子连线的玩家获胜。

特殊规则:

  • 禁手规则 :在某些比赛规则中,黑方的第一步棋如果落在了棋盘的中心点,或者形成了特定的危险形态,可能会被判定为“禁手”,此时黑方需要接受惩罚,通常是白方可以提出和棋。
  • 三连和四连 :在下棋过程中,形成三个或四个连续的棋子通常会获得优势,但需要防范对手利用这些情况形成更长的连子。

五子棋因其规则简单而深受各个年龄层的玩家喜爱,同时也因为其策略性而吸引了一批忠实的棋艺爱好者。希望这些信息能帮助您更好地了解五子棋游戏。

运行效果

在这里插入图片描述

开发步骤
项目结构

在这里插入图片描述

核心代码
棋盘组件:
import { GameState } from '../model/GameState'
import { display } from '@kit.ArkUI'@Preview
@Component
export struct GameBoard {@Link private gameState: GameState@State private boardSize: number = 0@State private cellSize: number = 0@State private boardPadding: number = 10@State private showGameOverDialog: boolean = false@State private winnerText: string = ''// 五子棋盘 大小,默认全屏zwidth:number=0private settings:RenderingContextSettings=new RenderingContextSettings(true)private canvascontext:CanvasRenderingContext2D=new CanvasRenderingContext2D(this.settings)aboutToAppear(): void {this.calculateBoardSize()}/*** 计算棋盘大小*/private calculateBoardSize() {console.log('gxxt 计算')// 获取屏幕宽度const screenWidth =this.zwidth==0? px2vp(display.getDefaultDisplaySync().width):this.zwidth// 计算棋盘大小,留出边距this.boardSize = screenWidth - 2 * this.boardPadding// 计算每个格子的大小this.cellSize = this.boardSize / (this.gameState.getBoardSize() - 1)}/*** 处理点击事件* @param event 点击事件*/private handleClick(event: ClickEvent) {if (this.gameState.isGameOver()) {return}// 计算点击位置对应的棋盘坐标const x = event.xconst y = event.y// 计算行列const col = Math.round(x / this.cellSize)const row = Math.round(y / this.cellSize)// 尝试落子if (this.gameState.makeMove(row, col)) {// 检查游戏是否结束if (this.gameState.isGameOver()) {this.winnerText = this.gameState.getWinner() === 1 ? '黑子胜利!' : '白子胜利!'this.showGameOverDialog = true}}}/*** 重新开始游戏*/private restartGame() {this.gameState.restart()this.showGameOverDialog = false}build() {Stack() {// 棋盘背景Rect().width(this.boardSize + 2 * this.boardPadding).height(this.boardSize + 2 * this.boardPadding).fill('#DEB887') // 木色背景.radius(8)// 棋盘网格Canvas(this.canvascontext).width(this.boardSize + 2 * this.boardPadding).height(this.boardSize + 2 * this.boardPadding).onReady(()=>{this.onDrawGrid(this.canvascontext)}).onClick(this.handleClick.bind(this))// 绘制棋子ForEach(this.gameState.getBoard(), (row:number[], rowIndex) => {ForEach(row, (cell:number, colIndex) => {if (cell !== 0) {Circle().fill(cell === 1 ? '#000000' : '#FFFFFF').stroke(cell === 1 ? '#000000' : '#CCCCCC').strokeWidth(1).width(this.cellSize * 0.9).height(this.cellSize * 0.9).position({x: this.boardPadding + colIndex * this.cellSize - this.cellSize * 0.45,y: this.boardPadding + rowIndex * this.cellSize - this.cellSize * 0.45})}})})// 游戏结束对话框if (this.showGameOverDialog) {Column() {Text(this.winnerText).fontSize(24).fontWeight(FontWeight.Bold).margin({ bottom: 20 })Button('重新开始').width(120).height(40).backgroundColor('#007DFF').onClick(() => this.restartGame())}.width(260).height(150).backgroundColor('#FFFFFF').borderRadius(8).justifyContent(FlexAlign.Center).position({x: (this.boardSize + 2 * this.boardPadding) / 2 - 130,y: (this.boardSize + 2 * this.boardPadding) / 2 - 75})}}.width(this.boardSize + 2 * this.boardPadding).height(this.boardSize + 2 * this.boardPadding)}/*** 绘制棋盘网格* @param ctx Canvas上下文*/private onDrawGrid(ctx: CanvasRenderingContext2D) {const size = this.gameState.getBoardSize()// 设置线条样式ctx.strokeStyle = '#000000'ctx.lineWidth = 1// 绘制横线for (let i = 0; i < size; i++) {const y = this.boardPadding + i * this.cellSizectx.beginPath()ctx.moveTo(this.boardPadding,y)console.log('gxxt start ',this.boardPadding,'  ',y)ctx.lineTo(this.boardPadding + (size - 1) * this.cellSize, y)console.log('gxxt end ',this.boardPadding + (size - 1) * this.cellSize,'  ',y)ctx.closePath()ctx.stroke()}// 绘制竖线for (let i = 0; i < size; i++) {const x = this.boardPadding + i * this.cellSizectx.beginPath()ctx.moveTo(x, this.boardPadding)ctx.lineTo(x, this.boardPadding + (size - 1) * this.cellSize)ctx.closePath()ctx.stroke()}// 绘制天元和星位const starPoints = [3, 7, 11]ctx.fillStyle = '#000000'for (const i of starPoints) {for (const j of starPoints) {const x = this.boardPadding + i * this.cellSizeconst y = this.boardPadding + j * this.cellSizectx.beginPath()ctx.arc(x, y, 3, 0, Math.PI * 2)ctx.closePath()ctx.fill()}}}
} 

游戏棋盘组件(GameBoard.ets):

  • 木色背景的棋盘

  • 网格线和星位点

  • 黑白棋子的显示

  • 点击落子功能

  • 游戏结束对话框

游戏逻辑处理:
/*** 游戏状态管理类*/
export class GameState {// 棋盘大小private static readonly BOARD_SIZE: number = 15;// 棋盘状态:0表示空,1表示黑子,2表示白子private board: number[][] = [];// 当前玩家:1表示黑子,2表示白子private currentPlayer: number = 1;// 游戏是否结束private gameOver: boolean = false;// 胜利者:0表示未结束,1表示黑子胜,2表示白子胜private winner: number = 0;constructor() {this.initBoard();}/*** 初始化棋盘*/private initBoard(): void {this.board = [];for (let i = 0; i < GameState.BOARD_SIZE; i++) {this.board[i] = [];for (let j = 0; j < GameState.BOARD_SIZE; j++) {this.board[i][j] = 0;}}this.currentPlayer = 1;this.gameOver = false;this.winner = 0;}/*** 获取棋盘大小*/public getBoardSize(): number {return GameState.BOARD_SIZE;}/*** 获取棋盘状态*/public getBoard(): number[][] {return this.board;}/*** 获取当前玩家*/public getCurrentPlayer(): number {return this.currentPlayer;}/*** 获取游戏是否结束*/public isGameOver(): boolean {return this.gameOver;}/*** 获取胜利者*/public getWinner(): number {return this.winner;}/*** 落子* @param row 行坐标* @param col 列坐标* @returns 是否落子成功*/public makeMove(row: number, col: number): boolean {// 检查游戏是否已结束if (this.gameOver) {return false;}// 检查坐标是否有效if (row < 0 || row >= GameState.BOARD_SIZE || col < 0 || col >= GameState.BOARD_SIZE) {return false;}// 检查该位置是否已有棋子if (this.board[row][col] !== 0) {return false;}// 落子this.board[row][col] = this.currentPlayer;// 检查是否获胜if (this.checkWin(row, col)) {this.gameOver = true;this.winner = this.currentPlayer;this.currentPlayer = this.currentPlayer === 1 ? 2 : 1;return true;}// 切换玩家this.currentPlayer = this.currentPlayer === 1 ? 2 : 1;return true;}/*** 检查是否获胜* @param row 最后落子的行坐标* @param col 最后落子的列坐标* @returns 是否获胜*/private checkWin(row: number, col: number): boolean {const directions = [[1, 0],   // 水平[0, 1],   // 垂直[1, 1],   // 右下对角线[1, -1]   // 左下对角线];for (const dd of directions) {const dx=dd[0]const dy=dd[1]let count = 1;// 正向检查for (let i = 1; i <= 4; i++) {const newRow = row + i * dx;const newCol = col + i * dy;if (this.isValidPosition(newRow, newCol) && this.board[newRow][newCol] === this.currentPlayer) {count++;} else {break;}}// 反向检查for (let i = 1; i <= 4; i++) {const newRow = row - i * dx;const newCol = col - i * dy;if (this.isValidPosition(newRow, newCol) && this.board[newRow][newCol] === this.currentPlayer) {count++;} else {break;}}if (count >= 5) {return true;}}return false;}/*** 检查坐标是否有效* @param row 行坐标* @param col 列坐标* @returns 是否有效*/private isValidPosition(row: number, col: number): boolean {return row >= 0 && row < GameState.BOARD_SIZE && col >= 0 && col < GameState.BOARD_SIZE;}/*** 重新开始游戏*/public restart(): void {this.initBoard();}
} 

游戏核心逻辑(GameState.ets):

  • 15x15的棋盘

  • 黑白双方轮流落子

  • 胜利判定(横向、纵向、对角线)

  • 游戏状态管理

主页面:
import { GameBoard } from '../components/GameBoard'
import { GameState } from '../model/GameState'@Entry
@Component
struct Index {@State private gameState: GameState = new GameState()build() {Column() {// 标题栏Row() {Text('五子棋').fontSize(28).fontWeight(FontWeight.Bold)Text(`当前玩家: ${this.gameState.getCurrentPlayer()==2?'黑子':'白字'}`).fontSize(16).margin({ left: 20 })}.width('100%').height(60).padding({ left: 20, right: 20 }).backgroundColor('#F5F5F5')// 游戏棋盘Column() {GameBoard({ gameState: this.gameState }).width('100%').margin({ top: 20, bottom: 20 })}.width('100%').height('80%').justifyContent(FlexAlign.Center)}.width('100%').height('100%').backgroundColor('#FFFFFF').justifyContent(FlexAlign.Center)}
} 

主页面(Index.ets):

  • 游戏标题

  • 当前玩家显示

  • 棋盘组件集成

完整项目代码:

https://gitee.com/gxx01/gobang

相关文章:

HarmonyOS 5.0应用开发——五子棋游戏(鸿蒙版)开发

【高心星出品】 文章目录 五子棋游戏&#xff08;鸿蒙版&#xff09;开发运行效果开发步骤项目结构核心代码棋盘组件&#xff1a;游戏逻辑处理&#xff1a;主页面&#xff1a; 五子棋游戏&#xff08;鸿蒙版&#xff09;开发 五子棋是一款传统的两人策略型棋类游戏&#xff0…...

避坑,app 播放器media:MediaElement paly报错

System.Runtime.InteropServices.COMException HResult=0x8001010E Message= Source=WinRT.Runtime StackTrace: 在 WinRT.ExceptionHelpers.<ThrowExceptionForHR>g__Throw|38_0(Int32 hr) 在 ABI.Microsoft.UI.Xaml.Controls.IMediaPlayerElementMethods.get_MediaPlay…...

STM32单片机入门学习——第38节: [11-3] 软件SPI读写W25Q64

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.16 STM32开发板学习——第一节&#xff1a; [1-1]课程简介 前言开发板说明引用解答和…...

使用阿里云创建公司官网(使用wordpress)

安装 LNMP 不通的lnmp版本 https://lnmp.org/download.html wget http://soft.vpser.net/lnmp/lnmp2.1.tar.gz -cO lnmp2.1.tar.gztar zxf lnmp2.1.tar.gz && cd lnmp2.1 && ./install.sh lnmp数据库选5.7 选好数据库&#xff0c;会让你设置数据库 root 用户…...

Python程序结构深度解析:顺序结构与对象布尔值的底层逻辑与应用

一、程序结构的三大基石 在计算机科学领域&#xff0c;任何复杂的算法都可以分解为顺序结构、选择结构和循环结构这三种基本结构的组合。这种结构化编程思想由计算机科学家Bhm和Jacopini在1966年首次提出&#xff0c;至今仍是现代编程语言设计的核心原则。 1.1 顺序结构的本质…...

【系统搭建】Ubuntu系统两节点间SSH免密配置

SSH免密配置是MPI分布式、DPDK通信等集群节点间通信的基础配置 1. 安装SSH服务端&#xff08;所有节点执行&#xff09; Ubuntu 默认只安装 SSH 客户端&#xff08;openssh-client&#xff09;&#xff0c;未安装服务端&#xff08;openssh-server&#xff09;,需要手动安装并…...

美信监控易:揭秘高效数据采集和数据分析双引擎

在当今复杂多变的运维环境中&#xff0c;一款强大的运维管理软件对于保障企业的IT系统稳定运行至关重要。北京美信时代的美信监控易运维管理软件&#xff0c;凭借其卓越的数据分析双引擎&#xff0c;成为了众多运维团队的首选。 首先&#xff0c;美信监控易的数据采集引擎展现出…...

基于STM32+FPGA的地震数据采集器软件设计,支持RK3568+FPGA平台

0 引言 地震观测是地球物理观测的重点&#xff0c;是地震学和 地球物理学发展的基础 [1] 。地震数据采集器主要功 能是将地震计采集的地震波模拟信号转换为数字信 号并进行记录或传输 [2] &#xff0c;为地震学提供大量的基础 数据。本文将介绍基FPGAARM的地震数据采集器软…...

NO.95十六届蓝桥杯备战|图论基础-单源最短路|负环|BF判断负环|SPFA判断负环|邮递员送信|采购特价产品|拉近距离|最短路计数(C++)

P3385 【模板】负环 - 洛谷 如果图中存在负环&#xff0c;那么有可能不存在最短路。 BF算法判断负环 执⾏n轮松弛操作&#xff0c;如果第n轮还存在松弛操作&#xff0c;那么就有负环。 #include <bits/stdc.h> using namespace std;const int N 2e3 10, M 3e3 1…...

Linux 网络管理深度指南:从基础到高阶的网卡、端口与路由实战

一、网卡管理&#xff1a;构建网络连接的基石 1.1 现代网络工具链解析 在当代Linux系统中&#xff0c;iproute2套件已全面取代传统的net-tools&#xff0c;其优势体现在&#xff1a; 推荐组合命令&#xff1a; ip -c addr show | grep "inet " # 彩色显示有效IP…...

《重构全球贸易体系用户指南》解读

文章目录 背景核心矛盾与理论框架美元的“特里芬难题”核心矛盾目标理论框架 政策工具箱的协同运作机制关税体系的精准打击汇率政策的混合干预安全工具的复合运用 实施路径与全球秩序重构阶段性目标 风险传导与反制效应内部失衡加剧外部反制升级系统性风险 范式突破与理论再思考…...

stateflow中的函数

最近开始使用STATEFLOW,感觉功能比较强大,在嵌入式的应用中应该缺少不了,先将用到的仔细总结一下。还有一点,积极拥抱ai,学会使用AI的强大功能来学习。 在 Stateflow 中,不同类型的函数和状态适用于不同的建模需求。以下是 图形函数(Graphical Function)、Simulink 函…...

41.[前端开发-JavaScript高级]Day06-原型关系图-ES6类的使用-ES6转ES5

JavaScript ES6实现继承 1 原型继承关系图 原型继承关系 创建对象的内存表现 2 class方式定义类 认识class定义类 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible&qu…...

Flutter学习四:Flutter开发基础(一)Widget

Widget 简介 0 引言 本文是对 Flutter Widget 相关知识的学习和总结。 1 Widget 概念 1.1 Widget 基础 Widget 字面意思&#xff1a;控件、组件、部件、微件、插件、小工具widget 的功能是"描述一个UI元素的配置信息"&#xff0c;所谓的配置信息就是 Widget 接收…...

Dify智能体平台源码二次开发笔记(6) - 优化知识库pdf文档的识别

目录 前言 新增PdfNewExtractor类 替换ExtractProcessor类 最终结果 前言 dify的1.1.3版本知识库pdf解析实现使用pypdfium2提取文本&#xff0c;主要存在以下问题&#xff1a; 1. 文本提取能力有限&#xff0c;对表格和图片支持不足 2. 缺乏专门的中文处理优化 3. 没有文档结…...

【LaTeX】公式图表进阶操作

公式 解决不认识的符号 查资料&#xff1a;1&#xff09;知道符号样子&#xff1b;2&#xff09;知道符号含义 放大版括号 用来括住存在分式的式子&#xff0c;或者用来括住内部由有很多括号的式子。用法是在左右括号[]分别加上\left和\right \[ J_r\dfrac{i \hbar}{2m} \l…...

第二阶段:数据结构与函数

模块4&#xff1a;常用数据结构 (Organizing Lots of Data) 在前面的模块中&#xff0c;我们学习了如何使用变量来存储单个数据&#xff0c;比如一个数字、一个名字或一个布尔值。但很多时候&#xff0c;我们需要处理一组相关的数据&#xff0c;比如班级里所有学生的名字、一本…...

matlab中simulink的快捷使用方法

连接系统模块还有如下更有效的方式:单击起始模块。 按下 Ctrl键&#xff0c;并单击目标块。 图示为已经连接好的系统模块 旋转模块&#xff1a;选中模块后按图示点击即可...

Redux部分

在src文件夹下 的store文件夹下创建modules/user.js和index.js module/ user.js // 存储用户相关const { createSlice } require("reduxjs/toolkit");const userStore createSlice({name:"user",// 数据状态initialState:{token:},// 同步修改方法red…...

基于STM32F103C8T6的温湿度检测装置

一、系统方案设计 1、系统功能分析 本项目设计的是一款基于STM32F103C8T6的温室大棚检测系统低配版。由 STM32F103C8T6最小系统板&#xff0c;OLED显示屏&#xff0c;DHT11温湿度检测传感器&#xff0c;光敏电阻传感器组成&#xff0c; 可以实现如下功能&#xff1a; 使用D…...

设计模式 - 单例模式

一个类不管创建多少次对象&#xff0c;永远只能得到该类型一个对象的实力 常用到的&#xff0c;比如日志模块&#xff0c;数据库模块 饿汉式单例模式&#xff1a;还没有获取实例对象&#xff0c;实例对象就已经产生了 懒汉式单例模式&#xff1a;唯一的实例对象&#xff0c;…...

Linux驱动开发1 - Platform设备

背景 所有驱动开发都是基于全志T507&#xff08;Android 10&#xff09;进行开发&#xff0c;用于记录驱动开发过程。 简介 什么是platform驱动自己上网搜索了解。 在driver/linux/platform_device.h中定义了platform_driver结构体。 struct platform_driver {int (*probe…...

力扣-hot100(盛最多水的容器)

11. 盛最多水的容器 中等 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xf…...

使用 PyTorch 构建 UNet 图像去噪模型:从数据加载到模型训练的完整流程

图像去噪是计算机视觉中的一个基础问题&#xff0c;在医学图像、遥感、夜间视觉等领域有广泛应用。本文将手把手带你用 PyTorch 构建一个 UNet 架构的图像去噪模型&#xff0c;包括数据预处理、网络搭建、PSNR 评估与模型保存的完整流程。 本项目已支持将数据增强版本保存为独立…...

从信号处理角度理解图像处理的滤波函数

目录 1、预备知识 1.1 什么是LTI系统? 1.1.1 首先来看什么是线性系统,前提我们要了解什么是齐次性和叠加性。...

集合框架--List集合详解

List集合 List 接口直接继承 Collection 接口&#xff0c;它定义为可以存储重复元素的集合&#xff0c;并且元素按照插入顺序有序排列&#xff0c;且可以通过索引访问指定位置的元素。常见的实现有&#xff1a;ArrayList、LinkedList。 Arraylist:有序、可重复、有索引 Linke…...

需求分析---软件架构师武器库中的天眼系统

在软件架构中&#xff0c;需求分析决定了系统的核心设计方向。 然而&#xff0c;现实中的需求往往存在以下问题&#xff1a; 需求被二次加工&#xff1a;产品经理或业务方可能直接提供“解决方案”&#xff08;如“我们需要一个聊天功能”&#xff09;&#xff0c;而非原始需…...

Spring Cloud Gateway 的执行链路详解

Spring Cloud Gateway 的执行链路详解 &#x1f3af; 核心目标 明确 Spring Cloud Gateway 的请求处理全过程&#xff08;从接收到请求 → 到转发 → 到返回响应&#xff09;&#xff0c;方便你在合适的生命周期节点插入你的逻辑。 &#x1f9f1; 核心执行链路图&#xff08;执…...

Python----机器学习(基于PyTorch框架的逻辑回归)

逻辑回归是一种广泛使用的统计学习方法&#xff0c;主要用于处理二分类问题。它基于线性回归模型&#xff0c;通过Sigmoid函数将输出映射到[0, 1]范围内&#xff0c;表示实例属于正类别的概率。尽管逻辑回归适用于二分类任务&#xff0c;但在多分类问题中常使用Softmax函数&…...

工业数据治理范式革新:时序数据库 TDengine虚拟表技术解析

小T导读&#xff1a;在工业数字化过程中&#xff0c;数据如何从设备采集顺利“爬坡”到上层应用&#xff0c;一直是个难题。传统“单列模型”虽贴合设备协议&#xff0c;却让上层分析举步维艰。TDengine 用一种更聪明的方法打通了这条数据通路&#xff1a;不强求建模、不手动转…...

Linux的应用领域,Linux的介绍,VirtualBox和Ubuntu的安装,VMware的安装和打开虚拟机CentOS

目录 Linux的应用领域 Linux的介绍 Linux的介绍 Linux发行版 Unix和Linux的渊源 虚拟机和Linux的安装 VirtualBox和Ubuntu的安装 安装VirtualBox 安装Ubuntu 下载Ubuntu操作系统的镜像文件 创建虚拟机 虚拟机设置 启动虚拟机&#xff0c;安装Ubuntu系统 Ubuntu基…...

使用 Java 8 Stream实现List重复数据判断

import java.util.*; import java.util.stream.Collectors;public class DeduplicateStreamExample {static class ArchiveItem {// 字段定义与Getter/Setter省略&#xff08;需根据实际补充&#xff09;private String mATNR;private String lIFNR;private String suppSpecMod…...

GDAL:地理数据的万能瑞士军刀

目录 1. 什么是GDAL&#xff1f;2. 为什么需要GDAL&#xff1f;3. GDAL的主要功能3.1. 数据转换3.2. 数据裁剪和处理3.3. 读取和写入多种格式 4. 实际应用场景4.1 环境监测4.2 城市规划4.3 导航系统 5. 技术原理简单解释6. 如何使用GDAL&#xff1f;6.1 简单命令示例 7. 学习建…...

每日文献(十三)——Part two

今天从第三章节&#xff1a;“实现细节”开始介绍。 目录 三、实现细节 四、实验 五、总结贡献 六、致谢 三、实现细节 我们在多尺度图像上训练和测试区域建议和目标检测网络。这是在KITTI目标检测基准[13]上基于CNN的目标检测的趋势。例如&#xff0c;在[16]中&#xff…...

ArrayList 和 LinkedList 区别

ArrayList 和 LinkedList 是 Java 集合框架中两种常用的列表实现&#xff0c;它们在底层数据结构、性能特点和适用场景上有显著的区别。以下是它们的详细对比以及 ArrayList 的扩容机制。 1. ArrayList 和 LinkedList 的底层区别 (1) 底层数据结构 ArrayList&#xff1a; 基于…...

【iOS】UITableView性能优化

UITableView性能优化 前言优化从何入手优化的本质 CPU层级优化1. Cell的复用2. 尽量少定义Cell&#xff0c;善于使用hidden控制显示视图3. 提前计算并缓存高度UITableView的代理方法执行顺序Cell高度缓存高度数组 4. 异步绘制5. 滑动时按需加载6. 使用异步加载图片&#xff0c;…...

通过检索增强生成(RAG)和重排序提升大语言模型(LLM)的准确性

探索大语言模型&#xff08;LLM&#xff09;结合有效信息检索机制的优势。实现重排序方法&#xff0c;并将其整合到您自己的LLM流程中。 想象一下&#xff0c;一个大语言模型&#xff08;LLM&#xff09;不仅能提供相关答案&#xff0c;还能根据您的具体需求进行精细筛选、优先…...

IDEA202403常用快捷键【持续更新】

文章目录 一、全局搜索二、美化格式三、替换四、Git提交五、代码移动六、调试运行 在使用IDEA进行程序开发&#xff0c;快捷键会让这个过程更加酸爽&#xff0c;下面记录各种快捷键的功能。 一、全局搜索 快捷键功能说明Shift Shift全局搜索Ctrl N搜索Java类 二、美化格式 …...

硬件元件三极管:从基础到进阶的电子探秘

一、基础理论 1. PN结&#xff08;二极管&#xff09; PN 结是采用不同的掺杂工艺&#xff0c;将 P 型半导体与 N 型半导体紧密接触而形成的一个界面区域。也就是我们常说的二极管。&#xff08;P型带正电、N型带负电&#xff0c;电流由P流向N&#xff09; 形成过程&#xff1…...

4. k8s核心概念 pod deployment service

以下是 Kubernetes 的核心概念详解&#xff0c;涵盖 Pod、Service、Deployment 和 Node&#xff0c;以及它们之间的关系和实际应用场景&#xff1a; 1. Pod 定义与作用 • 最小部署单元&#xff1a;Pod 是 Kubernetes 中可创建和管理的最小计算单元&#xff0c;包含一个或多个…...

12.第二阶段x64游戏实战-远程调试

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 上一个内容&#xff1a;11.第二阶段x64游戏实战-框架代码细节优化 本次写的内容是关于调试、排错相关的…...

自然语言处理的进化:BERT模型深度剖析

自然语言处理&#xff08;NLP&#xff09;领域近年来取得了跨越式的发展&#xff0c;尤其是随着深度学习技术的应用&#xff0c;不少新兴模型应运而生。其中&#xff0c;BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;作为一种革命性的…...

鸿蒙学习笔记(5)-HTTP请求数据

一、Http请求数据 http模块是鸿蒙内置的一个模块&#xff0c;提供了网络请求的能力。不需要再写比较原始的AJAS代码。 ps:在项目中如果要访问网络资源&#xff0c;不管是图片文件还是网络请求&#xff0c;必须给项目开放权限。 &#xff08;1&#xff09;网络连接方式 HTTP数…...

Golang 的 GMP 协程模型详解

Golang 的 GMP 协程模型详解 Golang 的并发模型基于 GMP&#xff08;Goroutine-M-Processor&#xff09; 机制&#xff0c;是其高并发能力的核心支撑。以下从原理、机制、优势、缺点和设计理念展开分析&#xff1a; 一、GMP 的组成与运作原理 Goroutine&#xff08;G&#xff…...

ReportLab 导出 PDF(页面布局)

ReportLab 导出 PDF&#xff08;文档创建&#xff09; ReportLab 导出 PDF&#xff08;页面布局&#xff09; ReportLab 导出 PDF&#xff08;图文表格) PLATYPUS - 页面布局和排版 1. 设计目标2. 开始3. Flowables3.1. Flowable.draw()3.2. Flowable.drawOn(canvas,x,y)3.3. F…...

Ubuntu 安装与配置 Docker

Ubuntu 安装与配置 Docker Docker 是一个开源的容器化平台&#xff0c;允许开发者将应用程序及其依赖项打包在一个轻量级、可移植的容器中。它可以帮助开发者和运维人员快速构建、部署和管理应用程序&#xff0c;提升开发和运维效率。本文将介绍如何在 Ubuntu 系统上安装和配置…...

【数据结构与算法】LeetCode每日一题

此题跟27.移除数组中的指定值 类似&#xff0c;都是移除且双指针玩法&#xff0c;只不过判断条件发生了变化...

【HDFS入门】数据存储原理全解,从分块到复制的完整流程剖析

目录 1 HDFS架构概览 2 文件分块机制 2.1 为什么需要分块&#xff1f; 2.2 块大小配置 3 数据写入流程 4 数据复制机制 4.1 副本放置策略 4.2 复制流程 5 数据读取流程 6 一致性模型 7 容错机制 7.1 数据节点故障处理 7.2 校验和验证 8 总结 在大数据时代&#x…...

力扣热题100——普通数组(不普通)

普通数组但一点不普通&#xff01; 最大子数组和合并区间轮转数组除自身以外数组的乘积缺失的第一个正数 最大子数组和 这道题是非常经典的适用动态规划解决题目&#xff0c;但同时这里给出两种解法 动态规划、分治法 那么动态规划方法大家可以在我的另外一篇博客总结中看到&am…...

Ubuntu中snap

通过Snap可以安装众多的软件包。需要注意的是&#xff0c;snap是一种全新的软件包管理方式&#xff0c;它类似一个容器拥有一个应用程序所有的文件和库&#xff0c;各个应用程序之间完全独立。所以使用snap包的好处就是它解决了应用程序之间的依赖问题&#xff0c;使应用程序之…...