Python实现水果忍者(开源)
一、整体介绍:
1.1 前言:
游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动,优化并增加了一些功能。作为自己Python阶段学习的结束作品,文章最后有源码链接。
1.2 Python主要知识:
(1)面向对象编程
类的定义与实例化、封装、继承(使用 pygame.sprite.Sprite 作为基类)
(2)模块与库
导入标准库(time, math, random)、导入第三方库( pygame)
(3)事件处理
事件监听(pygame.event.get() 处理用户输入和游戏事件)、响应事件(根据不同事件,如关闭窗口、定时器事件,执行相应操作)
(4)图形绘制
图像加载( pygame.image.load() 加载图像)、图像绘制(blit() 方法将图像绘制到窗口上)、图像旋转( pygame.transform.rotate() 旋转图像)
(5)随机数生成
(6)计时与帧率控制
使用 pygame.time.Clock() 控制游戏的帧率
(7)文件操作
使用 open() 读取和写入文本文件,保存和读取最佳分数、逐行读取文件内容并解析数据
(8)碰撞检测
(9)Sprite 和 Group
使用 pygame.sprite.Sprite 创建精灵(如水果、刀光、背景)、使用 pygame.sprite.Group 管理和更新多个精灵,方便批量处理
(10)数学运算
使用三角函数,math.sin() 和 math.cos(),计算水果的抛出轨迹
(11)音频处理
使用 pygame.mixer 播放背景音乐和音效,增强游戏体验
(12)逻辑控制
(13)字体与文本渲染
使用 pygame.font.Font() 创建字体对象,并使用 render() 方法渲染文本以显示分数和信息
(14)参数传递与返回值
1.3 游戏素材
二、完善功能:
(1)优化游戏参数
例如:首页旋转圆环速度,水果上抛高度等,使游戏体验更加平滑。
(2)禅宗模式倒计时
禅宗模式在游戏右上方增加了时间倒计时的图形化界面。
(3)增加额外音效
由于pygame同时播放音乐,会有覆盖现象。即后播放音乐会覆盖之前播放音乐,导致原版游戏结束,bgm.play_over被bgm.play_menu覆盖,播放不出来。使用独立线程对代码要求较高,取巧,利用睡眠(time.sleep)。玩家切到炸弹结束游戏,暂停0.3s画面,而不是原版的突然重新开始。
(4)游戏历史最高分数
利用IO流逐行读取txt文件,和原版分数一样的window.blit函数绘制在游戏界面,不过分数的更新要在结束程序后会执行。
Bug:
游戏的局部和实例变量较多,有些资源可能会被程序占用而无法释放。目前主要bug,在游戏碰撞检测的时候,偶尔会出现分数停止更新的情况。本人才疏学浅,至今没有有效解决,希望大佬们多多包涵,最好能够帮助解决,完善游戏。
三、代码设计:
import time
import math
import random
import pygame
from pygame.constants import *pygame.init()""" 背景图片 """
class Background(pygame.sprite.Sprite):def __init__(self, window, x, y, image_path):pygame.sprite.Sprite.__init__(self)self.window = windowself.image = pygame.image.load(image_path)self.rect = self.image.get_rect()self.rect.x = xself.rect.y = ydef update(self):self.window.blit(self.image, self.rect)""" 被抛出的水果类 """
class ThrowFruit(pygame.sprite.Sprite):def __init__(self, window, image_path, speed, turn_angel, flag):pygame.sprite.Sprite.__init__(self)# 游戏窗口self.window = window# 导入水果图像并获取其矩形区域self.image = pygame.image.load(image_path)self.rect = self.image.get_rect()# 水果抛出时x坐标取随机数self.rect.x = random.randint(0, Manager.WIDTH - 10)# 水果初始y坐标self.rect.y = Manager.HEIGHT# 抛出时速度self.speed = speed# 旋转速度self.turn_angel = turn_angel# 水果抛出时与窗口下水平线的夹角弧度,因为要用到随机函数, 所以取整数, 使用时除以100self.throw_angel = 157# 水果抛出后所经历的时间, 初始化为0self.fruit_t = 0# 旋转的总角度self.v_angel = 0# 水果抛出时的初速度self.v0 = 6# 水果标记self.flag = flagdef update(self):""" 水果运动状态更新 """# 在弧度制中,一个完整的圆周对应的角度是360度,对应的弧度是2π(即360度 = 2π弧度)。# 因此,可以通过以下公式将角度转换为弧度: 弧度 = 角度 × π / 180# 当角度为90度时,根据上述公式,可以计算出对应的弧度为: 90度 × π / 180 = 0.5π = 1.57(约)# 如果水果的初始X坐标位于窗口左边区域, 取抛出时弧度在70度至90度之间if self.rect.x <= Manager.WIDTH / 2:self.throw_angel = random.randint(140, 157)# 如果水果的初始X坐标位于窗口右侧区域, 取抛出时弧度在90度至110度之间elif self.rect.x >= Manager.WIDTH / 2:self.throw_angel = random.randint(157, 175)# 水果旋转后的新图像new_fruit = pygame.transform.rotate(self.image, self.v_angel)self.window.blit(new_fruit, (self.rect.x + self.rect.width / 2 - new_fruit.get_width() / 2,self.rect.y + self.rect.height / 2 - new_fruit.get_height() / 2))# 如果水果落出屏幕,没有被切,经典模式 X 加一,并销毁水果对象if self.rect.y >= Manager.HEIGHT + self.rect.height:if self.flag != 5:Manager.classic_miss += 1self.kill()# 水果抛出后的运动时水平匀速运动以及竖直向上的变速运动到达最高点时下落, 所以可以判断水果做的是斜上抛运动# 可以利用重力加速度来求出每隔一段时间水果运动后的y坐标# 公式: v0 * t * sin(α) - g * t^2 / 2self.rect.y -= self.v0 * self.fruit_t * math.sin(self.throw_angel / 100) - (Manager.G *self.fruit_t ** 2 / 10) / 2# 计算水果在水平方向的匀速运动位移之后的X坐标# 公式: v0 * t * cos(α)self.rect.x += self.v0 * self.fruit_t * math.cos(self.throw_angel / 100)# 累加经过的时间self.fruit_t += 0.1# 累加旋转总角度self.v_angel += self.turn_angel""" 水果切片类 """
class HalfFruit(pygame.sprite.Sprite):def __init__(self, window, image_path, x, y, turn_angel, v_angel, v0):pygame.sprite.Sprite.__init__(self)self.window = windowself.image = pygame.image.load(image_path)self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.turn_angel = turn_angelself.fruit_t = 0self.v_angel = v_angelself.v0 = v0def update(self):""" 水果运动状态更新 """# 水果旋转后的新图像new_fruit = pygame.transform.rotate(self.image, self.v_angel)# 将旋转后的新图像贴入游戏窗口, 注意, 旋转后的图像尺寸以及像素都不一样了(尺寸变大了), 所以坐标需要进行适当处理# 在原先图片矩形的中心位置绘制self.window.blit(new_fruit, (self.rect.x + self.rect.width / 2 - new_fruit.get_width() / 2,self.rect.y + self.rect.height / 2 - new_fruit.get_height() / 2))if self.rect.y >= Manager.HEIGHT:self.kill()self.rect.y += Manager.G * self.fruit_t ** 2 / 2self.rect.x += self.v0 * self.fruit_tself.fruit_t += 0.01self.v_angel += self.turn_angel""" 水果刀光类 """
class Knife(object):def __init__(self, window):self.window = windowself.apple_flash = pygame.image.load("./images/apple_flash.png")self.banana_flash = pygame.image.load("./images/banana_flash.png")self.peach_flash = pygame.image.load("./images/peach_flash.png")self.watermelon_flash = pygame.image.load("./images/watermelon_flash.png")self.strawberry_flash = pygame.image.load("./images/strawberry_flash.png")def show_apple_flash(self, x, y):self.window.blit(self.apple_flash, (x, y))def show_banana_flash(self, x, y):self.window.blit(self.banana_flash, (x, y))def show_peach_flash(self, x, y):self.window.blit(self.peach_flash, (x, y))def show_watermelon_flash(self, x, y):self.window.blit(self.watermelon_flash, (x, y))def show_strawberry_flash(self, x, y):self.window.blit(self.strawberry_flash, (x, y))""" 模式选项类 """
class OptionMode(pygame.sprite.Sprite):def __init__(self, window, x, y, image_path, turn_angel, flag):pygame.sprite.Sprite.__init__(self)self.window = windowself.image = pygame.image.load(image_path)self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.turn_angel = turn_angelself.v_angel = 0self.flag = flagdef update(self):new_image = pygame.transform.rotate(self.image, -self.v_angel)self.window.blit(new_image, (self.rect.x + self.rect.width / 2 - new_image.get_width() / 2,self.rect.y + self.rect.height / 2 - new_image.get_height() / 2))self.v_angel += self.turn_angel""" 游戏音乐类 """
class Bgm(object):def __init__(self):pygame.mixer.init()def play_menu(self):pygame.mixer.music.load("./sound/menu.mp3")pygame.mixer.music.play(-1, 0)def play_classic(self):pygame.mixer.music.load("./sound/start.mp3")pygame.mixer.music.play(1, 0)def play_throw(self):pygame.mixer.music.load("./sound/throw.mp3")pygame.mixer.music.play(1, 0)def play_splatter(self):pygame.mixer.music.load("./sound/splatter.mp3")pygame.mixer.music.play(1, 0)def play_over(self):pygame.mixer.music.load("./sound/over.mp3")pygame.mixer.music.play(1, 0)def play_boom(self):pygame.mixer.music.load("./sound/boom.mp3")pygame.mixer.music.play(1, 0)""" 游戏逻辑类 """
class Manager(object):# 窗口尺寸WIDTH = 640HEIGHT = 480# 游戏中的定时器常量THROWFRUITTIME = pygame.USEREVENTpygame.time.set_timer(THROWFRUITTIME, 3000)# 根据窗口大小,选取随机整数重力加速度, 水果下落更有层次感,使用时除以10G = random.randint(19, 21)# 经典模式miss掉的水果数classic_miss = 0# 打开文本文件with open('best.txt', 'r') as file:# 逐行读取文件内容for line in file:if 'zen_mode' in line:zen_best = int(line.split(':')[-1].strip())if 'classic_mode' in line:classic_best = int(line.split(':')[-1].strip())def __init__(self):# 生成游戏窗口self.window = pygame.display.set_mode((Manager.WIDTH, Manager.HEIGHT))self.window_icon = pygame.image.load("./images/score.png")pygame.display.set_icon(self.window_icon)pygame.display.set_caption("FruitNinja")# 创建游戏中用到的的精灵组self.background_list = pygame.sprite.Group()self.circle_option = pygame.sprite.Group()self.option_fruit_list = pygame.sprite.Group()self.fruit_half_list = pygame.sprite.Group()self.throw_fruit_list = pygame.sprite.Group()# 导入背景图像并添加入背景精灵组self.background = Background(self.window, 0, 0, "./images/background.jpg")self.home_mask = Background(self.window, 0, 0, "./images/home-mask.png")self.logo = Background(self.window, 20, 10, "./images/logo.png")self.ninja = Background(self.window, Manager.WIDTH - 320, 45, "./images/ninja.png")self.home_desc = Background(self.window, 20, 135, "./images/home-desc.png")self.zen_new = Background(self.window, 175, 215, "./images/new.png")self.background_list.add(self.background)self.background_list.add(self.home_mask)self.background_list.add(self.logo)self.background_list.add(self.ninja)self.background_list.add(self.home_desc)self.background_list.add(self.zen_new)# 创建旋转的圈并添加进精灵组self.dojo = OptionMode(self.window, Manager.WIDTH - 600, Manager.HEIGHT - 250,"./images/dojo.png", 1, None)self.new_game = OptionMode(self.window, Manager.WIDTH - 405, Manager.HEIGHT - 250,"./images/new-game.png", 1, None)self.game_quit = OptionMode(self.window, Manager.WIDTH - 160, Manager.HEIGHT - 150,"./images/quit.png", -1, None)self.circle_option.add(self.dojo)self.circle_option.add(self.new_game)self.circle_option.add(self.game_quit)# 创建主菜单界面旋转的水果并添加进精灵组self.home_peach = OptionMode(self.window, Manager.WIDTH - 600 + self.dojo.rect.width / 2 - 31,Manager.HEIGHT - 250 + self.dojo.rect.height / 2 - 59 / 2,"./images/peach.png", -1, "option_peach")self.home_watermelon = OptionMode(self.window, Manager.WIDTH - 405 + self.new_game.rect.width / 2 - 49,Manager.HEIGHT - 250 + self.new_game.rect.height / 2 - 85 / 2,"./images/watermelon.png", -1, "option_watermelon")self.home_boom = OptionMode(self.window, Manager.WIDTH - 160 + self.game_quit.rect.width / 2 - 66 / 2,Manager.HEIGHT - 150 + self.game_quit.rect.height / 2 - 68 / 2,"./images/boom.png", 1, "option_boom")self.option_fruit_list.add(self.home_peach)self.option_fruit_list.add(self.home_watermelon)self.option_fruit_list.add(self.home_boom)# 设置定时器self.clock = pygame.time.Clock()# 模式标记self.mode_flag = 0# 音效self.bgm = Bgm()# 刀光self.knife = Knife(self.window)# 游戏分数self.classic_score = 0self.zen_score = 0def create_fruit(self):""" 创建水果 """if self.mode_flag == 1:boom_prob = random.randint(4, 6)if boom_prob == 5:self.bgm.play_throw()boom = ThrowFruit(self.window, "./images/boom.png", None, 5, 5)self.throw_fruit_list.add(boom)fruit_image_path = ["./images/apple.png", "./images/banana.png", "./images/peach.png","./images/watermelon.png", "./images/strawberry.png"]fruit_number = random.randint(1, 4)for n in range(fruit_number):rand_fruit_index = random.randint(0, len(fruit_image_path) - 1)self.bgm.play_throw()fruit = ThrowFruit(self.window, fruit_image_path[rand_fruit_index], None, 5,rand_fruit_index)self.throw_fruit_list.add(fruit)def create_fruit_half(self, fruit_flag, fruit_x, fruit_y, turn_angel, v_angel):if fruit_flag == "option_peach":""" 禅宗模式的桃子被切开 """fruit_left = HalfFruit(self.window, "./images/peach-1.png", fruit_x - 50,fruit_y, turn_angel, v_angel, -5)fruit_right = HalfFruit(self.window, "./images/peach-2.png", fruit_x + 50,fruit_y, -turn_angel, v_angel, 5)self.fruit_half_list.add(fruit_left)self.fruit_half_list.add(fruit_right)if fruit_flag == "option_watermelon":""" 经典模式西瓜被切开 """fruit_left = HalfFruit(self.window, "./images/watermelon-1.png", fruit_x - 50,fruit_y, turn_angel, v_angel, -5)fruit_right = HalfFruit(self.window, "./images/watermelon-2.png", fruit_x + 50,fruit_y, -turn_angel, v_angel, 5)self.fruit_half_list.add(fruit_left)self.fruit_half_list.add(fruit_right)if fruit_flag == 0:""" 苹果被切开 """fruit_left = HalfFruit(self.window, "./images/apple-1.png", fruit_x - 50,fruit_y, turn_angel, v_angel, -5)fruit_right = HalfFruit(self.window, "./images/apple-2.png", fruit_x + 50,fruit_y, -turn_angel, v_angel, 5)self.fruit_half_list.add(fruit_left)self.fruit_half_list.add(fruit_right)if fruit_flag == 1:""" 香蕉被切开 """fruit_left = HalfFruit(self.window, "./images/banana-1.png", fruit_x - 50,fruit_y, turn_angel, v_angel, -5)fruit_right = HalfFruit(self.window, "./images/banana-2.png", fruit_x + 50,fruit_y, -turn_angel, v_angel, 5)self.fruit_half_list.add(fruit_left)self.fruit_half_list.add(fruit_right)if fruit_flag == 2:""" 梨被切开 """fruit_left = HalfFruit(self.window, "./images/peach-1.png", fruit_x - 50,fruit_y, turn_angel, v_angel, -5)fruit_right = HalfFruit(self.window, "./images/peach-2.png", fruit_x + 50,fruit_y, -turn_angel, v_angel, 5)self.fruit_half_list.add(fruit_left)self.fruit_half_list.add(fruit_right)if fruit_flag == 3:""" 西瓜被切开 """fruit_left = HalfFruit(self.window, "./images/watermelon-1.png", fruit_x - 50,fruit_y, turn_angel, v_angel, -5)fruit_right = HalfFruit(self.window, "./images/watermelon-2.png", fruit_x + 50,fruit_y, -turn_angel, v_angel, 5)self.fruit_half_list.add(fruit_left)self.fruit_half_list.add(fruit_right)if fruit_flag == 4:""" 草莓被切开 """fruit_left = HalfFruit(self.window, "./images/strawberry-1.png", fruit_x - 50,fruit_y, turn_angel, v_angel, -5)fruit_right = HalfFruit(self.window, "./images/strawberry-2.png", fruit_x + 50,fruit_y, -turn_angel, v_angel, 5)self.fruit_half_list.add(fruit_left)self.fruit_half_list.add(fruit_right)def impact_check(self):""" 碰撞检测 """for item in self.option_fruit_list:""" 主页的模式选择 """mouse_pos = pygame.mouse.get_pos()if mouse_pos[0] > item.rect.left and mouse_pos[0] < item.rect.right \and mouse_pos[1] > item.rect.top and mouse_pos[1] < item.rect.bottom:self.bgm.play_splatter()self.create_fruit_half(item.flag, item.rect.x, item.rect.y, item.turn_angel, item.v_angel)self.option_fruit_list.remove_internal(item)if item.flag == "option_peach":self.mode_flag = 1return 1elif item.flag == "option_watermelon":self.mode_flag = 2return 2elif item.flag == "option_boom":return 0for item in self.throw_fruit_list:""" 游戏开始后判断水果是否被切到 """mouse_pos = pygame.mouse.get_pos()if mouse_pos[0] > item.rect.left and mouse_pos[0] < item.rect.right \and mouse_pos[1] > item.rect.top and mouse_pos[1] < item.rect.bottom:if item.flag == 0:self.knife.show_apple_flash(item.rect.x, item.rect.y)if item.flag == 1:self.knife.show_banana_flash(item.rect.x, item.rect.y)if item.flag == 2:self.knife.show_peach_flash(item.rect.x, item.rect.y)if item.flag == 3:self.knife.show_watermelon_flash(item.rect.x, item.rect.y)if item.flag == 4:self.knife.show_strawberry_flash(item.rect.x, item.rect.y)if self.mode_flag == 1:self.zen_score += 2if self.mode_flag == 2:self.classic_score += 2if item.flag != 5:self.bgm.play_splatter()self.create_fruit_half(item.flag, item.rect.x, item.rect.y, item.turn_angel, item.v_angel)self.throw_fruit_list.remove_internal(item)if item.flag == 5:self.bgm.play_boom()time.sleep(0.4)return 3def check_key(self):""" 监听事件 """for event in pygame.event.get():if event.type == QUIT:pygame.quit()exit()elif event.type == Manager.THROWFRUITTIME and self.mode_flag == 1:self.create_fruit()elif event.type == Manager.THROWFRUITTIME and self.mode_flag == 2:self.create_fruit()def zen_mode(self):""" 禅宗模式 """self.bgm.play_classic()score_image = Background(self.window, 10, 5, "./images/score.png")text = pygame.font.Font("./images/simhei.ttf", 30) # 设置分数显示的字体best = pygame.font.Font("./images/simhei.ttf", 20) # 设置历史最好分数显示的字体# 禅宗模式游戏时间record_time = 3600while True:# 设置游戏帧率self.clock.tick(60)self.check_key()self.background_list.sprites()[0].update()score_image.update()text_score = text.render("%d" % self.zen_score, 1, (255, 213, 156))self.window.blit(text_score, (50, 8))best_score = best.render("BEST %d" % self.zen_best, 1, (255, 179, 78))self.window.blit(best_score, (10, 40))game_time = text.render("Time:%d" % (record_time / 60), 1, (178, 34, 34))self.window.blit(game_time, (510, 12))temp_flag = self.impact_check()self.throw_fruit_list.update()self.fruit_half_list.update()pygame.display.update()record_time -= 1# 禅宗模式更新最高历史记录if record_time == 0 or temp_flag == 3:if self.zen_score > self.zen_best:file_path = 'best.txt'with open(file_path, 'r') as file:content = file.read()content = content.replace(str(self.zen_best), str(self.zen_score))with open(file_path, 'w') as file:file.write(content)returndef classic_mode(self):""" 经典模式 """pygame.font.init()self.bgm.play_classic()score_image = Background(self.window, 10, 5, "./images/score.png")text = pygame.font.Font("./images/simhei.ttf", 30) # 设置分数显示的字体best = pygame.font.Font("./images/simhei.ttf", 20) # 设置历史最好分数显示的字体x_nums = pygame.sprite.Group()miss_times = pygame.sprite.Group()xxx = Background(self.window, Manager.WIDTH - 30, 5, "./images/xxx.png")xx = Background(self.window, Manager.WIDTH - 60, 5, "./images/xx.png")x = Background(self.window, Manager.WIDTH - 90, 5, "./images/x.png")x_nums.add(xxx)x_nums.add(xx)x_nums.add(x)while True:# 设置游戏帧率self.clock.tick(60)pygame.display.update()self.check_key()self.background_list.sprites()[0].update()score_image.update()text_score = text.render("%d" % self.classic_score, 1, (255, 213, 156))self.window.blit(text_score, (50, 8))best_score = best.render("BEST %d" % self.classic_best, 1, (255, 179, 78))self.window.blit(best_score, (10, 40))x_nums.update()miss_times.update()temp_flag = self.impact_check()if temp_flag == 3:# 经典模式炸弹结束游戏更新历史最高记录if self.classic_score > self.classic_best:file_path = 'best.txt'with open(file_path, 'r') as file:content = file.read()content = content.replace(str(self.classic_best), str(self.classic_score))with open(file_path, 'w') as file:file.write(content)self.bgm.play_boom()time.sleep(0.4)returnself.throw_fruit_list.update()self.fruit_half_list.update()if Manager.classic_miss == 1:xf = Background(self.window, Manager.WIDTH - 90, 5, "./images/xf.png")miss_times.add(xf)elif Manager.classic_miss == 2:xf = Background(self.window, Manager.WIDTH - 90, 5, "./images/xf.png")miss_times.add(xf)xxf = Background(self.window, Manager.WIDTH - 60, 5, "./images/xxf.png")miss_times.add(xxf)elif Manager.classic_miss >= 3:# 经典模式正常结束更新历史最高记录if self.classic_score > self.classic_best:file_path = 'best.txt'with open(file_path, 'r') as file:content = file.read()content = content.replace(str(self.classic_best), str(self.classic_score))with open(file_path, 'w') as file:file.write(content)self.bgm.play_over()time.sleep(0.4)Manager.classic_miss = 0returndef main(self):""" 主页 """self.bgm.play_menu()while True:# 设置游戏帧率self.clock.tick(60)self.background_list.update()self.circle_option.update()self.option_fruit_list.update()self.fruit_half_list.update()temp_flag = self.impact_check()pygame.display.update()if temp_flag == 1:self.zen_mode()self.__init__()self.bgm.play_over()self.bgm.play_menu()if temp_flag == 2:self.classic_mode()self.__init__()self.bgm.play_over()self.bgm.play_menu()elif temp_flag == 0:self.bgm.play_over()time.sleep(0.3)pygame.quit()exit()elif temp_flag == 3:self.__init__()self.bgm.play_menu()self.check_key()if __name__ == '__main__':manager = Manager()manager.main()
源码:
链接:https://pan.baidu.com/s/11YM7GzqzFz1QkcGbJHnDCQ
提取码:daz5
相关文章:

