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

2048游戏(含Python源码)

前言

相关参考游戏:

像素飞机大战(含Python源码)-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/147693018?spm=1001.2014.3001.5501使用DeepSeek定制Python小游戏——以“俄罗斯方块”为例-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/147686449?spm=1001.2014.3001.5501贪吃蛇(含Python源码)-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/147660127?spm=1001.2014.3001.5501外星人入侵(python)_外星人入侵python源代码-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/135963588?spm=1001.2014.3001.5501

DeepSeek

使用DeepSeek生成的游戏可以正常的使用,最开始是控制台的形式,还是需要向DeepSeek明确自己的需求。

import pygame
import random
import sys# 颜色配置
COLORS = {0: (205, 193, 180),2: (238, 228, 218),4: (237, 224, 200),8: (242, 177, 121),16: (245, 149, 99),32: (246, 124, 95),64: (246, 94, 59),128: (237, 207, 114),256: (237, 204, 97),512: (237, 200, 80),1024: (237, 197, 63),2048: (237, 194, 46),'bg': (187, 173, 160),'text': (119, 110, 101),'gameover': (255, 255, 255, 128)
}# 游戏参数
WIDTH = 400
HEIGHT = 500
TILE_SIZE = 80
SPACING = 10def initialize_board():board = [[0] * 4 for _ in range(4)]add_new_tile(board)add_new_tile(board)return boarddef add_new_tile(board):empty_cells = [(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]if not empty_cells:return Falsei, j = random.choice(empty_cells)board[i][j] = 2 if random.random() < 0.9 else 4return Truedef move_row(row):# 合并逻辑(同控制台版本)compressed = [num for num in row if num != 0]merged = []skip = Falsefor i in range(len(compressed)):if skip:skip = Falsecontinueif i + 1 < len(compressed) and compressed[i] == compressed[i + 1]:merged.append(compressed[i] * 2)skip = Trueelse:merged.append(compressed[i])merged += [0] * (len(row) - len(merged))return mergeddef move(board, direction):new_board = [row.copy() for row in board]moved = Falseif direction == 'left':for i in range(4):new_row = move_row(board[i])if new_row != board[i]:moved = Truenew_board[i] = new_rowelif direction == 'right':for i in range(4):new_row = move_row(board[i][::-1])[::-1]if new_row != board[i]:moved = Truenew_board[i] = new_rowelif direction == 'up':for j in range(4):column = [board[i][j] for i in range(4)]new_col = move_row(column)if new_col != column:moved = Truefor i in range(4):new_board[i][j] = new_col[i]elif direction == 'down':for j in range(4):column = [board[i][j] for i in range(4)][::-1]new_col = move_row(column)[::-1]if new_col != column[::-1]:moved = Truefor i in range(4):new_board[i][j] = new_col[i]return new_board, moveddef draw_board(screen, board, font):screen.fill(COLORS['bg'])# 绘制棋盘for i in range(4):for j in range(4):value = board[i][j]x = SPACING + j * (TILE_SIZE + SPACING)y = SPACING + i * (TILE_SIZE + SPACING) + 100pygame.draw.rect(screen, COLORS.get(value, COLORS[0]),(x, y, TILE_SIZE, TILE_SIZE), 0, 3)if value != 0:text = font.render(str(value), True, COLORS['text'])text_rect = text.get_rect(center=(x + TILE_SIZE // 2, y + TILE_SIZE // 2))screen.blit(text, text_rect)# 绘制分数score = sum(sum(row) for row in board)score_text = font.render(f"Score: {score}", True, COLORS['text'])screen.blit(score_text, (20, 20))def is_game_over(board):# 同控制台版本判断逻辑if any(0 in row for row in board):return Falsefor i in range(4):for j in range(4):if (j < 3 and board[i][j] == board[i][j + 1]) or \(i < 3 and board[i][j] == board[i + 1][j]):return Falsereturn Truedef game_over_screen(screen, font):overlay = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)overlay.fill(COLORS['gameover'])text = font.render("Game Over!", True, (255, 0, 0))text_rect = text.get_rect(center=(WIDTH // 2, HEIGHT // 2))overlay.blit(text, text_rect)screen.blit(overlay, (0, 0))pygame.display.update()def main():pygame.init()screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("2048")clock = pygame.time.Clock()font = pygame.font.Font(None, 36)board = initialize_board()direction_keys = {pygame.K_w: 'up',pygame.K_a: 'left',pygame.K_s: 'down',pygame.K_d: 'right',pygame.K_UP: 'up',pygame.K_LEFT: 'left',pygame.K_DOWN: 'down',pygame.K_RIGHT: 'right'}running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key in direction_keys:direction = direction_keys[event.key]new_board, moved = move(board, direction)if moved:board = new_boardadd_new_tile(board)elif event.key == pygame.K_r:  # 按R重新开始board = initialize_board()draw_board(screen, board, font)if is_game_over(board):game_over_screen(screen, font)pygame.display.flip()clock.tick(30)pygame.quit()sys.exit()if __name__ == "__main__":main()

 代码详解

这个暂时没有想出可以增加什么特色的功能,目前就是增加保留历史最高分数的功能。

干脆就不进行修改,还是整理一下代码的逻辑,不然感觉弄这个也没学到什么知识,玩这种小游戏也是图一个新鲜感,所以还是理解一下代码。 

有了一门编程语言基础后,学习其他的语言还是比较快的,可以通过注解来理解代码的逻辑。

参数配置 

颜色配置:通过在全局定义图形的颜色,颜色一般都是采用RGB(Red,Green,Blue)的方式来设置。

游戏参数:通过在全局定义窗口的大小、方块大小和间隔大小一般命名还是尽量见名知意,也避免使用拼音的命名方式。

# 颜色配置
COLORS = {0: (205, 193, 180),2: (238, 228, 218),4: (237, 224, 200),8: (242, 177, 121),16: (245, 149, 99),32: (246, 124, 95),64: (246, 94, 59),128: (237, 207, 114),256: (237, 204, 97),512: (237, 200, 80),1024: (237, 197, 63),2048: (237, 194, 46),'bg': (187, 173, 160),'text': (119, 110, 101),'gameover': (255, 255, 255, 128)
}
# 游戏参数
WIDTH = 400
HEIGHT = 500
# 方块大小
TILE_SIZE = 80
# 间隔大小
SPACING = 10

核心逻辑模块

[ [0]*10 for i in range(4)]----Python列表解析-CSDN博客https://blog.csdn.net/wy_______/article/details/88716335在python中for i in range是什么意思-Python for i in range ()用法详解-CSDN博客https://blog.csdn.net/weixin_37988176/article/details/109371269python中random.choice()函数与random.choices()函数-CSDN博客https://blog.csdn.net/QDU_zty/article/details/138703821python常用random随机函数汇总,用法详解及函数之间的区别--一图了解python随机函数_python random函数-CSDN博客https://blog.csdn.net/weixin_45914452/article/details/115264053Python---copy()、deepcopy()与赋值的区别_为什么元组不能用copy却可以赋值-CSDN博客https://blog.csdn.net/u011630575/article/details/78604226Python内置函数any()详解 语法 参数 返回值 示例 使用场景 常见场景 检查列表中是否存在非零元素 检查字典中是否存在非空值 结合条件表达式使用 注意事项——《跟老吕学Python编程》_python any-CSDN博客https://blog.csdn.net/molangmolang/article/details/137760053关于python中的[::-1],[:,:,::-1]的反转理解-CSDN博客https://blog.csdn.net/wuxero/article/details/133858521[[0] * 4 for _ in range(4)]:创建4行4列的矩阵,用来表示棋盘。

[(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]:筛选出board中所有值为0的元素,并将这些元素的坐标以元组形式收集到一个新的列表中。

random.choice(seq):从非空序列 seq中选择一个随机元素。 

random.random(): 返回随机生成的一个浮点数,范围在[0,1)之间。

[num for num in row if num != 0]:过滤所有零元素,将有效元素左对齐。

使用 skip 标记避免连续合并(如处理 [2,2,2,2] → [4,4] 而非 [8])

if i + 1 < len(compressed) and compressed[i] == compressed[i + 1]:检测相邻相同元素。

[0] * (len(row) - len(merged)):在右侧补零,保持列表长度与原行一致。

[::-1])[::-1]:在一维数组中反转。

# 初始化棋盘
def initialize_board():board = [[0] * 4 for _ in range(4)]add_new_tile(board)add_new_tile(board)return board# 方块生成
def add_new_tile(board):# 查找空位并随机生成新方块empty_cells = [(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]if not empty_cells:return Falsei, j = random.choice(empty_cells)board[i][j] = 2 if random.random() < 0.9 else 4 # 如果小于0.9,则生成数字2;否则生成数字4return True# 单行合并逻辑
def move_row(row):# 实现经典的2048合并算法compressed = [num for num in row if num != 0]merged = []skip = Falsefor i in range(len(compressed)):if skip:skip = Falsecontinueif i + 1 < len(compressed) and compressed[i] == compressed[i + 1]:merged.append(compressed[i] * 2)skip = Trueelse:merged.append(compressed[i])merged += [0] * (len(row) - len(merged))return merged# 全盘移动
def move(board, direction):# 处理四个方向的移动逻辑new_board = [row.copy() for row in board]moved = Falseif direction == 'left':for i in range(4):new_row = move_row(board[i])if new_row != board[i]:moved = Truenew_board[i] = new_rowelif direction == 'right':for i in range(4):new_row = move_row(board[i][::-1])[::-1]if new_row != board[i]:moved = Truenew_board[i] = new_rowelif direction == 'up':for j in range(4):column = [board[i][j] for i in range(4)]new_col = move_row(column)if new_col != column:moved = Truefor i in range(4):new_board[i][j] = new_col[i]elif direction == 'down':for j in range(4):column = [board[i][j] for i in range(4)][::-1]new_col = move_row(column)[::-1]if new_col != column[::-1]:moved = Truefor i in range(4):new_board[i][j] = new_col[i]return new_board, moved# 游戏结束判断
def is_game_over(board):# 检测是否无有效移动if any(0 in row for row in board):return Falsefor i in range(4):for j in range(4):if (j < 3 and board[i][j] == board[i][j + 1]) or \(i < 3 and board[i][j] == board[i + 1][j]):return Falsereturn True

界面渲染模块

pygame之font模块_font.render-CSDN博客https://blog.csdn.net/weixin_51371629/article/details/125182808Pygame Draw绘图函数——《Python游戏开发库Pygame》_pygame.draw.rect-CSDN博客https://blog.csdn.net/molangmolang/article/details/139034445“screen.blit()函数的special_flags参数”——源自C知道-CSDN博客https://blog.csdn.net/h5a5i5/article/details/135560978pygame库使用简介_pip install pygame-CSDN博客https://blog.csdn.net/weixin_45369856/article/details/140609065Pygame Surface创建图像——《Python游戏开发库Pygame》-CSDN博客https://blog.csdn.net/molangmolang/article/details/139034359render(text,antialias,color,background=None):文字区域转换为image surface的方法。

pygame.draw.rect(Surface, color, Rect, width=0):绘制矩形。

screen.blit(text, text_rect):将一个图像绘制到屏幕上。

pygame.display.update():更新显示。

pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA):Surface可以视为一个二维的像素数组,每个像素都可以被赋予颜色和其他属性。

