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

射击游戏demo11

完善地图,加载出装饰品,检测人员与地面的碰撞,检测子弹与岩壁的碰撞,检测手雷与地面的碰撞。

import pygame
import sys
import os
import random
import csv
# 初始化Pygame
pygame.init()# 屏幕宽度
SCREEN_WIDTH = 1200
# 屏幕高度,为屏幕宽度的0.5倍
SCREEN_HEIGHT = int(SCREEN_WIDTH * 0.5)# 创建一个指定尺寸的显示表面对象
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
# 设置窗口标题
pygame.display.set_caption('射击游戏')# 创建一个新的时钟对象来跟踪时间
clock = pygame.time.Clock()
# FPS(每秒帧数):帧率是指一秒内出现的帧数。
# 频率,即连续图像被捕获或显示的频率。
# 设置帧率
FPS = 60# 定义游戏变量
# 重力值
GRAVITY = 0.75
# 地图的行数
ROWS = 16
# 地图的列数
COLS = 150
# 每个图块的大小,通过屏幕高度除以行数得到
TILE_SIZE = SCREEN_HEIGHT // ROWS
# 图块的类型数量
TILE_TYPES = 21
# 当前关卡数
level = 1# 定义玩家动作变量
# 是否向左移动
moving_left = False
# 是否向右移动
moving_right = False
# 是否射击
shoot = False
# 是否投掷手雷
grenade = False
# 手雷是否已投掷
grenade_thrown = False# 将图块存储在列表中
img_list = []
for x in range(TILE_TYPES):# 加载图块图像img = pygame.image.load(f'img/tile/{x}.png')# 缩放图块图像img = pygame.transform.scale(img, (TILE_SIZE, TILE_SIZE))img_list.append(img)# 子弹图像
bullet_img = pygame.image.load('img/icons/bullet.png').convert_alpha()
# 手雷图像
grenade_img = pygame.image.load('img/icons/grenade.png').convert_alpha()
# 生命箱子图像
health_box_img = pygame.image.load('img/icons/health_box.png').convert_alpha()
# 弹药箱子图像
ammo_box_img = pygame.image.load('img/icons/ammo_box.png').convert_alpha()
# 手雷箱子图像
grenade_box_img = pygame.image.load('img/icons/grenade_box.png').convert_alpha()# 物品箱子字典
item_boxes = {'Health': health_box_img,'Ammo': ammo_box_img,'Grenade': grenade_box_img
}# 定义颜色
# 背景颜色
BG = (144, 201, 120)
# 红色
RED = (255, 0, 0)
# 白色
WHITE = (255, 255, 255)
# 绿色
GREEN = (0, 255, 0)
# 黑色
BLACK = (0, 0, 0)
# 粉色
PINK = (235, 65, 54)# 定义字体
# 使用Futura字体,字号为30
font = pygame.font.SysFont('Futura', 30)def draw_text(text, font, text_col, x, y):# 创建一个新图像(表面),在上面渲染指定的文本img = font.render(text, True, text_col)# 将图像绘制到屏幕上screen.blit(img, (x, y))def draw_bg():# 用背景颜色填充屏幕screen.fill(BG)#pygame.draw.line(screen,RED,(0,300),(SCREEN_WIDTH,300))class Soldier(pygame.sprite.Sprite):def __init__(self,char_type, x,y,scale,speed,ammo,grenades):super().__init__()self.alive = True  # 角色是否存活self.char_type=char_typeself.speed = speed  # 移动速度self.ammo = ammo  # 当前弹药量self.start_ammo = ammo  # 初始弹药量self.shoot_cooldown = 0  # 射击冷却计数器self.grenades = grenades  # 手雷数量self.health = 100  # 当前生命值self.max_health = self.health  # 最大生命值self.direction = 1  # 方向(1为右,-1为左)self.vel_y = 0  # 垂直速度self.jump = False  # 跳跃状态self.in_air = True  # 是否在空中self.flip = False  # 是否翻转图像(左右方向)self.animation_list = []  # 动画帧列表self.frame_index = 0  # 当前动画帧索引self.action = 0  # 当前动作(0:闲置, 1:奔跑, 2:跳跃, 3:死亡)self.update_time = pygame.time.get_ticks()  # 上次更新时间# 专用变量self.move_counter = 0  # 移动计数器self.vision = pygame.Rect(0, 0, 150, 20)  # 视野范围self.idling = False  # 是否处于闲置状态self.idling_counter = 0  # 闲置计时器# 加载角色所有动画animation_types = ['Idle', 'Run', 'Jump', 'Death']  # 定义所有动画类型for animation in animation_types:  # 遍历每种动画类型temp_list = []  # 创建一个临时列表用于存储当前动画类型的帧# 计算当前动画类型的帧数num_of_frames = len(os.listdir(f'img/{self.char_type}/{animation}'))for i in range(num_of_frames):  # 遍历每帧# 加载并缩放图像img = pygame.image.load(f'img/{self.char_type}/{animation}/{i}.png').convert_alpha()img = pygame.transform.scale(img, (int(img.get_width() * scale), int(img.get_height() * scale)))temp_list.append(img)  # 将处理后的图像添加到临时列表self.animation_list.append(temp_list)  # 将当前动画类型的全部帧添加到动画列表# 设置初始图像和碰撞矩形self.image = self.animation_list[self.action][self.frame_index]self.rect = self.image.get_rect()self.rect.center = (x, y)self.width = self.image.get_width()self.height = self.image.get_height()def update(self):# 更新动画和检查存活状态self.update_animation()self.check_alive()# 更新射击冷却if self.shoot_cooldown > 0:self.shoot_cooldown -= 1def move(self, moving_left, moving_right):# 初始化移动变量screen_scroll = 0dx = 0dy = 0# 处理水平移动if moving_left:dx = -self.speedself.flip = Trueself.direction = -1if moving_right:dx = self.speedself.flip = Falseself.direction = 1# 处理跳跃if self.jump and not self.in_air:self.vel_y = -11self.jump = Falseself.in_air = True# 应用重力self.vel_y += GRAVITYif self.vel_y > 10:  # 限制最大下落速度self.vel_y=10dy += self.vel_y# 碰撞检测 - 障碍物for tile in world.obstacle_list:# X方向碰撞if tile[1].colliderect(self.rect.x + dx, self.rect.y, self.width, self.height):dx = 0# 如果是敌人碰到墙,转向if self.char_type == 'enemy':self.direction *= -1self.move_counter = 0# Y方向碰撞if tile[1].colliderect(self.rect.x, self.rect.y + dy, self.width, self.height):# 跳跃时碰到天花板if self.vel_y < 0:self.vel_y = 0dy = tile[1].bottom - self.rect.top# 下落时碰到地面elif self.vel_y >= 0:self.vel_y = 0self.in_air = Falsedy = tile[1].top - self.rect.bottom# 更新位置self.rect.x += dxself.rect.y += dydef shoot(self):# 射击逻辑:检查冷却和弹药if self.shoot_cooldown == 0 and self.ammo > 0:self.shoot_cooldown = 20  # 设置冷却时间# 创建子弹对象(从角色中心前方发射)bullet = Bullet(self.rect.centerx + (0.75 * self.rect.size[0] * self.direction), self.rect.centery, self.direction)bullet_group.add(bullet)self.ammo -= 1  # 消耗弹药def ai(self):# AI行为逻辑if self.alive and player.alive:# 随机进入闲置状态if not self.idling and random.randint(1, 50) == 1:self.update_action(0)  # 0: 闲置self.idling = Trueself.idling_counter = 50# 检测是否看到玩家if self.vision.colliderect(player.rect):self.update_action(0)  # 停止移动,转为闲置self.shoot()  # 向玩家射击else:if not self.idling:# 左右移动逻辑ai_moving_right = self.direction == 1ai_moving_left = not ai_moving_rightself.move(ai_moving_left, ai_moving_right)self.update_action(1)  # 1: 奔跑# 更新视野范围self.move_counter += 1self.vision.center = (self.rect.centerx + 75 * self.direction, self.rect.centery)# 到达边界后转向if self.move_counter > TILE_SIZE:self.direction *= -1self.move_counter = 0else:# 闲置计时器递减self.idling_counter -= 1if self.idling_counter <= 0:self.idling = Falsedef update_animation(self):# 动画更新逻辑ANIMATION_COOLDOWN = 100  # 动画帧间隔(毫秒)# 更新当前帧self.image = self.animation_list[self.action][self.frame_index]# 检查是否需要更新帧if pygame.time.get_ticks() - self.update_time > ANIMATION_COOLDOWN:self.update_time = pygame.time.get_ticks()self.frame_index += 1# 检查是否需要重置动画if self.frame_index >= len(self.animation_list[self.action]):if self.action == 3:  # 死亡动画停在最后一帧self.frame_index = len(self.animation_list[self.action]) - 1else:self.frame_index = 0def update_action(self, new_action):# 切换动作状态if new_action != self.action:self.action = new_action# 重置动画帧self.frame_index = 0self.update_time = pygame.time.get_ticks()def check_alive(self):# 检查是否存活if self.health <= 0:self.health = 0self.speed = 0self.alive = Falseself.update_action(3)  # 3: 死亡动画def draw(self):# 绘制角色到屏幕flipped_image = pygame.transform.flip(self.image, self.flip, False)screen.blit(flipped_image, self.rect)class ItemBox(pygame.sprite.Sprite):def __init__(self, item_type, x, y):pygame.sprite.Sprite.__init__(self)self.item_type = item_typeself.image = item_boxes[self.item_type]self.rect = self.image.get_rect()self.rect.midtop = (x + TILE_SIZE // 2, y + (TILE_SIZE - self.image.get_height()))def update(self):# 检查玩家是否捡起了箱子if pygame.sprite.collide_rect(self, player):# 检查是哪种箱子if self.item_type == 'Health':player.health += 25if player.health > player.max_health:player.health = player.max_healthelif self.item_type == 'Ammo':player.ammo += 15elif self.item_type == 'Grenade':player.grenades += 3# 删除物品箱self.kill()class HealthBar():def __init__(self, x, y, health, max_health):self.x = xself.y = yself.health = healthself.max_health = max_healthdef draw(self, health):# 更新当前生命值self.health = health# 计算生命值比例ratio = self.health / self.max_healthpygame.draw.rect(screen, BLACK, (self.x - 2, self.y - 2, 154, 24))pygame.draw.rect(screen, RED, (self.x, self.y, 150, 20))pygame.draw.rect(screen, GREEN, (self.x, self.y, 150 * ratio, 20))class Bullet(pygame.sprite.Sprite):def __init__(self, x, y, direction):# 初始化子弹精灵pygame.sprite.Sprite.__init__(self)self.speed = 10  # 子弹移动速度self.image = bullet_img  # 子弹图像self.rect = self.image.get_rect()  # 获取图像矩形区域self.rect.center = (x, y)  # 设置子弹初始位置self.direction = direction  # 子弹方向(1为右,-1为左)def update(self):# 移动子弹self.rect.x += (self.direction * self.speed) # 检查子弹是否超出屏幕边界if self.rect.right < 0 or self.rect.left > SCREEN_WIDTH:self.kill()  # 超出屏幕则销毁子弹# 检查子弹与地图障碍物的碰撞for tile in world.obstacle_list:if tile[1].colliderect(self.rect):self.kill()  # 碰到障碍物则销毁子弹# 检查子弹与玩家的碰撞if pygame.sprite.spritecollide(player, bullet_group, False):if player.alive:player.health -= 5  # 玩家受伤self.kill()  # 销毁子弹for enemy in enemy_group:        if pygame.sprite.spritecollide(enemy, bullet_group, False):if enemy.alive:enemy.health -= 25  # 敌人受伤self.kill()  # 销毁子弹class Grenade(pygame.sprite.Sprite):def __init__(self, x, y, direction):# 初始化手雷精灵pygame.sprite.Sprite.__init__(self)self.timer = 100  # 手雷爆炸计时器self.vel_y = -11  # 手雷垂直初速度(用于抛射效果)self.speed = 7  # 手雷水平移动速度self.image = grenade_img  # 手雷图像self.rect = self.image.get_rect()  # 获取图像矩形区域self.rect.center = (x, y)  # 设置手雷初始位置self.width = self.image.get_width()  # 手雷宽度self.height = self.image.get_height()  # 手雷高度self.direction = direction  # 手雷投掷方向(1为右,-1为左)def update(self):# 应用重力影响手雷垂直运动self.vel_y += GRAVITYdx = self.direction * self.speed  # 水平移动距离dy = self.vel_y  # 垂直移动距离# 检查与地图障碍物的碰撞for tile in world.obstacle_list:# 水平方向碰撞检测if tile[1].colliderect(self.rect.x + dx, self.rect.y, self.width, self.height):self.direction *= -1  # 碰到墙壁反弹dx = self.direction * self.speed# 垂直方向碰撞检测if tile[1].colliderect(self.rect.x, self.rect.y + dy, self.width, self.height):self.speed = 0  # 碰撞后停止水平移动# 向上投掷碰到天花板if self.vel_y < 0:self.vel_y = 0dy = tile[1].bottom - self.rect.top# 下落时碰到地面elif self.vel_y >= 0:self.vel_y = 0dy = tile[1].top - self.rect.bottom# 更新手雷位置self.rect.x += dxself.rect.y += dy# 手雷计时器倒计时self.timer -= 1if self.timer <= 0:self.kill()  # 销毁手雷# 创建爆炸效果explosion = Explosion(self.rect.x, self.rect.y, 0.8)explosion_group.add(explosion)# 对手雷一定范围内的角色造成伤害if abs(self.rect.centerx - player.rect.centerx) < TILE_SIZE * 2 and \abs(self.rect.centery - player.rect.centery) < TILE_SIZE * 2:player.health -= 50  # 玩家受伤# 对敌人造成伤害for enemy in enemy_group:if abs(self.rect.centerx - enemy.rect.centerx) < TILE_SIZE * 2 and \abs(self.rect.centery - enemy.rect.centery) < TILE_SIZE * 2:enemy.health -= 50  # 敌人受伤class World():def __init__(self):self.obstacle_list = []#障碍列表def process_data(self, data):self.level_length = len(data[0])# 遍历 level_data.csv 文件中的每个值,并创建一个表面矩阵for y, row in enumerate(data):for x, tile in enumerate(row):if tile >= 0:img = img_list[tile]img_rect = img.get_rect()img_rect.x = x * TILE_SIZEimg_rect.y = y * TILE_SIZEtile_data = (img, img_rect)if tile >= 0 and tile <= 8:self.obstacle_list.append(tile_data)elif tile >= 9 and tile <= 10:water = Water(img, x * TILE_SIZE, y * TILE_SIZE)water_group.add(water)elif tile >= 11 and tile <= 14:decoration = Decoration(img, x * TILE_SIZE, y * TILE_SIZE)decoration_group.add(decoration)elif tile == 15:  # 创建玩家player = Soldier('player', x * TILE_SIZE, y * TILE_SIZE, 1.65, 5, 20, 5)health_bar = HealthBar(10, 10, player.health, player.health)elif tile == 16:  # 创建敌人enemy = Soldier('enemy', x * TILE_SIZE, y * TILE_SIZE, 1.65, 2, 20, 0)enemy_group.add(enemy)elif tile == 17:  # 创建弹药箱item_box = ItemBox('Ammo', x * TILE_SIZE, y * TILE_SIZE)item_box_group.add(item_box)elif tile == 18:  # 创建手雷箱item_box = ItemBox('Grenade', x * TILE_SIZE, y * TILE_SIZE)item_box_group.add(item_box)elif tile == 19:  # 创建生命箱item_box = ItemBox('Health', x * TILE_SIZE, y * TILE_SIZE)item_box_group.add(item_box)elif tile == 20:  # 创建出口exit = Exit(img, x * TILE_SIZE, y * TILE_SIZE)exit_group.add(exit)return player, health_bardef draw(self):for tile in self.obstacle_list:  # tile = (图像, 矩形) ; rect = (左, 上, 宽, 高)screen.blit(tile[0], tile[1])class Decoration(pygame.sprite.Sprite):def __init__(self, img, x, y):pygame.sprite.Sprite.__init__(self)  # pygame.sprite.Sprite = 可见游戏对象的简单基类self.image = imgself.rect = self.image.get_rect()self.rect.midtop = (x + TILE_SIZE // 2, y + (TILE_SIZE - self.image.get_height()))class Water(pygame.sprite.Sprite):def __init__(self, img, x, y):pygame.sprite.Sprite.__init__(self)self.image = imgself.rect = self.image.get_rect()self.rect.midtop = (x + TILE_SIZE // 2, y + (TILE_SIZE - self.image.get_height()))class Exit(pygame.sprite.Sprite):def __init__(self, img, x, y):pygame.sprite.Sprite.__init__(self)self.image = imgself.rect = self.image.get_rect()self.rect.midtop = (x + TILE_SIZE // 2, y + (TILE_SIZE - self.image.get_height()))class Explosion(pygame.sprite.Sprite):def __init__(self, x, y, scale):pygame.sprite.Sprite.__init__(self)self.images = []# 加载爆炸动画的5帧图像for num in range(1, 6):img = pygame.image.load(f'img/explosion/exp{num}.png').convert_alpha()img = pygame.transform.scale(img, (int(img.get_width() * scale), int(img.get_height() * scale)))self.images.append(img)self.frame_index = 0  # 当前动画帧索引self.image = self.images[self.frame_index]  # 当前显示的图像self.rect = self.image.get_rect()  # 获取图像的矩形区域self.rect.center = (x, y)  # 设置爆炸位置self.counter = 0  # 帧计数器def update(self):EXPLOSION_SPEED = 4  # 爆炸动画速度(数值越小速度越快)# 更新爆炸动画self.counter += 1if self.counter >= EXPLOSION_SPEED:self.counter = 0self.frame_index += 1# 如果动画播放完毕,则删除爆炸效果if self.frame_index >= len(self.images):self.kill()else:self.image = self.images[self.frame_index]# 创建精灵组
enemy_group = pygame.sprite.Group()  # 敌人群组
bullet_group = pygame.sprite.Group()  # 子弹群组
grenade_group = pygame.sprite.Group()  # 手雷群组
explosion_group = pygame.sprite.Group()  # 爆炸效果群组
item_box_group = pygame.sprite.Group()  # 物品箱子群组
decoration_group = pygame.sprite.Group()  # 装饰群组
water_group = pygame.sprite.Group()  # 水群组
exit_group = pygame.sprite.Group()  # 出口群组#item_box=ItemBox("Health",100,260)
#item_box_group.add(item_box)
#item_box=ItemBox("Ammo",400,260)
#item_box_group.add(item_box)
#item_box=ItemBox("Grenade",500,260)
#item_box_group.add(item_box)#player =Soldier("player",200,200,1.65,5,10,5)
#health_bar=HealthBar(10,10,player.health,player.health)
#enemy =Soldier("enemy",400,270,1.65,5,30,0)
#enemy1 =Soldier("enemy",600,270,1.65,5,30,0)
#enemy_group.add(enemy)
#enemy_group.add(enemy1)# 创建空的地图数据列表
world_data = []
for row in range(ROWS):r = [-1] * COLSworld_data.append(r)# 加载关卡数据并创建游戏世界
with open(f'level{level}_data.csv', newline='') as csvfile:reader = csv.reader(csvfile, delimiter=',')for x, row in enumerate(reader):for y, tile in enumerate(row):world_data[x][y] = int(tile)world = World()
player, health_bar = world.process_data(world_data)run = True
while run:  # 游戏主循环clock.tick(FPS)  # 设置帧率draw_bg()world.draw()# 显示玩家生命值health_bar.draw(player.health) # 显示弹药数量draw_text('AMMO: ', font, WHITE, 10, 35)for x in range(player.ammo):screen.blit(bullet_img, (90 + (x * 10), 40))# 显示手雷数量draw_text('GRENADES: ', font, WHITE, 10, 60)for x in range(player.grenades):screen.blit(grenade_img, (135 + (x * 15), 60))player.update()player.draw()for enemy in enemy_group:enemy.ai()enemy.update()  # 更新敌人状态enemy.draw()  # 绘制敌人# 更新并绘制各个群组bullet_group.update()grenade_group.update()explosion_group.update()item_box_group.update()decoration_group.update()water_group.update()exit_group.update()bullet_group.draw(screen)grenade_group.draw(screen)explosion_group.draw(screen)item_box_group.draw(screen)decoration_group.draw(screen)water_group.draw(screen)exit_group.draw(screen)# 更新玩家动作if player.alive:# 射击子弹if shoot:player.shoot()# 投掷手雷elif grenade and grenade_thrown == False and player.grenades > 0:grenade = Grenade(player.rect.centerx + (0.5 * player.rect.size[0] * player.direction),player.rect.top, player.direction)grenade_group.add(grenade)# 减少手雷数量player.grenades -= 1grenade_thrown = Trueif player.in_air:player.update_action(2)  # 2: 跳跃动作elif moving_left or moving_right:player.update_action(1)  # 1: 奔跑动作else:player.update_action(0)  # 0: 闲置动作player.move(moving_left, moving_right)  # 移动玩家for event in pygame.event.get():# 处理退出游戏事件if event.type == pygame.QUIT:run = Falsesys.exit()# 处理键盘按下事件if event.type == pygame.KEYDOWN:if event.key == pygame.K_a or event.key == pygame.K_LEFT:  # 按下A键或左键 => 向左移动moving_left = Trueif event.key == pygame.K_d or event.key == pygame.K_RIGHT:  # 按下D键或右键 => 向右移动moving_right = Trueif event.key == pygame.K_SPACE:  # 按下空格键 => 射击shoot = Trueif event.key == pygame.K_q or event.key == pygame.K_g:  # 按下Q键或G键 => 投掷手雷grenade = Trueif (event.key == pygame.K_w or event.key == pygame.K_UP) and player.alive:  # 按下W键或上键且玩家存活 => 跳跃player.jump = Trueif event.key == pygame.K_ESCAPE:  # 按下ESC键 => 关闭窗口run = False# 处理键盘释放事件if event.type == pygame.KEYUP:if event.key == pygame.K_a or event.key == pygame.K_LEFT:moving_left = Falseif event.key == pygame.K_d or event.key == pygame.K_RIGHT:moving_right = Falseif event.key == pygame.K_SPACE:shoot = Falseif event.key == pygame.K_q or event.key == pygame.K_g:grenade = Falsegrenade_thrown = Falsepygame.display.update()  # 更新屏幕显示

