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

python 五子棋小游戏

1. 实现效果

Python五子棋小游戏


2. 游戏规则

规则说明,五子棋人机对战游戏规则如下:‌

Ⅰ 默认规则 - 五子棋规则

  • 对局双方‌:各执一色棋子,一方持黑色棋子,另一方持白色棋子。
  • 棋盘与开局‌:空棋盘开局,黑先、白后,交替下子,每次只能下一子。
  • 棋子落点‌:棋子下在棋盘的空白点上,下定后不得向其它点移动,也不得从棋盘上拿掉或拿起另落别处。
  • 黑方首子‌:黑方的第一枚棋子可下在棋盘任意交叉点上。
  • 轮流下子‌:轮流下子是双方的权利。

Ⅱ 设定规则

  • 双方(用户与程序)分别使用黑白两色的棋子,设定为玩家执黑,先下第一颗,程序执白。
  • 棋盘设为常规的15道盘,即15×15的方格。
  • 下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。

Ⅲ 其他规则

  • 高亮规则:动态高亮显示最新落子,便于观察程序上一步落在何处。
  • 防守机制:检查对方是否可以形成三子或四子
  • 获胜后不要退出窗口,而是停留,不然不知道怎么输的😂
  • 细节:1. 棋盘格外围边框加粗且为深色,棋盘格框线变细,高亮框线变细 2.一旦有一方赢就无法再落子了(主要是白子会在黑子赢了之后还落子) 3. 判平局 4. 棋子下在格线交叉点,而非格内。

3. 环境配置

程序中会用到的库:

import sys
import random
import pygame

其中sys库和random是python的内置库,不需要安装,pygame是三方库,需要安装。
先安装 pygame,如果还没有安装,可以使用以下命令:

pip install pygame

4. 代码实现

变量说明

# 常量定义
BOARD_SIZE = 15 					# 棋盘是15×15
CELL_SIZE = 40 						# 每个棋格的大小
WIDTH = BOARD_SIZE * CELL_SIZE		# 棋盘的大小 宽 = 15×40
HEIGHT = BOARD_SIZE * CELL_SIZE 	# 棋盘高度
BACKGROUND_COLOR = (250, 224, 161)  # 棋盘的背景色
GRID_COLOR = (0, 0, 0)				# 棋盘格线 调成(200, 200, 200)会很好看
HIGHLIGHT_COLOR = (255, 182, 193) 	# 高亮颜色, 粉色
BORDER_COLOR = (139, 69, 19)  		# 棋盘外围边框颜色# 棋盘状态
EMPTY = 0 # 未落子
BLACK = 1 # 落黑子
WHITE = 2 # 落白子

棋盘绘制

画棋盘、棋格、棋子、高亮框框、高亮圈圈