# 绘制棋盘
def draw_board(screen, board, font, high_score):# 棋盘网格绘制# 方块数值渲染# 分数/最高分显示screen.fill(COLORS['bg'])# 计算棋盘居中位置grid_size = 4 * TILE_SIZE + 5 * SPACING  # 总网格尺寸 (4方块+5间隔)start_x = (WIDTH - grid_size) // 2  # 水平居中start_y = 100  # 距离顶部固定间距# 绘制棋盘for i in range(4):for j in range(4):value = board[i][j]# 修正坐标计算公式x = start_x + j * (TILE_SIZE + SPACING)y = start_y + i * (TILE_SIZE + SPACING)# 绘制方块(添加阴影效果)pygame.draw.rect(screen, COLORS.get(value, COLORS[0]),(x, y, TILE_SIZE, TILE_SIZE), 0, 3)# 添加数值文字if value != 0:text = font.render(str(value), True, COLORS['text'])text_rect = text.get_rect(center=(x + TILE_SIZE // 2, y + TILE_SIZE // 2))screen.blit(text, text_rect)# 调整分数显示位置score = sum(sum(row) for row in board)score_text = font.render(f"Score: {score}", True, COLORS['text'])high_text = font.render(f"High: {high_score}", True, COLORS['text'])# 将分数信息放在棋盘上方居中header_y = start_y - 40screen.blit(score_text, (start_x, header_y))  # 左上对齐screen.blit(high_text, (start_x + grid_size - high_text.get_width(), header_y))  # 右上对齐# 游戏结束的屏幕
def game_over_screen(screen, font):# 半透明遮罩层# Game Over文字提示overlay = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)overlay.fill(COLORS['gameover'])text = font.render("Game Over!", True, (255, 0, 0))text_rect = text.get_rect(center=(WIDTH // 2, HEIGHT // 2))overlay.blit(text, text_rect)screen.blit(overlay, (0, 0))pygame.display.update()