相关文章:

射击游戏demo11

完善地图&#xff0c;加载出装饰品&#xff0c;检测人员与地面的碰撞&#xff0c;检测子弹与岩壁的碰撞&#xff0c;检测手雷与地面的碰撞。 import pygame import sys import os import random import csv # 初始化Pygame pygame.init()# 屏幕宽度 SCREEN_WIDTH 1200 # 屏幕高…...

多智能体Multi-Agent应用实战与原理分析

一:Agent 与传统工具调用的对比 在当今的开发环境中,Agent 的出现极大地简化了工作流程。其底层主要基于提示词、模型和工具。用户只需向 Agent 输入需求,Agent 便会自动分析需求,并利用工具获取最终答案。而传统方式下,若没有 Agent,我们则需要手动编码来执行工具,还要…...

专项智能练习(定义判断)_DA_01

1. 单选题 热传导是介质内无宏观运动时的传热现象&#xff0c;其在固体、液体和气体中均可发生。但严格而言&#xff0c;只有在固体中才是纯粹的热传导&#xff0c;在流体&#xff08;泛指液体和气体&#xff09;中又是另外一种情况&#xff0c;流体即使处于静止状态&#xff0…...

关于NLP自然语言处理的简单总结

参考&#xff1a; 什么是自然语言处理&#xff1f;看这篇文章就够了&#xff01; - 知乎 (zhihu.com) 所谓自然语言理解&#xff0c;就是研究如何让机器能够理解我们人类的语言并给出一些回应。 自然语言处理&#xff08;Natural Language Processing&#xff0c;NLP&#xff0…...

