Python 贪吃蛇
文章目录
- 效果图:
- 项目目录结构
- main.py
- game/apple.py
- game/base.py
- game/snake.py
- constant.py
效果图:
项目目录结构
main.py
from snake.game.apple import Apple # 导入苹果类
from snake.game.base import * # 导入游戏基类
from snake.game.snake import Snake # 导入蛇类class SnakeGame(GameBase):"""贪吃蛇游戏"""def __init__(self):"""初始化游戏"""super(SnakeGame, self).__init__(game_name=GAME_NAME, icon=ICON, # 调用基类的初始化方法screen_size=SCREEN_SIZE,display_mode=DISPLAY_MODE,loop_speed=LOOP_SPEED,font_size=FONT_SIZE,background=WHITE,font_name=None)# 绘制背景self.prepare_background()# 创建游戏对象self.apple_count = 0 # 苹果计数器self.high_score = 0 # 记录最高分self.snake = Snake(self) # 创建蛇对象self.apple = Apple(self) # 创建苹果对象# 绑定按键事件self.add_key_binding(KEY_UP, self.snake.turn, direction=UP) # 绑定上方向键self.add_key_binding(KEY_DOWN, self.snake.turn, direction=DOWN) # 绑定下方向键self.add_key_binding(KEY_LEFT, self.snake.turn, direction=LEFT) # 绑定左方向键self.add_key_binding(KEY_RIGHT, self.snake.turn, direction=RIGHT) # 绑定右方向键self.add_key_binding(KEY_RESTART, self.restart) # 绑定R键(重启游戏)self.add_key_binding(KEY_PAUSE, self.pause) # 绑定R键(重启游戏)self.add_key_binding(KEY_EXIT, self.quit) # 绑定退出键# 添加绘图函数self.add_draw_action(self.draw_score) # 添加绘制分数的函数def prepare_background(self):"""准备背景"""self.background.fill(BACKGROUND_COLOR) # 用背景颜色填充背景for _ in range(CELL_SIZE, SCREEN_WIDTH, CELL_SIZE): # 绘制垂直网格线self.draw.line(self.background, GRID_COLOR, (_, 0), (_, SCREEN_HEIGHT))for _ in range(CELL_SIZE, SCREEN_HEIGHT, CELL_SIZE): # 绘制水平网格线self.draw.line(self.background, GRID_COLOR, (0, _), (SCREEN_WIDTH, _))def restart(self):"""重启游戏"""if not self.snake.is_alive: # 如果蛇已经死亡self.apple_count = 0 # 重置苹果计数器self.apple.drop() # 重新放置苹果self.snake.restart_pawn() # 重生蛇self.running = True # 继续游戏循环def draw_score(self):"""绘制分数"""text = f"Apple: {self.apple_count}" # 准备要绘制的文本self.high_score = max(self.high_score, self.apple_count) # 更新最高分self.draw_text(text, (0, 0), (255, 255, 33)) # 绘制文本if not self.snake.is_alive: # 如果蛇已经死亡self.draw_text(" 游戏结束 ", (SCREEN_WIDTH / 2 - 54, SCREEN_HEIGHT / 2 - 10), # 绘制游戏结束文本(255, 33, 33), WHITE)self.draw_text(" 按R键重启 ", (SCREEN_WIDTH / 2 - 85, SCREEN_HEIGHT / 2 + 20), # 绘制重启提示文本GREY, DARK_GREY)self.draw_text(f"当前最高分: {self.high_score}", (SCREEN_WIDTH / 2 - 114, SCREEN_HEIGHT / 2 + 50), # 绘制最高分文本(255, 33, 33), WHITE) # 展示最高分if not self.running and self.snake.is_alive: # 如果游戏暂停且蛇还活着self.draw_text("游戏暂停 ", (SCREEN_WIDTH / 2 - 55, SCREEN_HEIGHT / 2 - 10), # 绘制游戏暂停文本LIGHT_GREY, DARK_GREY)if __name__ == '__main__':SnakeGame().run() # 运行游戏
game/apple.py
from random import randint
from snake.constant import *class Apple:"""苹果类:表示游戏中的苹果,蛇吃到苹果会增长身体长度。"""def __init__(self, game):"""初始化苹果对象。:param game: 游戏对象。"""self.game = gameself.x = self.y = 0 # 苹果的初始位置self.game.add_draw_action(self.draw) # 将 draw 方法添加到游戏的绘制动作列表中self.drop() # 生成一个新的苹果def drop(self):"""生成一个新的苹果,确保苹果不在蛇的身体上。"""snake = self.game.snake.body + [self.game.snake.head] # 获取蛇的身体和头部的所有位置while True:(x, y) = randint(0, COLUMNS - 1), randint(0, ROWS - 1) # 随机生成一个位置if (x, y) not in snake: # 如果这个位置不在蛇的身体上self.x, self.y = x, y # 将苹果的位置设置为这个位置break # 退出循环def draw(self):"""绘制苹果。"""self.game.draw_cell((self.x, self.y), # 苹果的位置CELL_SIZE, # 每个单元格的大小APPLE_COLOR_SKIN, # 苹果的外框颜色APPLE_COLOR_BODY # 苹果的主体颜色)
game/base.py
import os
import sys
import time
from snake.constant import *# 使窗口居中
os.environ["SDL_VIDEO_CENTERED"] = "1"# MyGame 默认值
GAME_NAME = "贪吃蛇 By stormsha"
SCREEN_SIZE = 640, 480
DISPLAY_MODE = pygame.HWSURFACE | pygame.DOUBLEBUF
LOOP_SPEED = 60
# noinspection SpellCheckingInspection
FONT_NAME = "resources/MONACO.ttf"
FONT_SIZE = 16
KEY_PAUSE = pygame.K_PAUSEclass GameBase(object):"""pygame模板类"""def __init__(self, **kwargs):"""初始化可选参数:game_name 游戏名称icon 图标文件名screen_size 画面大小display_mode 显示模式loop_speed 主循环速度font_name 字体文件名font_size 字体大小"""pygame.init()pygame.mixer.init()self.game_name = kwargs.get("game_name") or GAME_NAMEpygame.display.set_caption(self.game_name)self.screen_size = kwargs.get("screen_size") or SCREEN_SIZEself.screen_width, self.screen_height = self.screen_sizeself.display_mode = kwargs.get("display_mode") or DISPLAY_MODEself.images = {}self.sounds = {}self.musics = {}self.icon = kwargs.get("icon") or Noneself.icon and pygame.display.set_icon(pygame.image.load(self.icon))self.screen = pygame.display.set_mode(self.screen_size,self.display_mode)self.loop_speed = kwargs.get("loop_speed") or LOOP_SPEEDself.font_size = kwargs.get("font_size") or FONT_SIZEself.background = None# noinspection SpellCheckingInspection''' 支持中文的字体新细明体:PMingLiU细明体:MingLiU标楷体:DFKai - SB黑体:SimHei宋体:SimSun新宋体:NSimSun仿宋:FangSong楷体:KaiTi仿宋_GB2312:FangSong_GB2312楷体_GB2312:KaiTi_GB2312微软正黑体:Microsoft JhengHei微软雅黑体:Microsoft YaHei'''self.font_name = kwargs.get("font_name") or pygame.font.match_font('SimHei') # 获取系统字体self.font = pygame.font.Font(self.font_name, self.font_size)self.clock = pygame.time.Clock()self.now = 0self.background_color = kwargs.get("background") or BLACKself.set_background()self.key_bindings = {} # 按键与函数绑定字典self.add_key_binding(KEY_PAUSE, self.pause)self.game_actions = {} # 游戏数据更新动作self.draw_actions = [self.draw_background] # 画面更新动作列表self.running = Trueself.draw = pygame.drawdef run(self):"""主循环"""while True:self.now = pygame.time.get_ticks()self.process_events()if self.running:self.update_game_data()self.update_display()self.clock.tick(self.loop_speed)def pause(self):"""暂停游戏"""self.running = not self.runningif self.running:for action in self.game_actions.values():if action["next_time"]:action["next_time"] = self.now + action["interval"]def process_events(self):"""事件处理"""for event in pygame.event.get():if event.type == pygame.QUIT:self.quit()elif event.type == pygame.KEYDOWN:action, kwargs = self.key_bindings.get(event.key, (None, None))# noinspection allaction(**kwargs) if kwargs else action() if action else Nonedef update_game_data(self):"""更新游戏数据"""for action in self.game_actions.values():if not action["next_time"]:action["run"]()elif self.now >= action["next_time"]:action["next_time"] += action["interval"]action["run"]()def update_display(self):"""更新画面显示"""for action in self.draw_actions:action()pygame.display.flip()def draw_background(self):"""绘制背景"""self.screen.blit(self.background, (0, 0))def add_key_binding(self, key, action, **kwargs):"""增加按键绑定"""self.key_bindings[key] = action, kwargs# TODO: 更新动作若有次序要求,则用字典保存不合适def add_game_action(self, name, action, interval=0):"""添加游戏数据更新动作"""next_time = self.now + interval if interval else Noneself.game_actions[name] = dict(run=action,interval=interval,next_time=next_time)def add_draw_action(self, action):"""添加画面更新动作"""self.draw_actions.append(action)def draw_text(self, text, loc, color, bgcolor=None):if bgcolor:surface = self.font.render(text, True, color, bgcolor)else:surface = self.font.render(text, True, color)self.screen.blit(surface, loc)def draw_cell(self, xy, size, color1, color2=None):x, y = xyrect = pygame.Rect(x * size, y * size, size, size)self.screen.fill(color1, rect)if color2:self.screen.fill(color2, rect.inflate(-4, -4))@staticmethoddef quit():"""退出游戏"""pygame.quit()sys.exit(0)@staticmethoddef load_music(filename):pygame.mixer.music.load(filename)@staticmethoddef play_music():pygame.mixer.music.play(-1)@staticmethoddef pause_music():pygame.mixer.music.pause()@staticmethoddef resume_music():pygame.mixer.music.unpause()@staticmethoddef stop_music():pygame.mixer.music.stop()def save_screenshots(self):filename = time.strftime('screenshots/%Y%m%d%H%M%S.png')pygame.image.save(self.screen, filename)def load_images(self, filename, sub_img=None):sub_img = sub_img or {}image = pygame.image.load(filename).convert_alpha() # 文件打开失败for name, rect in sub_img.items():x, y, w, h = rectself.images[name] = image.subsurface(pygame.Rect((x, y), (w, h)))def set_background(self, background=None):if isinstance(background, str):self.background = pygame.image.load(background)else:self.background = pygame.Surface(self.screen_size)self.background_color = background \if isinstance(background, tuple) else (0, 0, 0)self.background.fill(self.background_color)def load_sounds(self, **sounds):"""@summary: 加载音乐:param sounds::return:"""for name, filename in sounds.items():self.sounds[name] = pygame.mixer.Sound(filename)def play_sound(self, name):self.sounds[name].play()if __name__ == '__main__':GameBase().run()
game/snake.py
import pygamefrom snake import constantclass Snake:"""贪吃蛇"""def __init__(self, game):self.game = gameself.sound_hit = pygame.mixer.Sound("resources/hit.wav")self.sound_eat = pygame.mixer.Sound("resources/eat.wav")self.game.add_draw_action(self.draw)# 初始化数据self.head = (constant.SNAKE_X, constant.SNAKE_Y) # 蛇头当前位置self.body = [(-1, -1)] * constant.SNAKE_BODY_LENGTH # 蛇身长度self.direction = constant.SNAKE_DIRECTION # 当前方向self.new_direction = constant.SNAKE_DIRECTION # 移动方向self.speed = constant.SNAKE_SPEED # 移动速度self.is_alive = True # 是否存活def set_speed(self, speed):"""@summary: 设置蛇的移动速度:param speed: 移动速度:return:"""self._speed = speedself.game.add_game_action("snake.move", self.move, 1000 // speed)def get_speed(self):"""@summary: 获取当前蛇的移动速度:return:"""return self._speed@propertydef speed(self):return self._speed@speed.setterdef speed(self, speed):self._speed = speedself.game.add_game_action("snake.move", self.move, 1000 // speed)def draw(self):"""@summary: 绘制小蛇:return: """skin_color = constant.SNAKE_COLOR_SKIN if self.is_alive else constant.SNAKE_COLOR_SKIN_DEADbody_color = constant.SNAKE_COLOR_BODY if self.is_alive else constant.SNAKE_COLOR_BODY_DEADhead_color = constant.SNAKE_COLOR_HEAD if self.is_alive else constant.SNAKE_COLOR_HEAD_DEADfor cell in self.body:self.game.draw_cell(cell, constant.CELL_SIZE, skin_color, body_color)self.game.draw_cell(self.head, constant.CELL_SIZE, skin_color, head_color)def turn(self, direction):"""@summary: 改变小蛇方向:param direction: :return: """if (self.direction in (constant.LEFT, constant.RIGHT) and direction in (constant.UP, constant.DOWN) orself.direction in (constant.UP, constant.DOWN) and direction in (constant.LEFT, constant.RIGHT)):self.new_direction = directiondef move(self):"""@summary: 移动小蛇:return: """if not self.is_alive:return# 设定方向self.direction = self.new_direction# 检测前方x, y = meeting = (self.head[0] + self.direction[0],self.head[1] + self.direction[1])# 死亡判断if meeting in self.body or x not in range(constant.COLUMNS) or y not in range(constant.ROWS):self.die()return# 判断是否吃了苹果if meeting == (self.game.apple.x, self.game.apple.y):self.sound_eat.play()self.game.apple.drop()self.game.apple_count += 1else:self.body.pop()# 蛇头变成脖子self.body = [self.head] + self.body# 蛇头移动到新位置self.head = meetingdef restart_pawn(self):"""重生"""self.head = (constant.SNAKE_X, constant.SNAKE_Y)self.body = [(-1, -1)] * constant.SNAKE_BODY_LENGTHself.direction = constant.SNAKE_DIRECTIONself.new_direction = constant.SNAKE_DIRECTIONself.speed = constant.SNAKE_SPEEDself.is_alive = Truedef die(self):self.sound_hit.play()self.is_alive = False
constant.py
import pygame# 颜色设定
BLACK = 0, 0, 0
WHITE = 255, 255, 255
DARK_GREY = 33, 33, 33
GREY = 127, 127, 127
LIGHT_GREY = 192, 192, 192
BACKGROUND_COLOR = BLACK
GRID_COLOR = DARK_GREY
APPLE_COLOR_SKIN = 255, 127, 127
APPLE_COLOR_BODY = 255, 66, 66
SNAKE_COLOR_SKIN = 33, 255, 33
SNAKE_COLOR_BODY = 33, 192, 33
SNAKE_COLOR_HEAD = 192, 192, 33
SNAKE_COLOR_SKIN_DEAD = LIGHT_GREY
SNAKE_COLOR_BODY_DEAD = GREY
SNAKE_COLOR_HEAD_DEAD = DARK_GREY# 一般设定
GAME_NAME = "SnakeGame"
SCREEN_SIZE = SCREEN_WIDTH, SCREEN_HEIGHT = 640, 480
CELL_SIZE = 20
COLUMNS, ROWS = SCREEN_WIDTH // CELL_SIZE, SCREEN_HEIGHT // CELL_SIZE
DISPLAY_MODE = pygame.HWSURFACE | pygame.DOUBLEBUF
LOOP_SPEED = 60
# noinspection SpellCheckingInspection
FONT_NAME = "resources/MONACO.TTF"
FONT_SIZE = 16
# noinspection SpellCheckingInspection
ICON = "resources/snake.png"
UP, DOWN, LEFT, RIGHT = (0, -1), (0, 1), (-1, 0), (1, 0)# 按键设定
KEY_EXIT = pygame.K_ESCAPE
KEY_UP = pygame.K_UP
KEY_DOWN = pygame.K_DOWN
KEY_LEFT = pygame.K_LEFT
KEY_RIGHT = pygame.K_RIGHT
KEY_RESTART = pygame.K_r
K_PAUSE = pygame.K_PAUSE# 蛇的默认值
SNAKE_X = 0
SNAKE_Y = 0
SNAKE_BODY_LENGTH = 5
SNAKE_DIRECTION = RIGHT
SNAKE_SPEED = 10
源码地址:https://gitcode.com/stormsha1/games/overview
相关文章:

Python 贪吃蛇
文章目录 效果图:项目目录结构main.pygame/apple.pygame/base.pygame/snake.pyconstant.py 效果图: 项目目录结构 main.py from snake.game.apple import Apple # 导入苹果类 from snake.game.base import * # 导入游戏基类 from snake.game.snake im…...
计算机网络 2.4差错检验与校正
第四节 差错检验与校正 一、认识检验与校正 1.差错形成原因 内部因素(随机错):噪声脉冲、脉动噪声、衰减、延迟失真等。 外部因素(突发错):电磁干扰、太阳噪声、工业噪声等。 2.差错控制编码分类&#…...
uniapp遍历数组对象的常见方法
在 UniApp 中,遍历数组对象的方法与在普通 JavaScript 中是相同的。UniApp 是一个使用 Vue.js 开发所有前端应用的框架,因此你可以使用 Vue.js 和 JavaScript 的语法来遍历数组对象。 以下是一些常见的遍历数组对象的方法: 使用 for 循环 …...

Milvus向量数据库(一)Milvus存储byte[]类型源向量数据
两种路线: 第一种是把byte[]转换为List< float >,然后存储到Milvus的floatVector中第二种是把byte[]转换为ByteBuffer,然后存储到Milvus的BinaryVector中 步骤: 我先用的是第一种,但是在转换float过程中&…...