数据管理模块

Python学习16:open内置函数全方面讲解_python open-CSDN博客https://blog.csdn.net/JackMengJin/article/details/106555683【Python】json.dumps()函数详解和示例-CSDN博客https://blog.csdn.net/qq_22734027/article/details/134989663深入浅出:Python `with` 语句详解-CSDN博客https://blog.csdn.net/zhaoxilengfeng/article/details/144382104认为保留最高分在一定程度上还是能够吸引玩家继续来玩这个游戏,所以增加了加载和保存最高分的函数。

这里用到了open函数"r"表示以只读方式打开文件,"w"表示打开一个文件只用于写入,如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。

通过 with 语句打开文件,可以在文件使用完毕后自动关闭,无需显式调用 close() 方法。

数据保存到文件2048_high_score.json中,文件的命名最好也是见名知意的,命名要求符合操作系统的命名规范。

json.dumps()是Python中处理JSON数据的重要函数,它允许开发者将Python对象转换为JSON格式的字符串。

# 新增函数:加载和保存最高分
def load_high_score():try:with open("2048_high_score.json", "r") as f:data = json.load(f)return data.get("high_score", 0)except (FileNotFoundError, json.JSONDecodeError):return 0def save_high_score(score):with open("2048_high_score.json", "w") as f:json.dump({"high_score": score}, f)

 控制模块

Pygame 官方文档 - pygame.time_pygame.time.clock-CSDN博客https://blog.csdn.net/Enderman_xiaohei/article/details/88167762Pygame详解(四):event 模块-CSDN博客https://blog.csdn.net/qq_41556318/article/details/86303039pygame 键盘事件_pygame键盘事件-CSDN博客https://blog.csdn.net/weixin_45020839/article/details/117886708第 3 章:事件处理与用户交互-CSDN博客https://blog.csdn.net/sdsdsdd__/article/details/145327602pygame.time.Clock():创建一个对象来帮助跟踪时间。

pygame.event.get(): 从队列中获取事件。

pygame.event.EventType

  • 事件本质上是一种封装后的数据类型(对象)
  •  EventType是Pygame的一个类,表示事件类型 
  • 事件类型只有属性,没有方法 
  • 用户可自定义新的事件类型
