用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!
用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!(结尾附完整代码)
简介
2048 是一个简单而又令人上瘾的数字拼图游戏。玩家通过滑动方块使相同数字的方块合并,目标是创造出数字 2048!在这篇博客中,我们将用 Python 的 Tkinter 库 从零开始实现这款游戏,涵盖从界面设计到逻辑实现的每一个细节,帮助你全面了解背后的开发思路。
游戏特点
- 经典玩法:滑动合并相同数字,尽可能达到 2048。
- 随机生成新数字:每次滑动后随机生成 2 或 4。
- 直观的图形界面:使用 Tkinter 绘制游戏网格与方块,带来清晰的视觉效果。
开发环境准备
在开始之前,确保你的环境已安装 Python,并包含以下必要库:
pip install tk
Tkinter 是 Python 内置的 GUI 工具包,因此大多数环境无需额外安装。
项目实现步骤
我们将按照以下步骤构建游戏:
- 设计网格界面
- 实现核心逻辑
- 绑定键盘事件
- 添加游戏结束检测
- 优化用户体验
1. 设计网格界面
首先,我们定义游戏的基本参数,包括网格大小、方块的尺寸、间距和颜色等。随后,通过 Tkinter 创建一个网格界面,每个格子将用矩形和文本元素表示。
import tkinter as tk
from tkinter import messagebox
import random# 常量定义
GRID_SIZE = 4 # 网格为 4x4
TILE_SIZE = 100 # 每个方块的像素大小
PADDING = 10 # 方块之间的间距
BACKGROUND_COLOR = "#92877d"
TILE_COLORS = {0: "#9e948a", 2: "#eee4da", 4: "#ede0c8",8: "#f2b179", 16: "#f59563", 32: "#f67c5f",64: "#f65e3b", 128: "#edcf72", 256: "#edcc61",512: "#edc850", 1024: "#edc53f", 2048: "#edc22e",
}# 初始化游戏界面
class Game2048:def __init__(self, master):self.master = masterself.master.title("2048")self.master.geometry(f"{GRID_SIZE * TILE_SIZE + PADDING * (GRID_SIZE + 1)}x{GRID_SIZE * TILE_SIZE + PADDING * (GRID_SIZE + 1)}")self.master.resizable(False, False)self.init_grid()self.reset_game()def init_grid(self):"""创建 4x4 网格"""self.canvas = tk.Canvas(self.master, bg=BACKGROUND_COLOR, bd=0, highlightthickness=0)self.canvas.pack(fill=tk.BOTH, expand=True)self.tiles = []for i in range(GRID_SIZE):row = []for j in range(GRID_SIZE):x1 = PADDING + j * (TILE_SIZE + PADDING)y1 = PADDING + i * (TILE_SIZE + PADDING)x2 = x1 + TILE_SIZEy2 = y1 + TILE_SIZErect = self.canvas.create_rectangle(x1, y1, x2, y2, fill=TILE_COLORS[0], outline="")text = self.canvas.create_text(x1 + TILE_SIZE // 2, y1 + TILE_SIZE // 2, text="", font=("Helvetica", 30), fill="#776e65")row.append((rect, text))self.tiles.append(row)
运行效果:运行后你会看到一个 4x4 的灰色网格,每个格子代表一个方块。
2. 实现核心逻辑
游戏的逻辑主要包括:
- 压缩和合并数字:将相邻的数字合并。
- 滑动方向操作:实现上下左右滑动功能。
- 随机生成新数字:在空格中随机生成 2 或 4。
压缩与合并
每次滑动操作可以拆分为两部分:压缩(去掉空格) 和 合并(合并相邻的相同数字)。
def compress(row):"""将行向左压缩,去掉 0"""new_row = [num for num in row if num != 0]new_row += [0] * (GRID_SIZE - len(new_row))return new_rowdef merge(row):"""合并相邻相同的数字"""for i in range(len(row) - 1):if row[i] == row[i + 1] and row[i] != 0:row[i] *= 2row[i + 1] = 0return row
滑动操作
根据方向执行不同操作(上下左右)。
def move_left(grid):"""左移操作"""new_grid = []for row in grid:compressed_row = compress(row)merged_row = merge(compressed_row)new_grid.append(compress(merged_row))return new_grid
随机生成数字
每次滑动后随机选择一个空格,填入 2 或 4。
def spawn_new_tile(grid):"""随机生成一个新的数字方块(2 或 4)"""empty_cells = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if grid[i][j] == 0]if empty_cells:i, j = random.choice(empty_cells)grid[i][j] = 2 if random.random() < 0.9 else 4
3. 绑定键盘事件
为了让游戏动起来,我们需要捕获用户的按键(上下左右方向键),并根据按键更新网格状态。
def key_press(event):"""处理键盘输入"""key = event.keysymif key in ["Up", "Down", "Left", "Right"]:if key == "Up":game.grid = move_left(rotate_left(game.grid))game.grid = rotate_right(game.grid)elif key == "Down":game.grid = move_left(rotate_right(game.grid))game.grid = rotate_left(game.grid)elif key == "Left":game.grid = move_left(game.grid)elif key == "Right":game.grid = move_left(reverse_rows(game.grid))game.grid = reverse_rows(game.grid)spawn_new_tile(game.grid)game.update_ui()if is_game_over(game.grid):messagebox.showinfo("Game Over", "No more moves left!")
4. 添加游戏结束检测
当所有格子都被填满且没有可合并的数字时,游戏结束。
def is_game_over(grid):"""判断是否还有有效操作"""for i in range(GRID_SIZE):for j in range(GRID_SIZE):if grid[i][j] == 0: # 空格存在return Falseif j + 1 < GRID_SIZE and grid[i][j] == grid[i][j + 1]: # 横向可合并return Falseif i + 1 < GRID_SIZE and grid[i][j] == grid[i + 1][j]: # 纵向可合并return Falsereturn True
5. 完整代码
将上述代码整合的完整代码如下:运行后即可得到完整的 2048 游戏!
import tkinter as tk
from tkinter import messagebox
import random# 常量定义
GRID_SIZE = 4
TILE_SIZE = 100
PADDING = 10
BACKGROUND_COLOR = "#92877d"
TILE_COLORS = {0: "#9e948a", 2: "#eee4da", 4: "#ede0c8",8: "#f2b179", 16: "#f59563", 32: "#f67c5f",64: "#f65e3b", 128: "#edcf72", 256: "#edcc61",512: "#edc850", 1024: "#edc53f", 2048: "#edc22e",
}class Game2048:def __init__(self, master):self.master = masterself.master.title("2048")self.master.geometry(f"{GRID_SIZE * TILE_SIZE + PADDING * (GRID_SIZE + 1)}x{GRID_SIZE * TILE_SIZE + PADDING * (GRID_SIZE + 1)}")self.master.resizable(False, False)self.init_grid()self.reset_game()def init_grid(self):"""初始化网格界面"""self.canvas = tk.Canvas(self.master, bg=BACKGROUND_COLOR, bd=0, highlightthickness=0)self.canvas.pack(fill=tk.BOTH, expand=True)self.tiles = []for i in range(GRID_SIZE):row = []for j in range(GRID_SIZE):x1 = PADDING + j * (TILE_SIZE + PADDING)y1 = PADDING + i * (TILE_SIZE + PADDING)x2 = x1 + TILE_SIZEy2 = y1 + TILE_SIZErect = self.canvas.create_rectangle(x1, y1, x2, y2, fill=TILE_COLORS[0], outline="")text = self.canvas.create_text(x1 + TILE_SIZE // 2, y1 + TILE_SIZE // 2, text="", font=("Helvetica", 30), fill="#776e65")row.append((rect, text))self.tiles.append(row)def reset_game(self):"""重置游戏状态"""self.grid = [[0] * GRID_SIZE for _ in range(GRID_SIZE)]self.spawn_new_tile()self.spawn_new_tile()self.update_ui()def spawn_new_tile(self):"""随机生成一个新的数字方块(2 或 4)"""empty_cells = [(i, j) for i in range(GRID_SIZE) for j in range(GRID_SIZE) if self.grid[i][j] == 0]if empty_cells:i, j = random.choice(empty_cells)self.grid[i][j] = 2 if random.random() < 0.9 else 4def update_ui(self):"""更新界面显示"""for i in range(GRID_SIZE):for j in range(GRID_SIZE):value = self.grid[i][j]rect, text = self.tiles[i][j]self.canvas.itemconfig(rect, fill=TILE_COLORS.get(value, TILE_COLORS[2048]))self.canvas.itemconfig(text, text=str(value) if value != 0 else "")def compress(row):"""将行向左压缩,去掉 0"""new_row = [num for num in row if num != 0]new_row += [0] * (GRID_SIZE - len(new_row))return new_rowdef merge(row):"""合并相邻相同的数字"""for i in range(len(row) - 1):if row[i] == row[i + 1] and row[i] != 0:row[i] *= 2row[i + 1] = 0return rowdef move_left(grid):"""左移操作"""new_grid = []for row in grid:compressed_row = compress(row)merged_row = merge(compressed_row)new_grid.append(compress(merged_row))return new_griddef rotate_right(grid):"""矩阵顺时针旋转 90°"""return [list(row) for row in zip(*grid[::-1])]def rotate_left(grid):"""矩阵逆时针旋转 90°"""return [list(row) for row in zip(*grid)][::-1]def reverse_rows(grid):"""矩阵水平翻转"""return [row[::-1] for row in grid]def is_game_over(grid):"""判断是否还有有效操作"""for i in range(GRID_SIZE):for j in range(GRID_SIZE):if grid[i][j] == 0: # 空格存在return Falseif j + 1 < GRID_SIZE and grid[i][j] == grid[i][j + 1]: # 横向可合并return Falseif i + 1 < GRID_SIZE and grid[i][j] == grid[i + 1][j]: # 纵向可合并return Falsereturn Truedef key_press(event):"""处理键盘输入"""key = event.keysymif key in ["Up", "Down", "Left", "Right"]:if key == "Up":game.grid = move_left(rotate_left(game.grid))game.grid = rotate_right(game.grid)elif key == "Down":game.grid = move_left(rotate_right(game.grid))game.grid = rotate_left(game.grid)elif key == "Left":game.grid = move_left(game.grid)elif key == "Right":game.grid = move_left(reverse_rows(game.grid))game.grid = reverse_rows(game.grid)game.spawn_new_tile()game.update_ui()if is_game_over(game.grid):messagebox.showinfo("Game Over", "No more moves left!")root = tk.Tk()
game = Game2048(root)
root.bind("<Key>", key_press)
root.mainloop()
通过本篇博客,我们从头实现了经典的 2048 游戏。不仅让你掌握了 Tkinter 界面开发,还深入理解了游戏逻辑的实现过程。如果你喜欢这篇博客,请分享给更多的 Python 爱好者吧!
相关文章:
用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!
用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!(结尾附完整代码) 简介 2048 是一个简单而又令人上瘾的数字拼图游戏。玩家通过滑动方块使相同数字的方块合并,目标是创造出数字 2048!在这篇…...
《C++:计算机视觉图像识别与目标检测算法优化的利器》
在当今科技飞速发展的时代,计算机视觉领域正经历着前所未有的变革与突破。图像识别和目标检测作为其中的核心技术,广泛应用于安防监控、自动驾驶、智能医疗等众多领域,其重要性不言而喻。而 C语言,凭借其卓越的性能、高效的资源控…...
医学分割数据集白内障严重程度分割数据集labelme格式719张3类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):719 标注数量(json文件个数):719 标注类别数:3 标注类别名称:["normal","severe","mi…...
VirtIO实现原理之数据结构与数据传输演示(4)
接前一篇文章:VirtIO实现原理之数据结构与数据传输演示(3) 本文内容参考: VirtIO实现原理——vring数据结构-CSDN博客 VirtIO实现原理——数据传输演示-CSDN博客 特此致谢! 一、数据结构总览 2. 相关数据结构 前文书介绍了《Virtual I/O Device (VIRTIO) Version 1.3…...
C语言:详解指针最终篇(3)
一.字符指针变量 在指针的类型中我们知道有一种指针类型为字符指针char*。一般我们这样使用: 我们来看另一种使用方式: 这个常量字符串就相当于它本身首字符的地址,收地址加上方括号下标就可以访问该表达式中对应下标的元素。可以把该表达式…...
03篇--二值化与自适应二值化
二值化 定义 何为二值化?顾名思义,就是将图像中的像素值改为只有两种值,黑与白。此为二值化。 二值化操作的图像只能是灰度图,意思就是二值化也是一个二维数组,它与灰度图都属于单信道,仅能表示一种色调…...
Java 小抄|解析 JSON 并提取特定层级数据
文章目录 前言环境准备依赖库 示例代码JSON 数据Java 类定义解析 JSON 数据代码解释 结论 前言 在日常开发中,我们经常需要从 JSON 数据中提取特定的信息。本文将介绍如何使用 Java 和 Gson 库解析 JSON 数据,并通过流式处理提取特定层级的数据。我们将…...
qt 设置系统缩放为150%,导致的文字和界面的问题
1 当我们设置好布局后,在100%的设置里面都是正常的,但是当我们修改缩放为150%后,字体图标,界面大小就出现问题了,这就需要我们设置一些参数。 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QCoreAppl…...
【echarts】数据过多时可以左右滑动查看(可鼠标可滚动条)
1. 鼠标左右拖动 在和 series 同级的地方配置 dataZoom: dataZoom: [{type: inside, // inside 鼠标左右拖图表,滚轮缩放; slider 使用滑动条start: 0, // 左边的滑块位置,表示从 0 开始显示end: 60, // 右边的滑块位置…...
深度学习入门课程学习笔记(第25周)
摘要 本周报的目的在于汇报第25周的学习成果,本周主要聚焦于基于深度学习的目标检测领域算法的总体框架的学习。 在这本周的学习中,内容主要涵盖了目标检测算法的发展历程,包括发展历程和发展阶段,然后纤细说明了目标检测算法的…...
【Python】Matplotlib基本图表绘制
目录 Matplotlib基本图表绘制折线图更多外观外观类型颜色线条样式图例位置使用本地字体 散点图条形图横向条形图 直方图频率分布直方图 Matplotlib基本图表绘制 折线图 from matplotlib import pyplot as plt import matplotlib #字典类型的字体预设,键值对依次…...
【1211更新】腾讯混元Hunyuan3D-1文/图生3D模型云端镜像一键运行
目录 项目介绍 显存占用 11月21 新增纹理烘焙模块Dust3R 烘焙相关参数: AutoDL云端镜像 启动说明 标准模型下载 【1212更新】腾讯混元Hunyuan3D-1文图生3D模型云端镜像一键运行 项目介绍 https://github.com/Tencent/Hunyuan3D-1 腾讯混元 3D 生成模型,支持…...
工业大数据分析算法实战-day05
文章目录 day05分而治之中的MARS算法神经网络逼近能力解释 day05 今天是第5天,昨日从统计分析开始利用统计学的知识判断当前样本的分布以及估计总体的参数和假设检验的情况,以及介绍了线性回归算法的相关优化点,但是毕竟线性回归是线性划分的…...
Go 语言结构
Go 语言结构 Go 语言,也称为 Golang,是一种由 Google 开发和支持的静态类型、编译型编程语言。它于 2009 年首次发布,旨在提高多核处理器、网络资源和大型代码库的性能。Go 语言以其简洁的语法、并发支持和强大的标准库而闻名,特别适合构建高性能的网络服务和分布式系统。…...
【Python篇】PyQt5 超详细教程——由入门到精通(序篇)
文章目录 PyQt5 超详细入门级教程前言序篇:1-3部分:PyQt5基础与常用控件第1部分:初识 PyQt5 和安装1.1 什么是 PyQt5?1.2 在 PyCharm 中安装 PyQt51.3 在 PyCharm 中编写第一个 PyQt5 应用程序1.4 代码详细解释1.5 在 PyCharm 中运…...
9_less教程 --[CSS预处理]
LESS(Leaner Style Sheets)是一种CSS预处理器,它扩展了CSS语言,增加了变量、嵌套规则、混合(mixins)、函数等功能,使得样式表的编写更加灵活和易于维护。下面是一些LESS的基础教程内容ÿ…...
macOS:安装第三方软件
基于安全性考虑,Mac 系统通常不允许安装那些从网络上下载下来的第三方软件包。 比如,在打开镜像盘时,报错为“该镜像已损坏,请移至废纸篓”,或者打开软件时提示“XXX 已损坏,打不开。您应该将它移到废纸篓”…...
HTML+CSS+Vue3的静态网页,免费开源,可当作作业使用
拿走请吱一声,点个关注吧,代码如下,网页有移动端适配 HTML <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width…...
昇思25天学习打卡营第33天|共赴算力时代
文章目录 一、平台简介二、深度学习模型2.1 处理数据集2.2 模型训练2.3 加载模型 三、共赴算力时代 一、平台简介 昇思大模型平台,就像是AI学习者和开发者的超级基地,这里不仅提供丰富的项目、模型和大模型体验,还有一大堆经典数据集任你挑。…...
IAR环境下STM32静态库编译及使用
IAR环境下STM32静态库编译及使用 前言 最近了解到了STM32的静态库与动态库,在此记录一下STM32静态库的生成与使用。 静态库的作用主要是对代码进行封装及保护,使其他使用者只知其然而不知其所以然,因为封装后的静态库只有.h文件没有.c文件。…...
前端如何性能优化
前端性能优化是提高网页加载速度和响应速度的重要手段。优化前端性能不仅能提升用户体验,还能提高SEO排名,降低服务器负担,节省带宽等。下面是一些常见的前端性能优化方法: 1. 减少 HTTP 请求 每个页面资源(如图片、…...
【开源】为Stable Diffusion工作流程提供的一个更加灵活易用的Web界面
一个开源项目,旨在为Stable Diffusion工作流程提供一个更加灵活、易用的Web界面。这个项目特别适用于图像生成和编辑,具有以下几个显著特点: 分层和非破坏性编辑:OpenDream支持非破坏性编辑,允许用户在保留原始图像数据…...
安全见闻(1)
Target 开阔见闻,不做井底之蛙 Trial 建议 前期小白到中级红队:把python学好 C\C:偏向底层,适合逆向,不适合前期web渗透 编程语言 C语言: 一种通用的、面向过程的编程语言,广泛应用于系统软件和嵌入…...
基于32单片机的RS485综合土壤传感器检测土壤PH、氮磷钾的使用(超详细)
1-3为RS485综合土壤传感器的基本内容 4-5为基于STM32F103C8T6单片机使用RS485传感器检测土壤PH、氮磷钾并显示在OLED显示屏的相关配置内容 注意:本篇文件讲解使用的是PH、氮磷钾四合一RS485综合土壤传感器,但里面的讲解内容适配市面上的所有多合一的RS…...
SQL server学习03-创建和管理数据表
目录 一,SQL server的数据类型 1,基本数据类型 2,自定义数据类型 二,使用T-SQL创建表 1,数据完整性的分类 2,约束的类型 3,创建表时创建约束 4,任务 5,由任务编写…...
Windows 系统下 Python 环境安装
一、引言 Python 作为一种广泛应用的编程语言,在数据分析、人工智能等领域发挥着重要作用。本文将详细介绍在 Windows 系统上安装 Python 环境的步骤。 二、安装前准备 系统要求 Windows 7 及以上版本一般都能支持 Python。硬件方面,通常 2GB 内存、几…...
Redis 在Go项目中的集成和统一管理
本节我们在项目中安装和集成 go-redis,让项目能访问Redis,后面实战项目中的用户认证体系会依赖Redis来实现,像Token、Session这些都是在Redis中存储的。 本节大纲如下: Redis的使用场景有不少,不过有一点需要提醒的…...
Hive——HQL数据定义语言
文章目录 Hive HQL数据查询语言更多大数据资源持续更新中。。。学习目标一、HQL数据定义语言(DDL)概述1、DDL语法的作用2、Hive中DDL使用☆ 创建数据库☆ 查询数据库☆ 切换数据库☆ 修改数据库☆ 删除数据库 二、Hive DDL建表基础1、完整建表语法树2、H…...
Python机器视觉的学习
一、二值化 1.1 二值化图 二值化图:就是将图像中的像素改成只有两种值,其操作的图像必须是灰度图。 1.2 阈值法 阈值法(Thresholding)是一种图像分割技术,旨在根据像素的灰度值或颜色值将图像分成不同的区域。该方法…...
使用navicat新旧版本,连接PostgreSQL高版本报错问题图文解决办法
使用navicat新旧版本,连接PostgreSQL高版本报错问题图文解决办法 一、问题现象:二、出现原因三、解决方法:1、升级Navicat版本:2、使用低版本的postgreSQL:3、修改Navicat的dll二进制文件:navicat版本15nav…...
秒杀抢购场景下实战JVM级别锁与分布式锁
背景历史 在电商系统中,秒杀抢购活动是一种常见的营销手段。它通过设定极低的价格和有限的商品数量,吸引大量用户在特定时间点抢购,从而迅速增加销量、提升品牌曝光度和用户活跃度。然而,这种活动也对系统的性能和稳定性提出了极…...
【iOS】OC高级编程 iOS多线程与内存管理阅读笔记——自动引用计数(四)
目录 ARC规则 规则 对象型变量不能作为C语言结构体的成员 显式转换id和void* 属性 数组 ARC规则 规则 在ARC有效的情况下编译源代码必须遵守一定的规则: 主要解释一下最后两条 对象型变量不能作为C语言结构体的成员 要把对象型变量加入到结构体成员中时&a…...
Reactor 响应式编程(第一篇:Reactor核心)
系列文章目录 Reactor 响应式编程(第一篇:Reactor核心) Reactor 响应式编程(第二篇:Spring Webflux) Reactor 响应式编程(第三篇:R2DBC) Reactor 响应式编程(…...
数据挖掘之聚类分析
聚类分析(Clustering Analysis) 是数据挖掘中的一项重要技术,旨在根据对象间的相似性或差异性,将对象分为若干组(簇)。同一簇内的对象相似性较高,而不同簇间的对象差异性较大。聚类分析广泛应用…...
修改uniapp下拉刷新圆圈颜色
直接看图 修改前就是常规的绿色 自定义更符合我们的软件 直接说方法 修改 在App.vue的style样式里添加一行 .uni-page-refresh--refreshing .uni-page-refresh__path{stroke:#FF2442; }我是通过 不执行 uni.stopPullDownRefresh(); 下拉刷新 之后通过F12看出来的 希望可以帮…...
SparkSQL与Hive的整合
文章目录 SparkSQL与Hive的整合1.1. Spark On Hive1.1.1. Hive的准备工作1.1.2. Spark的准备工作1.1.3. Spark代码开发1.1.4. Spark On Hive案例 1.2. Hive On Spark1.3. SparkSQL命令行1.4. SparkSQL分布式查询引擎1.4.1. 开启ThriftServer服务1.4.2. beeline连接ThriftServer…...
电子科技大学考研,计算机与软件专业怎么选择?
电子科技大学在计算机与软件领域具备卓越实力,其毕业生就业前景及薪资水平均颇为可观。因此,学生应依据个人课程专长来选定专业。若各项课程均表现出色,推荐25届考生优先考虑软件专业,因其上岸难度相对较低。 接下来,C…...
MSF(Metasploit Framework)
渗透测试中MSF是一个非常强大的工具,可以用来验证系统漏洞、执行攻击以及开发自定义的漏洞利用代码。以下是使用MSF进行渗透测试的基本步骤: 1.启动MSF 启动MSF控制台。 msfconsole2. 搜索漏洞 在MSF中搜索已知漏洞。 search <vulnerability nam…...
@SpringBootTest 报错: UnsatisfiedDependencyException
Spring Boot Test 报错: UnsatisfiedDependencyException 在使用 SpringBootTest 测试时,出现 UnsatisfiedDependencyException 报错,原因和解决方法如下。 报错原因分析 1. Spring 存在涉及 Bean 没有被添加 Spring Boot 测试中,默认会加…...
QT数据库操作详解
在Qt中,操作数据库通常使用Qt SQL模块,该模块提供了一组类来与数据库进行交互。 数据库连接与查询执行 QSqlDatabase::addDatabase(): 添加一个数据库连接。 QSqlDatabase::open(): 打开数据库连接。 QSqlDatabase::close(): 关闭数据库连接。 QSql…...
Coding Caprice - dynamic programming13
647. 回文子串 class Solution { public:int countSubstrings(string s) {int s_len s.size();vector<int> dp{0};int out(1);for(int i1; i<s_len; i){out;vector<int> dq{i};if(s[i]s[i-1]){dq.push_back(i-1);out;}for(int j:dp){if(j>0&&s[j-1…...
Fastapi教程:使用 aioredis 连接池执行Redis 的高效异步操作
在构建高性能的 Web 应用时,缓存系统是一个至关重要的组成部分。Redis 是最常见的缓存系统之一,它提供了高效的存储与读取机制。然而,在与 Redis 进行频繁交互时,创建和销毁连接可能会成为瓶颈。为了优化这一问题,我们…...
Elasticsearch对象映射
Spring Data Elasticsearch对象映射是将Java对象(域实体)映射到存储在Elasticsearchs中的JSON表示形式并返回的过程。内部用于此映射的类是MappingElasticsearchConverter。 元模型对象映射 基于元模型的方法使用域类型信息对Elasticsearch进行读写操作…...
解决Logitech G hub 无法进入一直转圈的方案(2024.12)
如果你不是最新版本无法加载尝试以下方案:删除AppData 文件夹下的logihub文件夹 具体路径:用户名根据实际你的请情况修改 C:\Users\Administrator\AppData\Local 如果你有通过lua编译脚本,记得备份!! ↓如果你是最新…...
Debezium SchemaNameAdjuster 分析
Debezium SchemaNameAdjuster 分析 目录 1. 概述2. 核心功能3. 实现原理4. 应用场景5. 扩展示例6. 总结1. 概述 SchemaNameAdjuster 是 Debezium 中的一个工具类,主要用于确保 Schema 名称符合 Avro 命名规范。在数据库变更事件被转换为 Kafka 消息时,需要为每个表和字段创…...
聊一下前端常见的图片格式
1. JPEG (JPG) 概述:是一种有损压缩的图像格式,它通过去除图像中一些人类视觉不易察觉的细节来减小文件大小。它支持数百万种颜色,能够很好地呈现照片等色彩丰富的图像内容。优点: 压缩率高:可以在保持相对较好的图像…...
npm : 无法加载文件 D:\nodejs\npm.ps1
问题描述 npm run serve 启动一个Vue项目,报错如下: npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/? LinkID135170 中的 about_Execution_Policies。…...
如何使用 Python 实现 TCP / IP 客户端和服务端通信?
如何使用Python实现TCP/IP客户端和服务端通信? 1. TCP/IP通信基础 TCP/IP(传输控制协议/互联网协议)是互联网的基础协议,用于在网络中的计算机之间进行可靠的数据传输。在Python中,可以使用socket模块来实现TCP/IP通…...
IDEA 可视化使用 git rebase 合并分支步骤 使git分支树保持整洁
模拟环境 dev 分支开发完一个功能,需要合并到 master 分支,如果现在直接 merge 合并的话 git分支树会出现杂乱分叉,先把 master 分支 rebase 到 dev git分支树就会是整洁的一条直线 git rebase介绍 rebase:翻译成中文是重新设定,…...
【指南】03 CSC联系外导
确定外导 课题组有合作关系的国外导师与自己研究方向密切相关的国外导师国外高校官网、谷歌学术、Research Gate等平台检索不可以是中国港澳台的高校科研院所或机构注意外导所在高校排名和科研水平可列表记录注意外国签证政策 发送邮件 自我介绍简要介绍CSC介绍自己的研究对…...