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源码)
前言 相关参考游戏: 像素飞机大战(含Python源码)-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/147693018?spm1001.2014.3001.5501使用DeepSeek定制Python小游戏——以“俄罗斯方块”为例-CSDN博客https://blog.csdn.n…...
SwiftData 数据持久化解决方案
什么是 SwiftData? SwiftData 是苹果在 WWDC23 上推出的全新数据持久化框架,它构建在 Core Data 之上,但提供了更加 Swift 友好的 API。SwiftData 旨在简化数据模型的创建和管理,让开发者能够以更少的代码实现强大的数据持久化功…...

中间件-RocketMQ
RocketMQ 基本架构消息模型消费者消费消息模式顺序消息机制延迟消息批量消息事务消息消息重试最佳实践 基本架构 nameServer: 维护broker列表信息,客户端连接时只需要连接nameServer。可配置成集群。 broker:broker分为master和slave,master负…...
PostgreSQL 的 pg_current_logfile 函数
PostgreSQL 的 pg_current_logfile 函数 pg_current_logfile() 是 PostgreSQL 9.6 版本引入的一个系统管理函数,用于获取当前正在使用的日志文件路径。 一 基本用法 1 函数定义 pg_current_logfile([text]) → text2 简单查询 -- 获取当前日志文件路径 SELECT …...

Python就业方向有哪些?
Python 作为一门通用、易学且功能强大的编程语言,在多个领域都有广泛的应用,因此就业方向也非常多样化。以下是 Python 主要的就业方向及相关技能要求。 1. Web 开发 岗位:Python Web 开发工程师、后端工程师、全栈工程师技术栈:…...

iptables 访问控制列表使用记录
iptables 是linux操作系统上自带的防火墙程序,功能强大,能够依据策略过滤掉一些恶意访问流量,本次记录一下iptables的常见使用方法,未尽之处,欢迎补充。 一、iptables 下载 我这里使用的是华为openEuler 22.03版本&am…...

16. Qt系统相关:事件、定时器
1. Qt事件 1.1 简介 事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候&#…...

云平台搭建
物联网云平台的基本概述 基本概念 随着物联网技术的快速发展,越来越多的设备需要接入网络以实现智能化功能,物联网平台应运而生。 物联网云平台(IoT Cloud Platform)是物联网生态系统中的核心组件,它通过提供一系列…...