# 主函数
def main():pygame.init()screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("2048")clock = pygame.time.Clock()font = pygame.font.Font(None, 36)# 初始化最高分high_score = load_high_score()  # 新增current_high = high_score  # 新增board = initialize_board()direction_keys = {pygame.K_w: 'up',pygame.K_a: 'left',pygame.K_s: 'down',pygame.K_d: 'right',pygame.K_UP: 'up',pygame.K_LEFT: 'left',pygame.K_DOWN: 'down',pygame.K_RIGHT: 'right'}running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key in direction_keys:direction = direction_keys[event.key]new_board, moved = move(board, direction)if moved:board = new_boardadd_new_tile(board)# 更新最高分current_score = sum(sum(row) for row in board)if current_score > current_high:current_high = current_scoresave_high_score(current_high)  # 实时保存elif event.key == pygame.K_r:board = initialize_board()# 重置时保留最高分current_high = max(current_high, load_high_score())draw_board(screen, board, font, current_high)  # 修改调用if is_game_over(board):game_over_screen(screen, font)# 游戏结束时确保保存save_high_score(current_high)pygame.display.flip()clock.tick(30)# 退出时保存save_high_score(current_high)pygame.quit()sys.exit()

完整代码 

import pygame
import random
import sys
import json  # 新增导入# 颜色配置
COLORS = {0: (205, 193, 180),2: (238, 228, 218),4: (237, 224, 200),8: (242, 177, 121),16: (245, 149, 99),32: (246, 124, 95),64: (246, 94, 59),128: (237, 207, 114),256: (237, 204, 97),512: (237, 200, 80),1024: (237, 197, 63),2048: (237, 194, 46),'bg': (187, 173, 160),'text': (119, 110, 101),'gameover': (255, 255, 255, 128)
}# 游戏参数
WIDTH = 400
HEIGHT = 500
TILE_SIZE = 80
SPACING = 10# 新增函数:加载和保存最高分
def load_high_score():try:with open("2048_high_score.json", "r") as f:data = json.load(f)return data.get("high_score", 0)except (FileNotFoundError, json.JSONDecodeError):return 0def save_high_score(score):with open("2048_high_score.json", "w") as f:json.dump({"high_score": score}, f)def initialize_board():board = [[0] * 4 for _ in range(4)]add_new_tile(board)add_new_tile(board)return boarddef add_new_tile(board):empty_cells = [(i, j) for i in range(4) for j in range(4) if board[i][j] == 0]if not empty_cells:return Falsei, j = random.choice(empty_cells)board[i][j] = 2 if random.random() < 0.9 else 4return Truedef move_row(row):compressed = [num for num in row if num != 0]merged = []skip = Falsefor i in range(len(compressed)):if skip:skip = Falsecontinueif i + 1 < len(compressed) and compressed[i] == compressed[i + 1]:merged.append(compressed[i] * 2)skip = Trueelse:merged.append(compressed[i])merged += [0] * (len(row) - len(merged))return mergeddef move(board, direction):new_board = [row.copy() for row in board]moved = Falseif direction == 'left':for i in range(4):new_row = move_row(board[i])if new_row != board[i]:moved = Truenew_board[i] = new_rowelif direction == 'right':for i in range(4):new_row = move_row(board[i][::-1])[::-1]if new_row != board[i]:moved = Truenew_board[i] = new_rowelif direction == 'up':for j in range(4):column = [board[i][j] for i in range(4)]new_col = move_row(column)if new_col != column:moved = Truefor i in range(4):new_board[i][j] = new_col[i]elif direction == 'down':for j in range(4):column = [board[i][j] for i in range(4)][::-1]new_col = move_row(column)[::-1]if new_col != column[::-1]:moved = Truefor i in range(4):new_board[i][j] = new_col[i]return new_board, moveddef draw_board(screen, board, font, high_score):screen.fill(COLORS['bg'])# 计算棋盘居中位置grid_size = 4 * TILE_SIZE + 5 * SPACING  # 总网格尺寸 (4方块+5间隔)start_x = (WIDTH - grid_size) // 2  # 水平居中start_y = 100  # 距离顶部固定间距# 绘制棋盘for i in range(4):for j in range(4):value = board[i][j]# 修正坐标计算公式x = start_x + j * (TILE_SIZE + SPACING)y = start_y + i * (TILE_SIZE + SPACING)# 绘制方块(添加阴影效果)pygame.draw.rect(screen, COLORS.get(value, COLORS[0]),(x, y, TILE_SIZE, TILE_SIZE), 0, 3)# 添加数值文字if value != 0:text = font.render(str(value), True, COLORS['text'])text_rect = text.get_rect(center=(x + TILE_SIZE // 2, y + TILE_SIZE // 2))screen.blit(text, text_rect)# 调整分数显示位置score = sum(sum(row) for row in board)score_text = font.render(f"Score: {score}", True, COLORS['text'])high_text = font.render(f"High: {high_score}", True, COLORS['text'])# 将分数信息放在棋盘上方居中header_y = start_y - 40screen.blit(score_text, (start_x, header_y))  # 左上对齐screen.blit(high_text, (start_x + grid_size - high_text.get_width(), header_y))  # 右上对齐def is_game_over(board):if any(0 in row for row in board):return Falsefor i in range(4):for j in range(4):if (j < 3 and board[i][j] == board[i][j + 1]) or \(i < 3 and board[i][j] == board[i + 1][j]):return Falsereturn Truedef game_over_screen(screen, font):overlay = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA)overlay.fill(COLORS['gameover'])text = font.render("Game Over!", True, (255, 0, 0))text_rect = text.get_rect(center=(WIDTH // 2, HEIGHT // 2))overlay.blit(text, text_rect)screen.blit(overlay, (0, 0))pygame.display.update()def main():pygame.init()screen = pygame.display.set_mode((WIDTH, HEIGHT))pygame.display.set_caption("2048")clock = pygame.time.Clock()font = pygame.font.Font(None, 36)# 初始化最高分high_score = load_high_score()  # 新增current_high = high_score  # 新增board = initialize_board()direction_keys = {pygame.K_w: 'up',pygame.K_a: 'left',pygame.K_s: 'down',pygame.K_d: 'right',pygame.K_UP: 'up',pygame.K_LEFT: 'left',pygame.K_DOWN: 'down',pygame.K_RIGHT: 'right'}running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key in direction_keys:direction = direction_keys[event.key]new_board, moved = move(board, direction)if moved:board = new_boardadd_new_tile(board)# 更新最高分current_score = sum(sum(row) for row in board)if current_score > current_high:current_high = current_scoresave_high_score(current_high)  # 实时保存elif event.key == pygame.K_r:board = initialize_board()# 重置时保留最高分current_high = max(current_high, load_high_score())draw_board(screen, board, font, current_high)  # 修改调用if is_game_over(board):game_over_screen(screen, font)# 游戏结束时确保保存save_high_score(current_high)pygame.display.flip()clock.tick(30)# 退出时保存save_high_score(current_high)pygame.quit()sys.exit()if __name__ == "__main__":main()

 

 总结