Jupyter Notebook魔术命令
Jupyter Notebook是一个基于网页的交互式笔记本,支持运行多种编程语言。 Jupyter Notebook 的本质式一个Web应用程序,便于创建和共享文学化程序文档,支持实现代码,数学方程,可视化和markdown。用途包括:数据…...
python基础---生成器
生成器 这个老师的课 这个老师的网页 获取系列有规律但是个数不确定的数据 使用迭代器的时候可以使用一个不会产生异常的迭代器, 实际记录的是生成的数据的方式, 不是实际的数据 使用迭代器的时候这一个规则的改变不方便, 需要加一个专门的方法 还有就是如果需要大量的数据,…...

wangEditor 富文本详解
前言:wangEditor 官网 。本文档讲解 wangEditor 在 vue3 中的使用。 一:快速开始 1. 安装 需要安装 wangeditor/editor、wangeditor/editor-for-vuenext 两个依赖 # 安装 editor npm install wangeditor/editor # or yarn add wangeditor/editor # o…...

文献速递:深度学习医学影像心脏疾病检测与诊断--从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测
Title 题目 Deep Learning Coronary Artery Calcium Scores from SPECT/CT Attenuation Maps Improve Prediction of Major Adverse Cardiac Events 从SPECT/CT衰减图中深度学习冠状动脉钙化评分提高了对重大不良心脏事件的预测 01 文献速递介绍 低剂量非门控CT衰减校正&am…...