def draw_board(screen, board, last_move):screen.fill(BACKGROUND_COLOR)for x in range(BOARD_SIZE):for y in range(BOARD_SIZE):rect = pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)pygame.draw.rect(screen, GRID_COLOR, rect, 1)if board[x][y] == BLACK:pygame.draw.circle(screen, (0, 0, 0), rect.center, CELL_SIZE // 2 - 5)elif board[x][y] == WHITE:pygame.draw.circle(screen, (255, 255, 255), rect.center, CELL_SIZE // 2 - 5)if last_move:# row, col = latest_move# 方形高亮 棋格highlight_rect = pygame.Rect(last_move[0] * CELL_SIZE, last_move[1] * CELL_SIZE, CELL_SIZE, CELL_SIZE)pygame.draw.rect(screen, HIGHLIGHT_COLOR, highlight_rect, 2)# 圆形高亮 棋子highlight_center = (last_move[0] * CELL_SIZE + CELL_SIZE // 2, last_move[1] * CELL_SIZE + CELL_SIZE // 2)highlight_radius = CELL_SIZE // 2 - 5  # 与棋子相同的半径pygame.draw.circle(screen, HIGHLIGHT_COLOR, highlight_center, highlight_radius+1.5, 2)  # 用圆形高亮, 1.5是为了补偿高亮,高亮是2pygame.draw.rect(screen, BORDER_COLOR, (0, 0, CELL_SIZE * BOARD_SIZE, CELL_SIZE * BOARD_SIZE), 5)# 绘制边框

判断赢家

在任意方达到五子的时候,判断赢了

def check_winner(board, player):for x in range(BOARD_SIZE):for y in range(BOARD_SIZE):if board[x][y] == player:# 检查水平方向if x + 4 < BOARD_SIZE and all(board[x + i][y] == player for i in range(5)):return True# 检查垂直方向if y + 4 < BOARD_SIZE and all(board[x][y + i] == player for i in range(5)):return True# 检查斜向(左上到右下)if x + 4 < BOARD_SIZE and y + 4 < BOARD_SIZE and all(board[x + i][y + i] == player for i in range(5)):return True# 检查斜向(右上到左下)if x - 4 >= 0 and y + 4 < BOARD_SIZE and all(board[x - i][y + i] == player for i in range(5)):return Truereturn False

程序落子(随机)

一开始纯随机,棋子分布散乱,很容易白子就输了,没有难度和趣味性。后来程序才加策略,提高白子获胜率。

def get_random_move(board):empty_cells = [(x, y) for x in range(BOARD_SIZE) for y in range(BOARD_SIZE) if board[x][y] == EMPTY]return random.choice(empty_cells) if empty_cells else None

防御机制

程序检测玩家连续棋子的数量是否对自身存在威胁性。

def check_threats(board, player):three_in_a_row_positions = []for x in range(BOARD_SIZE):for y in range(BOARD_SIZE):if board[x][y] == EMPTY:board[x][y] = player  # 模拟落子if check_winner(board, player):board[x][y] = EMPTYreturn [(x, y)]  # 直接获胜# 检测是否出现三子的情况if count_consecutive(board, x, y, player) == 3:three_in_a_row_positions.append((x, y))board[x][y] = EMPTYreturn three_in_a_row_positionsdef get_defensive_move(board):# 检查对方是否可以形成三子或四子for position in check_threats(board, BLACK):return position  # 返回防守位置return Nonedef count_consecutive(board, x, y, player):# 检查周围的棋子数量count = 0for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1), (-1, -1), (1, 1), (-1, 1), (1, -1)]:temp_count = 0for step in range(1, 5):  # 只检测四个方向nx, ny = x + dx * step, y + dy * stepif 0 <= nx < BOARD_SIZE and 0 <= ny < BOARD_SIZE and board[nx][ny] == player:temp_count += 1else:breakcount += temp_countreturn count

追踪策略

为了便于堵截玩家,提高难度。

def get_preferred_move(board):preferred_moves = []for x in range(BOARD_SIZE):for y in range(BOARD_SIZE):if board[x][y] == EMPTY:# 优先选择靠近黑子的位置for dx in [-1, 0, 1]:for dy in [-1, 0, 1]:nx, ny = x + dx, y + dyif 0 <= nx < BOARD_SIZE and 0 <= ny < BOARD_SIZE and board[nx][ny] == BLACK:preferred_moves.append((x, y))breakreturn random.choice(preferred_moves) if preferred_moves else get_random_move(board)

主函数

def main():pygame.init()screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("五子棋")game_over = False  # 游戏是否结束board = [[EMPTY for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]last_move = Nonewhile True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if game_over:continue  # 如果游戏结束,不处理任何落子# 检查是否平局if all(board[x][y] != EMPTY for x in range(BOARD_SIZE) for y in range(BOARD_SIZE)):game_over = Trueprint("游戏平局!")if event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posx //= CELL_SIZEy //= CELL_SIZEif 0 <= x < BOARD_SIZE and 0 <= y < BOARD_SIZE and board[x][y] == EMPTY:board[x][y] = BLACKlast_move = (x, y)if check_winner(board, BLACK):game_over = Trueprint("黑方获胜!")#pygame.quit()#sys.exit()# 白方落子if not game_over and not (all(board[x][y] != EMPTY for x in range(BOARD_SIZE) for y in range(BOARD_SIZE))):move = get_defensive_move(board)if move is None:  # 若没有可防守的位置,落子move = get_preferred_move(board)board[move[0]][move[1]] = WHITElast_move = moveif check_winner(board, WHITE):game_over = Trueprint("白方获胜!")# pygame.quit()# sys.exit()draw_board(screen, board, last_move)pygame.display.flip()pygame.quit()

完整代码

import pygame
import sys
import random# 常量定义
BOARD_SIZE = 15
CELL_SIZE = 40
WIDTH = BOARD_SIZE * CELL_SIZE
HEIGHT = BOARD_SIZE * CELL_SIZE
BACKGROUND_COLOR = (250, 224, 161)
GRID_COLOR = (245, 245, 220) #GRID_COLOR = (0, 0, 0)
FADED_GRID_COLOR = (200, 200, 200)  #  使用一个更亮的颜色来模仿淡化效果 淡化的格线颜色 (220, 220, 220)
HIGHLIGHT_COLOR = (255, 182, 193) # 粉色高亮颜色
BORDER_COLOR = (139, 69, 19)  # 边框颜色
# 棋盘状态
EMPTY = 0
BLACK = 1
WHITE = 2def draw_board(screen, board, last_move):screen.fill(BACKGROUND_COLOR)for x in range(BOARD_SIZE):for y in range(BOARD_SIZE):rect = pygame.Rect(x * CELL_SIZE, y * CELL_SIZE, CELL_SIZE, CELL_SIZE)pygame.draw.rect(screen, GRID_COLOR, rect, 1)# 在每个格子内绘制2份纵横线for i in range(1, 2):# 横线pygame.draw.line(screen, FADED_GRID_COLOR, (x * CELL_SIZE, y * CELL_SIZE + i * (CELL_SIZE // 2)),(x * CELL_SIZE + CELL_SIZE, y * CELL_SIZE + i * (CELL_SIZE // 2)), 1)# 竖线pygame.draw.line(screen, FADED_GRID_COLOR, (x * CELL_SIZE + i * (CELL_SIZE // 2), y * CELL_SIZE),(x * CELL_SIZE + i * (CELL_SIZE // 2), y * CELL_SIZE + CELL_SIZE), 1)# 绘制交叉点pygame.draw.circle(screen, (0, 0, 0), (x * CELL_SIZE + CELL_SIZE - CELL_SIZE/2, y * CELL_SIZE + CELL_SIZE - CELL_SIZE/2), 2)  # 使用半径为2的圆点if board[x][y] == BLACK:pygame.draw.circle(screen, (0, 0, 0), rect.center, CELL_SIZE // 2 - 5)elif board[x][y] == WHITE:pygame.draw.circle(screen, (255, 255, 255), rect.center, CELL_SIZE // 2 - 5)if last_move:# row, col = latest_move# 方形高亮 棋格highlight_rect = pygame.Rect(last_move[0] * CELL_SIZE, last_move[1] * CELL_SIZE, CELL_SIZE, CELL_SIZE)pygame.draw.rect(screen, HIGHLIGHT_COLOR, highlight_rect, 2)# 圆形高亮 棋子highlight_center = (last_move[0] * CELL_SIZE + CELL_SIZE // 2, last_move[1] * CELL_SIZE + CELL_SIZE // 2)highlight_radius = CELL_SIZE // 2 - 5  # 与棋子相同的半径pygame.draw.circle(screen, HIGHLIGHT_COLOR, highlight_center, highlight_radius+1.5, 2)  # 用圆形高亮, 1.5是为了补偿高亮,高亮是2pygame.draw.rect(screen, BORDER_COLOR, (0, 0, CELL_SIZE * BOARD_SIZE, CELL_SIZE * BOARD_SIZE), 5)# 绘制边框def check_winner(board, player):for x in range(BOARD_SIZE):for y in range(BOARD_SIZE):if board[x][y] == player:# 检查水平方向if x + 4 < BOARD_SIZE and all(board[x + i][y] == player for i in range(5)):return True# 检查垂直方向if y + 4 < BOARD_SIZE and all(board[x][y + i] == player for i in range(5)):return True# 检查斜向(左上到右下)if x + 4 < BOARD_SIZE and y + 4 < BOARD_SIZE and all(board[x + i][y + i] == player for i in range(5)):return True# 检查斜向(右上到左下)if x - 4 >= 0 and y + 4 < BOARD_SIZE and all(board[x - i][y + i] == player for i in range(5)):return Truereturn Falsedef check_threats(board, player):three_in_a_row_positions = []for x in range(BOARD_SIZE):for y in range(BOARD_SIZE):if board[x][y] == EMPTY:board[x][y] = player  # 模拟落子if check_winner(board, player):board[x][y] = EMPTYreturn [(x, y)]  # 直接获胜# 检测是否出现三子的情况if count_consecutive(board, x, y, player) == 3:three_in_a_row_positions.append((x, y))board[x][y] = EMPTYreturn three_in_a_row_positionsdef count_consecutive(board, x, y, player):# 检查周围的棋子数量count = 0for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1), (-1, -1), (1, 1), (-1, 1), (1, -1)]:temp_count = 0for step in range(1, 5):  # 只检测四个方向nx, ny = x + dx * step, y + dy * stepif 0 <= nx < BOARD_SIZE and 0 <= ny < BOARD_SIZE and board[nx][ny] == player:temp_count += 1else:breakcount += temp_countreturn countdef get_defensive_move(board):# 检查对方是否可以形成三子或四子for position in check_threats(board, BLACK):return position  # 返回防守位置return Nonedef get_random_move(board):empty_cells = [(x, y) for x in range(BOARD_SIZE) for y in range(BOARD_SIZE) if board[x][y] == EMPTY]return random.choice(empty_cells) if empty_cells else Nonedef get_preferred_move(board):preferred_moves = []for x in range(BOARD_SIZE):for y in range(BOARD_SIZE):if board[x][y] == EMPTY:# 优先选择靠近黑子的位置for dx in [-1, 0, 1]:for dy in [-1, 0, 1]:nx, ny = x + dx, y + dyif 0 <= nx < BOARD_SIZE and 0 <= ny < BOARD_SIZE and board[nx][ny] == BLACK:preferred_moves.append((x, y))breakreturn random.choice(preferred_moves) if preferred_moves else get_random_move(board)def main():pygame.init()screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("五子棋")game_over = False  # 游戏是否结束board = [[EMPTY for _ in range(BOARD_SIZE)] for _ in range(BOARD_SIZE)]last_move = Nonewhile True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()if game_over:continue  # 如果游戏结束,不处理任何落子# 检查是否平局if all(board[x][y] != EMPTY for x in range(BOARD_SIZE) for y in range(BOARD_SIZE)):game_over = Trueprint("游戏平局!")if event.type == pygame.MOUSEBUTTONDOWN:x, y = event.posx //= CELL_SIZEy //= CELL_SIZEif 0 <= x < BOARD_SIZE and 0 <= y < BOARD_SIZE and board[x][y] == EMPTY:board[x][y] = BLACKlast_move = (x, y)if check_winner(board, BLACK):game_over = Trueprint("黑方获胜!")#pygame.quit()#sys.exit()# 白方落子if not game_over and not (all(board[x][y] != EMPTY for x in range(BOARD_SIZE) for y in range(BOARD_SIZE))):move = get_defensive_move(board)if move is None:  # 若没有可防守的位置,落子move = get_preferred_move(board)board[move[0]][move[1]] = WHITElast_move = moveif check_winner(board, WHITE):game_over = Trueprint("白方获胜!")# pygame.quit()# sys.exit()draw_board(screen, board, last_move)pygame.display.flip()pygame.quit()
if __name__ == "__main__":main()

相关文章:

python 五子棋小游戏

1. 实现效果 Python五子棋小游戏 2. 游戏规则 规则说明&#xff0c;五子棋人机对战游戏规则如下&#xff1a;‌ Ⅰ 默认规则 - 五子棋规则 对局双方‌&#xff1a;各执一色棋子&#xff0c;一方持黑色棋子&#xff0c;另一方持白色棋子。棋盘与开局‌&#xff1a;空棋盘开局…...

JeecgBoot集成工作流实战教程

Activiti是一个轻量级的工作流程和业务流程管理&#xff08;BPM&#xff09;平台&#xff0c;它主要面向业务人员、开发人员和系统管理员。这个平台的核心是一个快速且可靠的Java BPMN 2流程引擎。Activiti是开源的&#xff0c;并且基于Apache许可证进行分发。它可以运行在任何…...

第三十章 章节练习商品列表组件封装

目录 一、需求说明 二、技术要点 三、完整代码 3.1. main.js 3.2. App.vue 3.3. MyTable.vue 3.4. MyTag.vue 一、需求说明 1. my-tag 标签组件封装 (1) 双击显示输入框&#xff0c;输入框获取焦点 (2) 失去焦点&#xff0c;隐藏输入框 (3) 回显标签信息 (4) 内…...

NumPy 高级索引

NumPy 高级索引 NumPy 是 Python 中用于科学计算的核心库之一,它提供了一个强大的N维数组对象和许多用于操作这些数组的函数。在 NumPy 中,除了基本的索引和切片操作外,还提供了高级索引功能,这使得您可以以更加灵活和高效的方式访问和操作数组中的数据。本文将详细介绍 N…...

C/C++常用编译工具链:GCC,Clang

目录 GNU Compiler Collection GCC的优势 编译产生的中间文件 Clang Clang的特点 什么是LLVM&#xff1f; Clang编译过程中产生的中间表示文件 关于Clang的调试 C 编译工具链中有几个主要的编译工具&#xff0c;包括&#xff1a; GNU Compiler Collection (GCC…...

let和war的区别

let和war的区别 看不懂图片&#xff0c;可以看视频教程...

[CUDA] stream使用笔记

文章目录 1. stream一般用法2. stream与event&#xff1a;3. stream异常的排查4. stream的异步与同步行为 1. stream一般用法 cudaStream_t stream_; cudaStreamCreate(&stream_); // create stream // some operators running on this stream_ cudaStreamSynchronize(str…...

第二课:开发工具

在本课中&#xff0c;我们将介绍一些常用的C开发工具&#xff0c;并附上下载链接&#xff0c;帮助你选择合适的工具进行开发。 1. DEVC DEVC 是一个轻量级的C开发工具&#xff0c;适合初学者使用。它提供了基本的代码编辑、编译和调试功能。 下载链接: DEVC 下载 2. Visual…...

Vue 学习随笔系列十三 -- ElementUI 表格合并单元格

ElementUI 表格合并单元格 文章目录 ElementUI 表格合并单元格[TOC](文章目录)一、表头合并二、单元格合并1、示例代码2、示例效果 一、表头合并 参考&#xff1a; https://www.jianshu.com/p/2befeb356a31 二、单元格合并 1、示例代码 <template><div><el-…...

对于一个含有直流和交流分量的信号,如何使用示波器正确显示并测出直流电压值和交流电压峰峰值?

对于一个含有直流&#xff08;DC&#xff09;和交流&#xff08;AC&#xff09;分量的混合信号&#xff0c;使用示波器来正确显示和测量其直流电压值和交流电压峰峰值需要选择适当的设置和方法。以下是详细的步骤&#xff1a; 所需设备 示波器电压探头 步骤一&#xff1a;连…...

移动混合开发面试题及参考答案

目录 什么是混合开发(Hybrid App)? 混合开发(Hybrid App)与原生开发相比有什么优缺点? 优点 缺点 混合开发(Hybrid App)的兴起原因是什么? 市场竞争和成本控制需求 技术发展和资源整合 人才资源的考量 Web App、Native App 和混合开发(Hybrid App)的区别是…...

命令行工具开发秘籍:从零开始创建实用Python脚本(如何创建Python命令行工具)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 创建命令行工具的基础🔖 在非模块化的环境中🔖 在模块化环境中📝 打包和安装模块📝 使用命令行工具⚓️ 相关链接 ⚓️📖 介绍 📖 如何将自己的Python模块打包成一个可在命令行中直接执行的工具?…...

Python - PDF 分割成单页、PDF 转图片(PNG)

文章目录 PDF 分割成一页页的 PDFPDF 转 PNGPDF 分割成一页页的 PDF import fitz def split_pdf(pdf_path, save_dir):source_pdf = fitz.open(pdf_path)# 遍历source_pdf中的每一页,page_number从0开始计数 for idx...

【网络】套接字编程——TCP通信

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;TCP网络服务器简单模拟实现。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;…...

PyTorch实践-CNN-验证码识别

1 需求 GitHub - xhh890921/cnn-captcha-pytorch: 小黑黑讲AI&#xff0c;AI实战项目《验证码识别》 2 接口 含义 在optim.Adam接口中&#xff0c;lr参数代表学习率&#xff08;Learning Rate&#xff09;。学习率是优化算法中的一个关键超参数&#xff0c;它决定了在每次迭代…...

json和pb的比较

1.介绍 在数据序列化和通信领域&#xff0c;schema 指的是用于定义数据结构的模式或结构描述。它描述了数据的字段、类型、嵌套结构和约束&#xff0c;并在数据验证和解释上发挥重要作用。常见的 schema 格式包括 Protocol Buffers (proto)、JSON Schema、XML Schema 等。 Pr…...

Redis-基本了解

一、Redis 初识 Redis 是⼀种基于键值对&#xff08;key-value&#xff09;的NoSQL数据库&#xff0c;与很多键值对数据库不同的是&#xff0c;Redis 中的值可以是由string&#xff08;字符串&#xff09;、hash&#xff08;哈希&#xff09;、list&#xff08;列表&#xff09…...

HarmonyOS第一课 06 构建更加丰富的页面-习题解析

判断题 1. Tabs组件可以通过接口传入一个TabsController&#xff0c;该TabsController可以控制Tabs组件进行页签切换。T 正确(True) 错误(False) 使用 this.tabsController.changeIndex(this.currentIndex); 可以切换页签 WebviewController提供了变更Web组件显示内容的接口…...

计算机的错误计算(一百四十三)

摘要 探讨 MATLAB 中 附近数的余弦函数的计算精度问题。 例1. 已知 计算 与 直接贴图吧&#xff1a; 另外&#xff0c;16位的正确值分别为 -0.3012758451921695e-7 与 -0.3765996542384011e-10&#xff08;ISRealsoft 提供&#xff09;。 容易看出&#xff0c;MATLAB的输…...

大数据之——Window电脑本地配置hadoop系统(100%包避坑!!方便日常测试,不用再去虚拟机那么麻烦)

之前我们的hadoop不管是伪分布式还是分布式&#xff0c;都是配置在虚拟机上&#xff0c;我们有的时候想要运行一些mapreduce、hdfs的操作&#xff0c;又要把文件移到虚拟机&#xff0c;又要上传hdfs&#xff0c;麻烦得要死&#xff0c;那么有的时候我们写的一些java、python的h…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

【JVM】- 内存结构

引言 JVM&#xff1a;Java Virtual Machine 定义&#xff1a;Java虚拟机&#xff0c;Java二进制字节码的运行环境好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收的功能数组下标越界检查&#xff08;会抛异常&#xff0c;不会覆盖到其他代码…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...