如果存在什么问题,还希望各位大佬能够指正。

相关文章:

2048游戏(含Python源码)

前言 相关参考游戏&#xff1a; 像素飞机大战&#xff08;含Python源码&#xff09;-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/147693018?spm1001.2014.3001.5501使用DeepSeek定制Python小游戏——以“俄罗斯方块”为例-CSDN博客https://blog.csdn.n…...

百度golang开发一面

讲一下数据库的事务机制&#xff1f;acid特性是靠什么实现的&#xff1f; 持久性 redo log 原子性 undo log 隔离性 MVCC或next-lock锁 四个隔离级别是什么&#xff0c;分别解决什么问题&#xff1f; 可串行化实现原理 mysql锁机制&#xff1f;介绍锁的类型&#xff0c;以及原理…...

【Springboot知识】Springboot计划任务Schedule详解

文章目录 Spring Boot 定时任务从原理到实现详解一、核心原理分析1. 架构分层2. 核心组件3. 线程模型 二、基础实现步骤1. 添加依赖2. 主类配置3. 定时任务类 三、高级配置技巧1. 自定义线程池2. 动态配置参数3. 分布式锁集成&#xff08;Redis示例&#xff09; 四、异常处理机…...

大模型推理--从零搭建大模型推理服务器:硬件选购、Ubuntu双系统安装与环境配置

自从大模型火了之后就一直想自己组装一台机器去深入研究一下大模型&#xff0c;奈何囊中羞涩&#xff0c;迟迟也没有行动。在下了很大的勇气之后&#xff0c;终于花了接近4万块钱组装了一台台式机&#xff0c;下面给大家详细介绍一下我的装机过程。 1.硬件配置 研究了一周&am…...

如何使用QWidgets设计一个类似于Web Toast的控件?

如何使用QWidgets设计一个类似于Web Toast的控件&#xff1f; 前言 ​ 笔者这段时间沉迷于给我的下位机I.MX6ULL做桌面&#xff0c;这里抽空更新一下QT的东西。这篇文章是跟随CCMoveWidget一样的文章&#xff0c;尝试分享自己如何书写这份代码的思考的过程&#xff0c;和笔者…...

博图V20编译报错:备不受支持,无法编译。请更改为受支持的设备。

使用高版本博图打开低版本博图的工程文件时&#xff0c;hmi编译报错不通过&#xff0c;报错提示&#xff1a;备不受支持&#xff0c;无法编译。请更改为受支持的设备。 原因&#xff1a;当前版本的博图软件没有或不支持该组态设备的固件版本。 解决办法&#xff1a;1、安装报错…...

凸性(Convexity)

凸性&#xff08;Convexity&#xff09;是一个跨学科的重要概念&#xff0c;广泛应用于数学、优化理论、金融等领域。其核心含义是描述某种结构&#xff08;如函数、集合&#xff09;在特定条件下的“无凹陷”性质。 1. 数学中的凸性 1.1 凸函数与凹函数 在数学分析中&#…...

Vuex使用指南:状态管理

一、什么是状态管理&#xff1f;为什么需要 Vuex&#xff1f; 1. 状态管理的基本概念 在 Vue 应用中&#xff0c;状态指的是应用中的数据。例如&#xff1a; 用户登录状态购物车中的商品文章列表的分页信息 状态管理就是对这些数据的创建、读取、更新和删除进行有效管理。 …...

kotlin中枚举带参数和不带参数的区别

一 ✅ 代码对比总结 第一段&#xff08;带参数 工具方法&#xff09; enum class SeatPosition(val position: Int) {DRIVER_LEFT(0),DRIVER_RIGHT(1),SECOND_LEFT(2),SECOND_RIGHT(3);companion object {fun fromPosition(position: Int): SeatPosition? {return SeatPosi…...

【Python】Python好玩的第三方库之二维码生成,操作xlsx文件,以及音频控制器

前言 &#x1f31f;&#x1f31f;本期讲解关于python的三种第三方库的使用介绍~~~ &#x1f308;感兴趣的小伙伴看一看小编主页&#xff1a;GGBondlctrl-CSDN博客 &#x1f525; 你的点赞就是小编不断更新的最大动力 &#x1f386;那么…...