Java多线程:常见的线程的创建方法及Thread类详解
目录 一.并发编程相关概念 线程与进程 多线程 Java中线程的状态 二.线程的创建方法 方法一:继承Thread类 方法二:实现Runnable接口 其他方法 三.Thread类详解 Thread常见构造方法 Thread常见属性 Thread常见方法 start() 与 run() sleep(…...

一招搞定生产管理
劳动力成本上升,原材料价格上涨,企业生产成本逐年增加,市场竞争越来越激烈,传统的中小制造企业面临着巨大的挑战。 企业的数字化转型如今成为炙手可热的高频词语,越来越多的中小制造企业已经开始上云,实践SaaS模式的生产管理系统…...

学习CSS3,实现红色心形loading特效
试想一下,如果你的网站在加载过程中,loading图由一个老旧的菊花转动图片,变为一个红色的心形loading特效,那该有多炫酷啊。 目录 实现思路 初始化HTML部分 延迟动画是重点 设定动画效果 完整源代码 最后 实现思路 每个…...

深度学习之基于Matlab神经网络的活体人脸和视频人脸识别系统
欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 人脸识别技术作为生物识别技术的一种,近年来得到了广泛的关注和应用。与传统的身份认证方…...

充电桩测试:负载箱的重要性
随着电动汽车的普及,充电桩的需求也在不断增加。为了保证充电桩的安全、稳定和高效运行,对其进行严格的测试是必不可少的。在充电桩测试过程中,负载箱作为一种重要的测试设备,对于评估充电桩的性能和可靠性具有重要意义。 负载箱可…...
贪心算法、Dijkstra和A*类路径搜索算法
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言系列文章目录前言1.贪心算法、Dijkstra和A*类路径搜索算法(1)greedy best frist search贪心算法(仅仅考虑启发式代价)1.核心思想2.构造启发式猜…...

Debian是什么?有哪些常用命令
目录 一、Debian是什么? 二、Debian常用命令 三、Debian和CentOS的区别 四、Debian和CentOS的优缺点 五、Debian和CentOS的运用场景 一、Debian是什么? Debian是一种流行的开源Linux操作系统。 Debian是一个以Linux内核为基础的操…...

万兴PDF专家 PDFelement Pro v10.3.8 破姐版!
🧑💻万兴PDF专家 PDFelement Pro v10.3.8 破姐版 (https://docs.qq.com/sheet/DRVVxTHJ3RXJFVHVr)...
Ubuntu22.04 私钥登录
1. 背景 以前一直使用秘钥登录Linux,最近新装了一台Ubuntu 22.04,照旧部署公钥,使用私钥登录,结果SecureCRT 登录没有问题,使用Xshell登录一直报“所选的用户密钥未在远程主机上注册,请再试一次”。然后各种试&#x…...

Java_JVM_JVMs
JVM 官方文档说明文档目录 官方文档 JVM Specification 说明 以Java SE 17为标准 文档目录 2:JVM 结构 class文件数据类型 基本数据类型引用数据类型 运行时数据区 栈帧 其他内容 对象的表示浮点数运算特殊方法 初始化方法【实例、类】多态方法 3ÿ…...

Linux系统编程之基本指令
零、Linux发展史 1、诞生 1991年10月5日,赫尔辛基大学的一名研究生Linus Benedict Torvalds在一个Usenet新闻组 (comp.os.minix)中宣布他编制出了一种类似UNIX的小操作系统,叫Linux。新的操作系统是受到另一个UNIX的小操作系统—…...

[1702]java旅游资源网上填报系统Myeclipse开发mysql数据库web结构java编程计算机网页项目
一、源码特点 java旅游资源网上填报系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...