数学实验(Matlab语言环境和线性代数实验)
一、Matlab语言环境和线性代数实验 1.Matlab语言环境 Matlab简介 Matlab:Matrix Laboratry 矩阵实验室 Matlab 提供了强大的科学计算、灵活的程序设计流程、高质量的图形可视化与界面设计等功能,被广泛应用于科学计算、控制系统、信息处理等领域的分…...
sherpa:介绍
更多内容:XiaoJ的知识星球 目录 1. sherpa 介绍 1. sherpa 介绍 sherpa是 Next-gen Kaldi 项目的部署框架。 sherpa 支持在各种平台上部署与语音相关的预训练模型,并提供多种语言绑定。 目前,sherpa 拥有以下子项目: k2-fsa/sh…...
图片上传的util和使用
图片上传的util package com.ruoyi.web.controller.common.utils;import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration; import org.spri…...
2025年4月个人工作生活总结
本文为 2025年4月工作生活总结。 研发编码 一个项目的临时记录 自2月份领导让我牵头负责一个项目起,在本月算是有较多时间投入——但也是与之前的相比。 月初,清明节前一晚上,因某事务被叫上参加临时紧急远程会议,几方领导都在…...
利用Elixir中的原子特性 + 错误消息泄露 -- Atom Bomb
题目信息: This new atom bomb early warning system is quite strange… 题目使用 elixir 语言 一开始,我们会访问 /page.html <!DOCTYPE html> <!-- 设定文档语言为英语 --> <html lang"en"> <head><!-- 设定字符编码为UTF-8 --><…...
numpy pandas
视频链接 numpy numpy是基于一个矩阵的运算 矩阵的属性 import numpy as np# 把一个列表转换成矩阵的方法 array np.array([[1,2,3],[3,4,5]])# 打印矩阵 print(array)# 维度 print(number of dim:,array.ndim)# 行数和列数 print(shape:,array.shape)# 总共有多少个元素在…...
Amazon Redshift 使用场景解析与最佳实践
作为 AWS 云上数据仓库服务的核心成员,Amazon Redshift 凭借其高性能、可扩展性与经济性,正在成为越来越多企业实现数据驱动决策的首选方案。本文将解析 Redshift 的典型使用场景,并分享几项实用的落地最佳实践,帮助企业在数据仓库…...
STM32F446 RTC在VDD/VDDA关闭后失振问题的分析与解决
【原创】STM32F446 RTC在VDD/VDDA关闭后失振问题的分析与解决 作者: 思考的味道[你的ID] | weix_42368227 版权声明: 禁止未经授权转载 1. 问题描述 在某低功耗STM32F446项目中,采用以下供电方案: VDD:由DC-DC 3.3V提供(主电源…...
SSM框架(Spring + Spring MVC + MyBatis)整合配置的详细步骤
以下是 SSM框架(Spring Spring MVC MyBatis)整合配置的详细步骤,适用于 Maven 项目。 (一)、pom.xml中添加相关依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"ht…...

Elasticsearch 中的索引模板:如何使用可组合模板
作者:来自 Elastic Kofi Bartlett 探索可组合模板以及如何创建它们。 更多阅读: Elasticsearch:可组合的 Index templates - 7.8 版本之后 想获得 Elastic 认证吗?查看下一期 Elasticsearch Engineer 培训的时间! El…...
内存泄漏系列专题分析之七:高通相机CamX--Android通用ION(dmabuf)内存分配和释放原理
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:内存泄漏系列专题分析之六:高通camx 内存泄漏测试的未回收问题分析 这一篇我们开始讲:内存泄漏系列专题分析之七:高通相机CamX--Android通用ION(dmabuf)内存分配和释放原理 目录 一、背景 二、…...

【LeetCode 42】接雨水(单调栈、DP、双指针)
题面: 思路: 能接雨水的点,必然是比两边都低(小)的点。有两种思路,一种是直接计算每个点的最大贡献(也就是每个点在纵向上最多能接多少水),另一种就是计算每个点在横向上…...

【JS逆向基础】前端基础-HTML与CSS
1,flask框架 以下是一个使用flask框架写成的serve程序 # noinspection PyUnresolvedReferences #Flash框架的基本内容from flask import Flask app Flask(__name__)app.route(/index) def index():return "hello index"app.route(/login) def login():re…...
什么是HTML、CSS 和 JavaScript?
HTML、CSS 和 JavaScript 是构建网页的三大核心技术,它们分工明确又紧密协作。接下来我将分别介绍三者的定义、功能,并阐述它们如何共同构成网页,最后推荐学习资源。 一、HTML:网页的骨架与内容基础 HTML(HyperText …...

手机网页提示ip被拉黑名单什么意思?怎么办
当您使用手机浏览网页时,突然看到“您的IP地址已被列入黑名单”的提示,是否感到困惑和不安?这种情况在现代网络生活中并不罕见,但确实会给用户带来诸多不便。本文将详细解释IP被拉黑的含义、常见原因,并提供一系列实…...

CCF编程能力等级认证 一级 第一次课
介绍 CCF 编程能力等级认证(GESP)为青少年计算机和编程学习者提供学业能力验证的规则和平台,由中国计算机学会发起并主办。 每年考试分四次,时间是每年的3月、6月、9月、12月,以当年每期公布的时间为准。 GESP适用年…...

SpringBoot 讯飞星火AI WebFlux流式接口返回 异步返回 对接AI大模型 人工智能接口返回
介绍 用于构建基于 WebFlux 的响应式 Web 应用程序。集成了 Spring WebFlux 模块,支持响应式编程模型,构建非阻塞、异步的 Web 应用。WebFlux 使用了非阻塞的异步模型,能够更好地处理高并发请求。适合需要实时数据推送的应用场景。 WebClie…...

Python爬虫中time.sleep()与动态加载的配合使用
一、动态加载网页的挑战 动态加载网页是指网页的内容并非一次性加载完成,而是通过JavaScript等技术在用户交互或页面加载过程中逐步加载。这种设计虽然提升了用户体验,但对于爬虫来说,却增加了抓取的难度。传统的爬虫方法,如简单…...
学习Cesium Entities
🌐 Cesium中的Entities系统趣味学习 📊 Entities系统架构流程图 #mermaid-svg-Lkue5O3gYOkEVSbD {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Lkue5O3gYOkEVSbD .error-icon{fill:#552222;}#mermaid-svg-Lku…...
如何减少锁竞争并细化锁粒度以提高 Rust 多线程程序的性能?
在并发编程中,锁(Lock)是一种常用的同步机制,用于保护共享数据免受多个线程同时访问造成的竞态条件(Race Condition)。然而,不合理的锁使用会导致严重的性能瓶颈,特别是在高并发场景…...
Logback官方文档翻译章节目录
Logback官方文档翻译章节目录 第一章 Logback简介 第二章 Logback的架构(一) Logback的架构(二) Logback的架构(三) 持续更新中…...

AtCoder Beginner Contest 404 A-E 题解
还是ABC好打~比ARC好打多了( 题解部分 A - Not Found 给定你一个长度最大25的字符串,任意输出一个未出现过的小写字母 签到题,map或者数组下标查询一下就好 #include<bits/stdc.h>using namespace std;#define int long long #def…...