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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/51979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python爬虫——爬取某网站的视频

爬取视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入此网站中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到后续我们想要的一些…

qt-15综合实例(电子时钟)-多态重写鼠标单击和移动事件

综合实例-电子时钟 知识点digiclock.hdigiclock.cppmain.cpp运行图 知识点 setWindowOpacity(0.5);//设置窗体透明度 QTimer* Timer new QTimer(this);//新建一个定时器 connect(Timer,SIGNAL(timeout()),this,SLOT(ShowTime())); Timer->start(1000);//启动定时器 digic…

稚晖君发布5款全能人形机器人,开源创新,全能应用

8月18日&#xff0c;智元机器人举行“智元远征 商用启航” 2024年度新品发布会&#xff0c;智元联合创始人彭志辉主持并发布了“远征”与“灵犀”两大系列共五款商用人形机器人新品——远征A2、远征A2-W、远征A2-Max、灵犀X1及灵犀X1-W&#xff0c;并展示了在机器人动力、感知、…

猫头虎分享:练习提示词Prompt有什么好方法?提高Prompt水平和质量

猫头虎是谁&#xff1f; 大家好&#xff0c;我是 猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评测图文、产品使用体验图文、产品优点推广文稿、…

深扒大模型微调密码 - 从入门到技术小白都能看懂的神操作

朋友们&#xff0c;你们有没有听说过"大模型"和"微调"这两个概念呢&#xff1f;别着急,我们今天就来好好聊一聊! 想象一下,你有一个非常勤奋的小助理,它会尽最大努力帮你完成各种任务。不过有时候,它的知识储备和能力肯定有限,所以你得适时给它一些专门的…

树莓派5 笔记25:第一次启动与配置树莓派5_8G

今日继续学习树莓派5 8G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下&#xff1a; 今日购得了树莓派5_8G版本&#xff0c;性能是同运…

springboot航班进出港管理系统--论文源码调试讲解

第2章 开发环境与技术 本章节对开发航班进出港管理系统管理系统需要搭建的开发环境&#xff0c;还有航班进出港管理系统管理系统开发中使用的编程技术等进行阐述。 2.1 Java语言 Java语言是当今为止依然在编程语言行业具有生命力的常青树之一。Java语言最原始的诞生&#xff…

SQL每日一练-0815

今日SQL题难度&#xff1a;&#x1f31f;☆☆☆☆☆☆☆☆☆ 1、题目要求 计算每个产品类别在每个月的总销售额和总销量。找出每个月销售额最高的产品类别&#xff0c;显示类别名称、销售月份、总销售额和总销量。 2、表和虚拟数据 现有两个表&#xff1a;Products 和…

牛客网习题——通过C++实现

一、目标 实现下面4道练习题增强C代码能力。 1.求123...n_牛客题霸_牛客网 (nowcoder.com) 2.计算日期到天数转换_牛客题霸_牛客网 (nowcoder.com) 3.日期差值_牛客题霸_牛客网 (nowcoder.com) 4.打印日期_牛客题霸_牛客网 (nowcoder.com) 二、对目标的实现 1.求123...n_…

[机器学习]--KNN算法(K邻近算法)

KNN (K-Nearest Neihbor,KNN)K近邻是机器学习算法中理论最简单,最好理解的算法,是一个 非常适合入门的算法,拥有如下特性: 思想极度简单,应用数学知识少(近乎为零),对于很多不擅长数学的小伙伴十分友好虽然算法简单,但效果也不错 KNN算法原理 上图是每一个点都是一个肿瘤病例…

Sakana.ai 迈向完全自动化的开放式科学发现

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

从零开始搭建k8s集群详细步骤

声明&#xff1a;本文仅作为个人记录学习k8s过程的笔记。 节点规划&#xff1a; 两台节点为阿里云ECS云服务器&#xff0c;操作系统为centos7.9&#xff0c;master为2v4GB,node为2v2GB,硬盘空间均为40GB。&#xff08;节点基础配置不低于2V2GB&#xff09; 主机名节点ip角色部…

Docker最佳实践进阶(一):Dockerfile介绍使用

大家好&#xff0c;上一个系列我们使用docker安装了一系列的基础服务&#xff0c;但在实际开发过程中这样一个个的安装以及繁杂命令不仅仅浪费时间&#xff0c;更是容易遗忘&#xff0c;下面我们进行Docker的进阶教程&#xff0c;帮助我们更快速的部署和演示项目。 一、什么是…

力扣面试经典算法150题:找出字符串中第一个匹配项的下标

找出字符串中第一个匹配项的下标 今天的题目是力扣面试经典150题中的数组的简单题: 找出字符串中第一个匹配项的下标 题目链接&#xff1a;https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/?envTypestudy-plan-v2&envIdto…

docker compose部署rabbitmq集群,并使用haproxy负载均衡

一、创建rabbitmq的data目录 mkdir data mkdir data/rabbit1 mkdir data/rabbit2 mkdir data/rabbit3 二、创建.erlang.cookie文件&#xff08;集群cookie用&#xff09; echo "secretcookie" > .erlang.cookie 三、创建haproxy.cfg配置文件 global log stdout fo…

深度学习基础—正则化

正则化&#xff1a;解决模型过拟合的手段&#xff0c;本质就是减小模型参数取值&#xff0c;从而使模型更简单。常用范数如下&#xff1a; 使用最多的是L2范数正则项&#xff0c;因此加入正则项的损失函数变为&#xff1a; 使用梯度下降法的权重调整公式&#xff1a; 推导后得到…

项目实战:Qt+Opencv相机标定工具v1.3.0(支持打开摄像头、视频文件和网络地址,支持标定过程查看、删除和动态评价误差率,支持追加标定等等)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141334834 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、Op…

二十二、状态模式

文章目录 1 基本介绍2 案例2.1 Season 接口2.2 Spring 类2.3 Summer 类2.4 Autumn 类2.5 Winter 类2.6 Person 类2.7 Client 类2.8 Client 类的运行结果2.9 总结 3 各角色之间的关系3.1 角色3.1.1 State ( 状态 )3.1.2 ConcreteState ( 具体的状态 )3.1.3 Context ( 上下文 )3.…

Airtest 的使用

Airtest 介绍 Airtest Project 是网易游戏推出的一款自动化测试框架&#xff0c;其项目由以下几个部分构成 Airtest : 一个跨平台的&#xff0c;基于图像识别的 UI 自动化测试框架&#xff0c;适用于游戏和 App &#xff0c; 支持 Windows, Android 和 iOS 平台&#xff0c…

解决银河麒麟V10登录循环的方法

解决银河麒麟V10登录循环的方法 一&#xff1a;进入命令行二&#xff1a;删除.Xauthority文件三&#xff1a;重启系统 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在使用银河麒麟桌面操作系统V10时&#xff0c;有时可能会遇到一个令人头…