VTK 交互类介绍

基本概念 交互器(Interactor): 处理用户输入事件的基础类 交互样式(InteractorStyle): 定义具体的交互行为 Widgets: 可交互的UI组件,如滑块、按钮等 Picker: 用于选择场景中的对象 常用交互类 类名功能描述vtkRenderWindowInteractor渲染窗口交互器vtkInteractorStyle交互样式…...

在Window10 和 Ubuntu 24.04LTS 上 Ollama 在线或离线安装部署

Ollama 是一个开源的大型语言模型&#xff08;LLM&#xff09;服务框架&#xff0c;旨在通过轻量化、跨平台的设计&#xff0c;简化大模型在本地环境中的部署与应用。其基于 Go 语言开发&#xff0c;通过 Docker 容器化技术封装模型运行环境&#xff0c;提供类似命令行工具的交…...

语音合成之十一 提升TTS语音合成效果:低质量数据清洗、增强与数据扩增

低质量数据清洗、增强与数据扩增 1. 引言&#xff1a;TTS的基石——数据质量2. 基础&#xff1a;TTS数据准备工作流2.1 规划&#xff1a;定义蓝图2.2 执行&#xff1a;从原始数据到训练就绪格式2.3 最佳实践与可复现性 3. 攻克缺陷&#xff1a;低质量语音数据的清洗与增强3.2 手…...

RGB三原色

本文来源 &#xff1a; 腾讯元宝 ​​RGB三原色&#xff08;红绿蓝&#xff09;详解​​ RGB&#xff08;Red, Green, Blue&#xff09;是光学的三原色&#xff0c;通过不同比例的混合可以产生人眼可见的绝大多数颜色。它是现代显示技术&#xff08;如屏幕、投影仪&#xff09…...

BUUCTF 大流量分析(一) 1

BUUCTF:https://buuoj.cn/challenges 文章目录 题目描述&#xff1a;密文&#xff1a;解题思路&#xff1a;flag&#xff1a; 相关阅读 CTF Wiki BUUCTF:大流量分析&#xff08;一&#xff09; 题目描述&#xff1a; 某黑客对A公司发动了攻击&#xff0c;以下是一段时间内我们…...

虚幻引擎5-Unreal Engine笔记之显卡环境设置使开发流畅

虚幻引擎5-Unreal Engine笔记之显卡环境设置使开发流畅 code review! 文章目录 虚幻引擎5-Unreal Engine笔记之显卡环境设置使开发流畅1.电源管理2.显卡优先设置3.拯救者支持FnQ性能模式切换&#xff0c;建议开发前切至“野兽模式”或高性能模式。4.NVIDIA 驱动设置5.VS2022中…...

suna工具调用可视化界面实现原理分析(一)

这是一个基于React构建的工具调用侧边面板组件&#xff0c;主要用于展示和管理自动化工具调用流程。以下是代码功能解析及关键组件分析&#xff1a; 一、核心功能模块 多工具视图切换系统 • 动态视图加载&#xff1a;通过getToolView函数根据工具名称&#xff08;如execute-c…...

【将你的IDAPython插件迁移到IDA 9.x:核心API变更与升级指南】

文章目录 将你的 IDAPython 插件迁移到 IDA 9.x&#xff1a;核心 API 变更与升级指南为什么 API 会变化&#xff1f;关键不兼容性一&#xff1a;数据库信息访问 (inf_structure)关键不兼容性二&#xff1a;窗口/视图类型判断 (BWN_* 和 form_type)其他可能的 API 变更迁移策略建…...

《Python星球日记》第31天:Django 框架入门

名人说&#xff1a;路漫漫其修远兮&#xff0c;吾将上下而求索。—— 屈原《离骚》 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 专栏&#xff1a;《Python星球日记》&#xff0c;限时特价订阅中ing 目录 一、Django…...

读《人生道路的选择》有感

读完戴维坎贝尔的《人生道路的选择》&#xff0c;深有感触&#xff0c;虽然只有短短的108也&#xff0c;但作者强调了在复杂的生活环境之中“选择”的重要性。这也是我想要探讨的话题&#xff0c;选择到底会对我们人生产生怎样的影响。 在我们人生当中&#xff0c;确实有许多的…...

opencv+opencv_contrib+cuda和VS2022编译

本文介绍使用OpenCV和OpenCV_Contrib源码及Cuda进行编译的过程&#xff0c;编译过程中会用到OpenCV、OpenCV_Contrib、Toolkit、Cmake、VS2022等工具&#xff0c;最终编译OpenCV的Cuda版本。 一、OpenCV下载地址 OpenCV官网下载地址:https://opencv.org/releases/#&#xff0…...

STC单片机与淘晶驰串口屏通讯例程之01【新建HDMI工程】

大家好,我是『芯知识学堂』的SingleYork,今天笔者给大家一起学习这款“SYK-0806-A2S1”控制板与淘晶驰串口屏通讯的例程,本例使用的是淘晶驰的4.3寸电阻触摸屏TJC4827T143_011R_I_P20,分辨率为480272,详细参数大家可以查看这个屏的手册。 先来看下本例程整体的效果: 那么…...

PE文件结构(导出表)