SLAM定位与地图构建

SLAM介绍 SLAM全称Simultaneous Localization And Mapping&#xff0c;中文名称同时定位与地图构建。旨在让移动设备在未知环境中同时完成以下两个任务&#xff08;定位需要地图&#xff0c;而建图又依赖定位信息&#xff0c;两者互为依赖&#xff09;&#xff1a; 定位&#…...

REST架构风格介绍

一.REST&#xff08;表述性状态转移&#xff09; 1.定义 REST&#xff08;Representational State Transfer&#xff09;是由 Roy Fielding 在 2000 年提出的一种软件架构风格&#xff0c;用于设计网络应用的通信模式。它基于 HTTP 协议&#xff0c;强调通过统一的接口&#…...

前端流行框架Vue3教程:16. 组件事件配合`v-model`使用

组件事件配合v-model使用 如果是用户输入&#xff0c;我们希望在获取数据的同时发送数据配合v-model 来使用&#xff0c;帮助理解组件间的通信和数据绑定。 &#x1f9e9; 第一步&#xff1a;创建子组件&#xff08;SearchComponent.vue&#xff09; 这个组件用于处理用户的搜…...

5月15日day26打卡

函数专题1 知识点回顾&#xff1a; 函数的定义变量作用域&#xff1a;局部变量和全局变量函数的参数类型&#xff1a;位置参数、默认参数、不定参数传递参数的手段&#xff1a;关键词参数传递参数的顺序&#xff1a;同时出现三种参数类型时 作业&#xff1a; 题目1&#xff1a;…...