Python实现水果忍者(开源)
一、整体介绍: 1.1 前言: 游戏代码基于Python制作经典游戏案例-水果忍者做出一些改动,优化并增加了一些功能。作为自己Python阶段学习的结束作品,文章最后有源码链接。 1.2 Python主要知识: (1…...
Windows自动化3️⃣WindowsPC拽起时长问题解决方案
问题描述: Windows应用从点击, 到加载完成, 需要一定的时间后台是否已经启动过当前程序?启动后, 前后台应用关闭问题等 我的解决思路: 首先检查进程 , 当前进程是否在运行, 如果进程在运行, 需要先关闭进程 关闭进程后, 开始我们的自动化流程, 去拽起 应用 拽起应用后, 可以先…...
一篇文章入门Java虚拟机(JVM)
JVM全称是Java Virtual Machine,中文译名Java虚拟机。本质上是一个运行在计算机上的程序 一,JVM的功能 功能描述解释和运行对字节码文件中的指令,实时的解释成机器码,让计算机执行内存管理自动为对象、方法等分配内存࿱…...

vue3里面的组件实例类型(包括原生的html标签类型)
在 通过 ref(null)获取组件的时候,我们想要为 组件标注组件类型,可以通过 any 类型来进行标注,但是很明显,这些的代码很不优雅,所以我们可以利用 vue3 里面的 InstanceType 来进行类型标注 这是…...

谷歌正式开放Imagen 3访问权限!OpenAI的GPT-4o连续两周迎来两次更新!|AI日报
文章推荐 马斯克Grok 2打响反内容限制第一枪,盛大网络狂欢!一起来看网友花式整活! GPT-4o一天迎来2大劲敌!Grok-2发布测试版!Gemini Live即刻上线! 今日热点 OpenAI发布chatgpt-4o-latest AI模型&#…...

C语言内存操作函数
目录 一. C语言内存操作函数 1. memcpy的使用和模拟实现 2. memmove函数 3. memset函数 4. memcmp函数 一. C语言内存操作函数 随着知识的不断积累,我们所想要实现的目标程序就会更加复杂,今天我们来学习一个新的知识叫做C语言内存操作函数&#x…...
深入探索 PyTorch:torch.nn.Parameter 与 torch.Tensor 的奥秘
标题:深入探索 PyTorch:torch.nn.Parameter 与 torch.Tensor 的奥秘 在深度学习的世界里,PyTorch 以其灵活性和易用性成为了众多研究者和开发者的首选框架。然而,即使是经验丰富的 PyTorch 用户,也可能对 torch.nn.Pa…...

成为Python砖家(1): 在本地查询Python HTML文档
目的 Python3 官方文档位于 https://docs.python.org/3/ , 有时候网络无法连接,或者连接速度慢, 这对于学习 Python 时的反馈造成了负面影响。准备一份本地 Python 文档可以让反馈更加及时。 下面给出 macOS 和 Win11 下的 Python 离线文档…...

深度学习基础—RMSprop算法与Adam 优化算法
1.RMSprop算法 1.1.算法流程 除了动量梯度下降法,RMSprop算法也可以加快梯度下降,这个算法的算法流程如下:深度学习基础—动量梯度下降法http://t.csdnimg.cn/zeGRo 1.2.算法原理 和动量梯度下降不同的是,对dW和db的变成了平方项…...

单片机原理及技术(六)—— 中断系统的工作原理
目录 一、AT89S51中断技术概述 二、AT89S51中断系统结构 2.1 中断请求源 2.2 中断请求标志寄存器 2.2.1 TCON 寄存器 2.2.2 SCON 寄存器 三、中断允许与中断优先级的控制 3.1 中断允许寄存器 IE 3.2 中断优先级寄存器 IP 四、响应中断请求的条件 五、外部中断的触发…...
Angular路由使用
Angular路由是Angular框架中一个非常重要的特性,开发者可以根据URL的不同来动态地加载和显示不同的组件,从而构建出单页面应用(SPA)。 以下是Angular路由使用的基本步骤和要点: 1. 安装和配置路由模块 首先…...

【JVM】深入理解类加载机制(一)
深入理解类加载机制 Klass模型 Java的每个类,在JVM中都有一个对应的Klass类实例与之对应,存储类的元信息如:常量池、属性信息、方法信息…从继承关系上也能看出来,类的元信息是存储在元空间的。普通的Java类在JVM中对应的是InstanceKlass(C)…...
区块链浏览器需求整理
用户需求 普通用户 便捷查询交易记录:能够轻松找到自己或特定地址的交易详情,包括交易时间、金额、状态等。查看账户余额:实时了解地址的余额情况。追踪资产流向:了解自己的资产在区块链上的转移路径。 开发者 智能合约调试&a…...
Laravel 表单验证功能重定向判断
判断主要针对 API 请求和普通页面请求,即 API 的表单验证失败直接响应 JSON,而页面的表单验证失败正常重定向。 看网上基本上是继承 FormRequest 类来实现,其实直接修改异常处理的 Handler 类即可,非常简单。 打开 app/Exception…...

MATLAB口罩检测系统
一、应用背景 作为数字图像处理和计算机视觉领域的一个重要组成部分,利用摄像机对图像进行采集,从图像中检测人脸并进行口罩穿戴的识别的有着非常重要的研究意义和应用价值。面对突如其来的新型肺炎疫情,人们生活秩序被严重打乱。跟普通流感…...
LeetCode 第三十一天 2024.8.18
1. :买卖股票的最佳时机 题目链接: 121. 买卖股票的最佳时机 - 力扣(LeetCode) 应用条件: 难点: # 确定dp数组(dp table)以及下标的含义:dp数组由len(prices)个[][]组成ÿ…...

Linux驱动学习之点灯(一)
学习不同的板子我们都是从点灯开始,linux驱动也不例外 驱动开发基础知识 何为驱动? 驱使硬件正常工作的代码就叫做驱动。 在一些mcu里: 无非就是直接操作寄存器,或者用库函数初始化外设,使外设正常工作如初始化iic&…...

从HTTP到HTTPS:SSL加密如何重塑互联网安全格局
从HTTP到HTTPS:SSL加密如何重塑互联网安全格局 随着互联网技术的飞速发展,网络安全问题日益凸显,保护用户数据的安全性和隐私性成为了不可忽视的重要议题。从HTTP(超文本传输协议)到HTTPS(超文本传输安全协…...

QT网络编程: 实现UDP通讯设置
目录 一.widget.ui界面设计 二.创建UDP通信 1.pro文件添加network模块。 2.添加对应头文件 3.定义槽函数,即与 UI 中的按钮点击事件相关联的函数 4.定义类的私有成员 5.关闭按钮 6.信息处理 7.绑定端口 8.发送信息 9.效果图 三.代码演示 1.widget.h 2.…...

机器学习第十一章--特征选择与稀疏学习
一、子集搜索与评价 我们将属性称为 “特征”(feature),对当前学习任务有用的属性称为 “相关特征”(relevant feature)、没什么用的属性称为 “无关特征”(irrelevant feature).从给定的特征集合中选择出相关特征子集的过程&…...

idea大量爆红问题解决
问题描述 在学习和工作中,idea是程序员不可缺少的一个工具,但是突然在有些时候就会出现大量爆红的问题,发现无法跳转,无论是关机重启或者是替换root都无法解决 就是如上所展示的问题,但是程序依然可以启动。 问题解决…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
LOOI机器人的技术实现解析:从手势识别到边缘检测
LOOI机器人作为一款创新的AI硬件产品,通过将智能手机转变为具有情感交互能力的桌面机器人,展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家,我将全面解析LOOI的技术实现架构,特别是其手势识别、物体识别和环境…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...