导出表 什么是导出表&#xff1f; 导出表是PE文件中记录动态链接库&#xff08;DLL&#xff09;对外提供的函数或数据的列表&#xff0c;包含函数名称、序号和内存地址等信息&#xff0c;供其他程序调用 我们写一个dll来查看一下导出函数 int exportFunc1(int a, int b) {ret…...

网络安全自动化:精准把握自动化边界,筑牢企业安全防

在当今数字化时代&#xff0c;网络攻击的威胁日益严峻&#xff0c;企业网络安全的重要性不言而喻。随着海量资产与复杂架构的出现&#xff0c;网络安全自动化成为了众多企业关注的焦点。网络安全维护看似简单的修补系统、删除旧账户、更新软件&#xff0c;在大型企业中却极易变…...

实战设计模式之中介者模式

概述 中介者模式是一种强大且灵活的设计模式&#xff0c;适用于需要优化对象间通信的场景。中介者模式通过引入一个中介对象&#xff0c;来封装一系列对象之间的交互。在没有中介者的情况下&#xff0c;这些对象之间可能会直接相互引用&#xff0c;导致系统中的类紧密耦合&…...

价格识别策略思路

该策略是一种基于价格形态和市场条件的交易算法&#xff0c;旨在通过识别特定的价格模式来生成买入和卖出信号。 价格形态识别 策略的核心在于识别价格的高点和低点形态。通过比较当前周期及其前几个周期的最高价和最低价&#xff0c; 策略定义了一系列条件来判断价格是否形成了…...

Kotlin带接收者的Lambda介绍和应用(封装DialogFragment)

先来看一个具体应用&#xff1a;假设我们有一个App&#xff0c;App中有一个退出应用的按钮&#xff0c;点击该按钮后并不是立即退出&#xff0c;而是先弹出一个对话框&#xff0c;询问用户是否确定要退出&#xff0c;用户点了确定再退出&#xff0c;点取消则不退出&#xff0c;…...

【NLP】32. Transformers (HuggingFace Pipelines 实战)

&#x1f916; Transformers &#xff08;HuggingFace Pipelines 实战&#xff09; 本教程基于 Hugging Face 的 transformers 库&#xff0c;展示如何使用预训练模型完成以下任务&#xff1a; 情感分析&#xff08;Sentiment Analysis&#xff09;文本生成&#xff08;Text …...

[ 设计模式 ] | 单例模式

单例模式是什么&#xff1f;哪两种模式&#xff1f; 单例模式就是一个类型的对象&#xff0c;只有一个&#xff0c;比如说搜索引擎中的索引部分&#xff0c;360安全卫士的桌面悬浮球。 饿汉模式和懒汉模式&#xff1a;饿汉模式是线程安全的&#xff0c;懒汉模式不是线程安全的…...

用网页显示工控仪表