Java中的深拷贝与浅拷贝

什么是拷贝 在Java中&#xff0c;拷贝是指创建一个对象的副本。拷贝主要分为两种类型&#xff1a;浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。理解这两种拷贝的区别对于编写正确的Java程序非常重要&#xff0c;特别是在处理对象引用时。 浅拷贝(Shallow Copy) 浅拷贝是指创建…...

springboot AOP中,通过解析SpEL 表达式动态获取参数值

切面注解 import com.bn.document.constants.FmDeptCatalogueConstants;import java.lang.annotation.*;Target(ElementType.METHOD) Retention(RetentionPolicy.RUNTIME) public interface FmDeptCatalogueAopAnnotation {/*** 权限类型*/FmDeptCatalogueConstants value();/…...

【论信息系统项目的合同管理】

论信息系统项目的合同管理 论文要求写作要点正文前言一、合同的签订管理二、合同履行管理三、合同变更管理四、合同档案管理五、合同违约索赔管理结语 论文要求 项目合同管理通过对项目合同的全生命周期进行管理&#xff0c;来回避和减轻可识别的项目风险。 请以“论信息系统项…...

redis持久化方式

一、RDB redis database&#xff1a;快照&#xff0c;某一时刻将内存中的数据&#xff0c;写入磁盘中生成1个dump.rdb文件RDB的触发方式&#xff1a; 手动触发&#xff1a;save&#xff08;阻塞主进程&#xff0c;阻塞其它指令&#xff0c;保证数据一致性&#xff09;、bgsave…...

free void* 指令

https://stackoverflow.com/questions/2182103/is-it-ok-to-free-void free(ptr) 仅释放指针指向的内存&#xff0c;不会修改指针变量本身的值。调用后&#xff0c;ptr 仍然指向原来的地址&#xff08;称为 "悬空指针"&#xff09;&#xff0c;但该地址对应的内存已…...

ADS1220高精度ADC(TI)——应用 源码

文章目录 德州仪器ADS1220概述资料引脚&封装布线寄存器配置寄存器0&#xff08;00h&#xff09;配置寄存器1&#xff08;01h&#xff09;配置寄存器2&#xff08;02h&#xff09;配置寄存器3&#xff08;03h&#xff09; 连续转换流程驱动源码ads1220.cads1220.h 德州仪器A…...

mysql-Java手写分布式事物提交流程

准备 innodb存储引擎开启支持分布式事务 set global innodb_support_axon分布式的流程 详细流程&#xff1a; XA START ‘a’; 作用&#xff1a;开始一个新的XA事务&#xff0c;并分配一个唯一的事务ID ‘a’。 说明&#xff1a;在这个命令之后&#xff0c;所有后续的SQL操…...

红黑树:数据世界的平衡守护者

在 C 算法的神秘森林里&#xff0c;红黑树是一棵充满智慧的 “魔法树”。它既不像普通二叉搜索树那样容易失衡&#xff0c;也不像 AVL 树对平衡要求那么苛刻。作为 C 算法小白&#xff0c;今天就和大家一起深入探索红黑树的奥秘&#xff0c;看看它是如何成为数据世界的平衡守护…...

哈夫曼树完全解析:从原理到应用

目录 一、核心概念 二、构造全流程解析 三、编码生成机制 四、C语言实现关键代码 五、核心特性深度解读 六、现代应用场景 七、压缩实战演示 一、核心概念 哈夫曼树&#xff08;最优二叉树&#xff09;是带权路径长度&#xff08;WPL&#xff09;最短的树形结构&#x…...

如何在 Windows 命令提示符中创建多个文件夹和多个文件

如何在 Windows 命令提示符中创建多个文件夹和多个文件 虽然大多数用户习惯使用 Windows 图形界面来创建文件夹&#xff0c;但如果你需要一次性创建多个文件夹或文件&#xff0c;如同在类Unix系统中可以使用mkdir和touch命令一样&#xff0c;windows下也有创建目录和文件的对应…...

【Java】Spring的声明事务在多线程场景中失效问题。

大家都知道Spring的声明式事务在多线程当中会失效&#xff0c;来看一下如下案例。 按照如下方式&#xff0c;b()方法抛出异常,由于父子线程导致事务失效&#xff0c;a()会成功插入,但是b()不会。 因此成功插入一条数据&#xff0c;事务失效。 Component public class UserServ…...

多平台图标设计与管理的终极解决方案

IconWorkshop Pro 是一款由Axialis团队开发的专业图标设计与制作软件&#xff0c;专注于为设计师、开发者及企业用户提供高效且灵活的图标创作解决方案。该软件凭借其强大的功能与跨平台适配性&#xff0c;成为Windows、macOS、iOS、Android等多系统图标设计的首选工具之一。 …...

【搭建Node-RED + MQTT Broker实现AI大模型交互】

搭建Node-RED MQTT Broker实现AI大模型交互 搭建Node-RED MQTT Broker实现AI大模型交互一、系统架构二、环境准备与安装1. 安装Node.js2. 安装Mosquitto MQTT Broker3. 配置Mosquitto4. 安装Node-RED5. 配置Node-RED监听所有网络接口6. 启动Node-RED 三、Node-RED流程配置1. …...

小结: js 在浏览器执行原理

浏览器多进程与多线程 现代浏览器的标签环境隔离主要通过多进程架构和多线程机制实现&#xff0c;以确保安全、性能和稳定性。以下是浏览器实现标签环境隔离的多进程和多线程交互架构的详细解析&#xff1a; ------------------- ------------------- -----------…...

C++核心编程--2 引用

引用就是给变量起别名&#xff0c;操作引用就等于操作原始变量。 2.1 引用基本用法 int var 10; int & r_var var; 2.2 注意事项 声明时必须初始化不允许更改引用指向的原始变量 2.3 引用作为函数参数传递 简化指针修饰函数参数 2.4 引用作为函数返回值 不要返回…...

音频/AI/BLE/WIFI/玩具/商业等方向的论坛网站总结

我爱音频网 我爱音频网 - 我们只谈音频&#xff0c;丰富的TWS真无线蓝牙耳机拆解报告 (52audio.com) 中国人工智能学会 中国人工智能学会 (caai.cn) AIIA人工智能网 https://www.aiiaw.com/ 世界人工智能论坛 世界人工智能论坛 - (amtbbs.org) 36氪 36氪_让一部分人先…...

告别碎片化!MCP 带来 AI Agent 开发生态的革命性突破

引言&#xff1a; 在当今的智能客服系统开发中&#xff0c;开发者常常面临一个棘手的挑战&#xff1a;需要整合用户的 CRM 数据、知识库和实时聊天记录。然而&#xff0c;由于缺乏统一的标准&#xff0c;每个团队都不得不手动实现这些集成。这不仅延长了开发周期&#xff0c;还…...

centos7部署mysql5.7

1.下载mysql的官方yum源 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm2.安装yum源 yum -y install mysql57-community-release-el7-11.noarch.rpm3.安装秘钥文件 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-20224.安装mysql5.7…...

linux dbus

Linux D-Bus(Desktop Bus)是一种进程间通信(IPC)机制,主要用于Linux桌面环境和系统服务之间的消息传递。它允许不同的应用程序或系统组件以高效、安全的方式相互通信,是现代Linux桌面(如GNOME、KDE)的核心基础设施之一。 1. D-Bus 的核心概念 消息总线(Message Bus):…...

计量——异方差的检验及其修正

目录 1.异方差的检验 1 BP检验 2white检验 2.异方差的修正 1.异方差的检验 1 BP检验 选择检验方法&#xff1a;BP BP检验的实际步骤&#xff08;非机器&#xff09;&#xff1a; 1.y对所有x进行回归&#xff0c;得到残差u。计算残差的平方u^2 2.u^2对所有x进行回归&#…...

操作系统学习笔记第3章 内存管理(灰灰题库)

1. 单选题 某页式存储管理系统中&#xff0c;主存为 128KB&#xff0c;分成 32 块&#xff0c;块号为 0、1、2、3、…、31。某作业有 5 块&#xff0c;其页号为 0、1、2、3、4&#xff0c;被分别装入主存的 3、8、4、6、9 块中。有一逻辑地址为 [3, 70]&#xff08;其中方括号中…...

vue3项目中使用CanvasEditor开箱即用(组件的形式,组件封装好了)

canvas-editor-vue 这是canvas-editor项目的vue版本,我封装成组建了,当然了这是个已经把canvas-editor封装好的的Vue项目 项目地址GitHub地址:GitHub - aini-aini/canvas-editor-vue: this is a project than can be used in vue project as Componentthis is a project than…...

人体肢体工作识别-一步几个脚印从头设计数字生命——仙盟创梦IDE

人体肢体识别是借助计算机视觉、传感器等技术&#xff0c;对人体各肢体的位置、动作、姿态等进行检测与分析的技术。其在医疗健康、智能交互、运动训练、安全监控等多个领域具有重要价值&#xff0c; 示例代码 import cv2 import mediapipe as mp import numpy as np import c…...

【重磅】配电网智能软开关和储能联合规划

目录 1 主要内容 目标函数 数据说明 节点系统图 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现《具有源荷不平衡特性的配电网智能软开关和储能联合规划》部分模型&#xff0c;未考虑聚类分析和分布鲁棒部分&#xff0c;就智能软开关和储能联合规划部分进行了…...

实验6 电子邮件

实验6 电子邮件 1、实验目的 理解电子邮件系统基本结构 理解客户端和服务器端&#xff0c;以及服务器之间的通信 分析理解SMTP&#xff0c;POP3协议 2、实验环境 硬件要求&#xff1a;阿里云云主机ECS 一台。 软件要求&#xff1a;Linux/ Windows 操作系统 3、实验内容…...

NHANES指标推荐:OBS

文章题目&#xff1a;Association between oxidative balance score and all-cause and cancer-specific mortality among cancer survivors DOI&#xff1a;10.3389/fimmu.2025.1541675 中文标题&#xff1a;癌症幸存者氧化平衡评分与全因死亡率和癌症特异性死亡率之间的关联 …...

python-修改图片背景色

在Python中&#xff0c;可以使用图像处理库&#xff08;如OpenCV或Pillow&#xff09;来修改图片的背景色。通常&#xff0c;修改背景色的流程包括以下步骤&#xff1a; 1、对图片进行分割&#xff0c;识别前景和背景。 2、对背景区域进行颜色替换。 下面是两种实现方法&#x…...

数据结构与算法--顺序表--单链表

一 顺序表 需要指向存储位置的基地址分配一段连续的内存用length记录实际的元素的个数&#xff0c;也即顺序表的长度&#xff0c;因为顺序表是允许删除和插入元素的不需要定义数组 1.1 普通结构体数组实现版本&#xff0c;实现白色的点以一定的步长移除画面&#xff0c;大量fo…...

MATLAB安装全攻略:常见问题与解决方案

MATLAB安装常见问题与解决方案 一、系统兼容性验证 安装前需确认操作系统满足MATLAB版本要求&#xff1a; Windows 10版本1903及以上&#xff08;64位&#xff09;macOS Monterey 12.6及以上Ubuntu 22.04 LTS及以上 验证命令示例&#xff1a; # Linux系统验证 lsb_release…...

constexpr 关键字的意义(入门)

author: hjjdebug date: 2025年 05月 15日 星期四 16:03:33 CST description: constexpr 关键字的意义(入门) constexpr 是c11 引入的一个关键字, 代表了一种属性. 文章目录 1. constexpr 修饰的变量, 在编译期间就可以得到其数值.2. constexpr 修饰的函数, 可以在编译期间被调…...

aptitude 深度教程:从基础到生产实践

目录 一、aptitude 基础:核心概念与环境准备 1.1 aptitude 是什么? 1.2 安装与环境配置 二、aptitude 核心操作:从命令行到交互式界面 2.1 命令行基础操作 2.2 交互式界面(TUI)入门 三、高级功能:依赖管理与版本控制 3.1 依赖冲突解决实战 3.2 版本锁定与降级 3…...

嵌入式开发学习日志(数据结构--双链表)Day21

一、双链表 1.定义 双向链表是在单链表的每个结点中&#xff0c;再设置一个指向其钱去节点的指针域。 2、声明文件 3、创建表头 4、头插 5、 遍历 6、尾插、 7、指定插 8、查找 9、修改 10.、删除 11、逆序 12、销毁链表 13、main.c 三、扩展&#xff1a;工程管理工具&#…...

抢购Python代码示例与技术解析

引言&#xff1a;抢购系统的技术挑战 在当今电子商务高度发达的时代&#xff0c;抢购活动已成为各大电商平台吸引用户的重要手段。然而&#xff0c;高并发、低延迟的抢购场景对系统设计提出了严峻挑战。本文将提供一个完整的Python抢购代码示例&#xff0c;并深入分析其技术实…...

undefined reference to CPUAllocatorSingleton::instance

它发生的原因是你声明了 CPUAllocatorSingleton 类中的 instance 变量&#xff0c;但没有提供它的定义。 这个错误是链接器无法找到 CPUAllocatorSingleton::instance 的定义。它发生的原因是你声明了 CPUAllocatorSingleton 类中的 instance 变量&#xff0c;但没有提供它的定…...

【c语言】动态内存分配

文章标题 一、为什么要进行动态内存管理二、malloc和free2.1. malloc2.2. free2.3. 举例 三、calloc和realloc3.1. calloc3.2. realloc 四、常见的动态内存错误4.1. 对NULL指针的解引用操作4.2. 对动态开辟空间的越界访问4.3. 对非动态开辟内存使用free释放4.4. 使用free释放⼀…...

深入理解JavaScript中的闭包:原理、应用与常见问题

引言 闭包(Closure)是JavaScript中一个既强大又容易让人困惑的概念。理解闭包对于成为一名优秀的JavaScript开发者至关重要。本文将深入探讨闭包的工作原理、实际应用场景以及常见问题&#xff0c;帮助你彻底掌握这一重要概念。 什么是闭包&#xff1f; 闭包是指那些能够访问…...

IPLOOK | 2025 MVNOs 世界大会:从Wi-Fi通话到卫星覆盖

2025 MVNOs 世界大会于5月12日至14日在奥地利维也纳举行&#xff0c;汇聚了来自50多个国家的550余位行业领袖&#xff0c;共同探讨移动虚拟网络运营商&#xff08;MVNO&#xff09;领域的变革趋势。本届大会聚焦数字化转型、技术创新与战略合作&#xff0c;其中IPLOOK凭借其创新…...

为什么elasticsearch配置文件JVM配置31G最佳

Elasticsearch的JVM堆内存配置为32GB被视为最佳实践&#xff0c;主要基于以下综合技术原理和性能优化考量&#xff1a; 1. ‌JVM指针压缩机制优化内存效率‌ 当堆内存≤32GB时&#xff0c;JVM启用‌对象指针压缩&#xff08;Compressed Ordinary Object Pointers, COOP&#…...

单片机开发软件

目录 纯编码 vscode Ardunio Keil 1. 集成化开发环境&#xff08;IDE&#xff09; 2. 多架构芯片支持 3. 高效的代码生成与优化 4. 强大的调试与仿真功能 5. 丰富的库函数与生态系统 6. 教育与企业级适用性 典型应用场景 半编码半图形化 STM32CUBEIED 1. 图形化配置…...

Java随机生成邀请码 (包含字母大小写+数字)

前言: 目前我们生成的是6位包含数字和大小写字母的随机邀请码, 并且代码中已经有了处理冲突的机制确保了邀请码的唯一性如(①生成随机邀请码后会检查数据库中是否已存在②如果存在冲突,会尝试最多10次重新生成③如果多次尝试仍失败&#xff0c;会使用"U"用户ID派生的…...

mybatis-plus配置逻辑删除

在实体类中标记软删除字段使用注解 TableLogic 标记该字段为软删除字段 import com.baomidou.mybatisplus.annotation.*;public class YourEntity {// ...其他字段TableLogicprivate Integer isDeleted;// getter/setter }yml配置 # 逻辑已删除值 logicDeleteValue: 2 # 逻辑…...

第二十五天打卡

常见报错类型 try-except-else-finally 语句 首先执行try语句&#xff0c;若正确直接执行else语句 若try语句发生错误&#xff0c;则判断错误类型&#xff0c;执行错误类型对应的except语句&#xff0c;不执行else语句 finally语句无条件执行&#xff0c;多用于资源保存&…...