一.起因 现在工控也越来越多的使用web页面来显示电压,电流,温度,转速等物理量.本例使用js控制网页显示速度仪表. 二.代码 <html> <head><script type"text/javascript">var ctx;var px0;var movePoint{x0:0,x1:0};function init(){drawFace();m…...

Spring项目改造Solon版,使用体验,对比

概述 对于Solon有些人可能并不了解&#xff0c;在官方概述中&#xff0c;称其是新一代Java企业级应用开发框架&#xff0c;从零开始构建&#xff0c;有自主的标准规范与开放生态。近16万行代码。 并有更快、更小、更简单的特点 什么样的Java项目用Solon好&#xff1f; 按正常…...

2.CFD 计算过程概述:Fluent在散热计算中的优势

1.主流散热软件 2.电子产品热设计的基本要求 3.失效率与温度之间的关系 4.电子产品热设计的基本要求 5.电子产品必须要做散热设计 6.主动散热与被动散热 7.高效山热方案 8.热交换模型 9.Fluent中传热模型...

【Java ee初阶】多线程(6)

一、阻塞队列 队列的原则&#xff1a;“先进先出”&#xff0c;队列分为普通队列&#xff0c;优先级队列等等。在数据结构中&#xff0c;堆是特殊的完全二叉树&#xff0c;一定不要把堆和二叉搜索树混淆。 阻塞队列是一种特殊的队列&#xff0c;也遵循“先进先出”的原则。 …...

Unity:Surface Effector 2D(表面效应器 2D)

目录 什么是表面效应器 2D&#xff1f; &#x1f3af; 它是做什么的&#xff1f; &#x1f9ea; 从第一性原理解释它是怎么工作的 &#x1f4e6; 重要参数解释 为什么不直接用 Rigidbody&#xff08;刚体&#xff09;来控制运动 &#xff1f; 所以什么时候该用哪个&#…...

Spring 框架的底层原理

Spring 框架的底层原理主要包括以下几个方面&#xff1a; 核心容器&#xff08;IoC 容器&#xff09; IoC&#xff08;控制反转&#xff09;原理 &#xff1a; 依赖注入&#xff08;DI&#xff09; &#xff1a;这是 IoC 的实现方式之一。在传统的程序开发中&#xff0c;程序组…...

【Unity】AssetBundle热更新

1.新建两个预制体&#xff1a; Cube1&#xff1a;GameObject Material1&#xff1a;Material Cube1使用了Material1材质 之后设置打包配置 Cube1的打包配置为custom.ab Material1的打包配置为mat.ab 2.在Asset文件夹下创建Editor文件夹&#xff0c;并在Editor下创建BuildBundle…...

【算法笔记】动态规划基础(二):背包dp

目录 01背包例题状态表示状态计算初始化AC代码 完全背包例题状态表示状态计算初始化TLE代码 多重背包例题状态表示状态计算初始化AC代码 分组背包例题状态表示状态计算初始化AC代码 二维费用背包例题状态表示状态计算初始化AC代码 混合背包问题例题状态表示状态计算初始化TLE代…...

IP属地是我的定位吗?——解析两者区别

在互联网时代&#xff0c;我们经常看到社交媒体、论坛或APP上显示用户的“IP属地”&#xff0c;许多人会疑惑&#xff1a;‌IP属地是不是我的精确定位&#xff1f;它会不会暴露我的隐私&#xff1f;‌ 本文将详细解析IP属地和定位的区别&#xff0c;并解答常见的相关问题&#…...

力扣每日一题1128等价多米诺骨牌对的数量

1128. 等价多米诺骨牌对的数量 题目&#xff1a; 给你一组多米诺骨牌 dominoes 。 形式上&#xff0c;dominoes[i] [a, b] 与 dominoes[j] [c, d] 等价 当且仅当 (a c 且 b d) 或者 (a d 且 b c) 。即一张骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌。 在 0 &l…...

SpringBoot集成CXF框架,实现WebService

SpringBoot官网地址&#xff1a;https://spring.io/projects/spring-ws 1、WebService服务端搭建 Maven依赖 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.17&…...

android-ndk开发(2): macOS 安装 ndk

android-ndk开发(2): macOS 安装 ndk 2025/05/05 1. 概要 对于 android-ndk 在 r23 之前的版本&#xff0c;官方提供了 .zip 文件&#xff0c; 解压即安装。 对于 android-ndk 在 r23 以及之后的版本&#xff0c; 官方只提供了 .dmg 文件&#xff0c; 不能简单的解压完成安…...

科创大赛——知识点复习【c++】——第一篇

目录 输入 一、cin 二、scanf 三、gets 四、getchar 五、fgets 输出 一、cout 二、printf 基本数据类型 一&#xff0c;数据类型有哪些&#xff1f; 二&#xff0c;整型&#xff08;Integer Types&#xff09; 1&#xff0c;修饰符 2&#xff0c;整型数据的数据范…...

硬件工程师面试常见问题(14)

第六十六问&#xff1a;运放--输入偏置电流和输入失调电流 输入偏置电流lb&#xff1a;是由于运放两个输入极都有漏电流的存在。实际的运放,会有电流流入运放的输入端的。那么输入偏置电流就定义这两个电流的平均值。 输入失调电流 Ios&#xff1a;定义为两个差分输入端偏置电…...

Flink流水线任务在线演示

Flink流水线在线演示 1. 登录系统 访问系统登录页面&#xff0c;输入账号密码完成身份验证。 2. 创建任务 入口&#xff1a;通过顶部菜单栏选择 任务开发&#xff0c;或通过快捷入口 快速创建任务。 任务类型&#xff1a;选择 FlinkPipeline。 3. 配置任务 进入配置界面…...

C++笔记之接口`Interface`

C++笔记之接口Interface code review! 一个简洁简短的 C++ 接口实现示例: #include <iostream>// 1. 定义接口(抽象类) class Shape {public:...

css使用aspect-ratio制作4:3和9:16和1:1等等比例布局

文章目录 1. 前言2. 用法2.1 基本语法2.2. 与max-width、max-height等属性结合使用2.3. 动态计算比例 3. 应用场景4. 兼容性和替代方案5. 总结 1. 前言 在网页制作过程中&#xff0c;有时候我们只知道宽度&#xff0c;或者只知道高度&#xff0c;这时候需要制作一个4:3和9:16这…...

深入探索 Apache Spark:从初识到集群运行原理

深入探索 Apache Spark&#xff1a;从初识到集群运行原理 在当今大数据时代&#xff0c;数据如同奔涌的河流&#xff0c;蕴藏着巨大的价值。如何高效地处理和分析这些海量数据&#xff0c;成为各行各业关注的焦点。Apache Spark 正是为此而生的强大引擎&#xff0c;它以其卓越…...

0903Redux改造项目_用户信息_状态管理-react-仿低代码平台项目

文章目录 1 Redux管理用户信息1.1 定义store和reducer1.2 使用useSeletor 2 自定义Hook统一加载用户信息存储Redux3 根据用户登录状态动态跳转页面结语 1 Redux管理用户信息 1.1 定义store和reducer src/store/userReducer.ts代码如下所示&#xff1a; import { createSlice…...

PyTorch_构建线性回归

使用 PyTorch 的 API 来手动构建一个线性回归的假设函数&#xff0c;数据加载器&#xff0c;损失函数&#xff0c;优化方法&#xff0c;绘制训练过程中的损失变化。 数据构建 import torch from sklearn.datasets import make_regression import matplotlib.pyplot as plt i…...

领略算法真谛: 多源bfs

嘿&#xff0c;各位技术潮人&#xff01;好久不见甚是想念。生活就像一场奇妙冒险&#xff0c;而编程就是那把超酷的万能钥匙。此刻&#xff0c;阳光洒在键盘上&#xff0c;灵感在指尖跳跃&#xff0c;让我们抛开一切束缚&#xff0c;给平淡日子加点料&#xff0c;注入满满的pa…...