在前两个版本的更新后,越来越多内容,操作和运行也不方便,优化第三版本窗口可视化界面

本次版本更新使得可读性和可操作性大幅度增加,前面2版本可分别参考

我不是挂王-用python实现燕双鹰小游戏 和 我不是挂王-用python实现燕双鹰小游戏2

一.燕双鹰窗口可视化(燕双鹰3.0)

'''
新燕双鹰3.0
1.把“状态”与“UI”彻底分离:
燕双鹰 只保留纯逻辑,所有 UI 相关代码放到 GameGUI 里。
2. 用 Enum 把散落各处的字符串常量收拢,杜绝打错字。
3. 把“攻击功法”做成数据表,新增/调整只需改表,不用动业务代码。
4. 增加“战斗日志”控件,玩家随时能看到完整事件流。
5. 增加“进度条”实时显示双方血量。
6. 增加“禁用/启用按钮”机制,防止玩家在网络延迟(或动画)期间狂点。
7. 代码量压缩 30 %,可读性大幅提高。
'''
import random
import tkinter as tk
from enum import Enum, auto
from dataclasses import dataclass# ---------- 游戏常量 ----------
class St(Enum):"""燕双鹰状态"""NORMAL = auto()SPEAKING = auto()ROLLING = auto()SURROUNDED = auto()@dataclass
class Attack:name: strdamage: inthit_rate: float  # 0~1ATTACKS = [Attack("普通攻击", 0, 0.0),Attack("初级功法", 5, 0.25),Attack("中级功法", 12, 0.45),Attack("高级功法", 20, 0.65),
]# ---------- 纯逻辑层 ----------
class YanYuanYing:def __init__(self):self.hp = 100self.state = St.NORMALself.has_bullet = Trueself.miss_cnt = 0self.player_hp = 100self.player_attack: Attack = ATTACKS[0]# ---- 事件接口,全部返回 (log:str, game_over:bool) ----def talk(self):self.state = St.SPEAKINGreturn "你举枪对准燕双鹰:‘燕双鹰,插翅难逃!’\n燕双鹰:‘你的枪法不错,但还不够快……’", Falsedef shoot(self):if self.state != St.SPEAKING:self.state = St.ROLLINGreturn "燕双鹰未开口,他开始翻滚躲避,进入无敌状态!", Falseif not self.has_bullet:if random.random() < 0.3:self.player_hp -= 15return "枪里没子弹!燕双鹰趁机反击,你 -15 HP!", self._check_end()return "枪里没子弹,你得想别的办法!", False# 有子弹if random.random() < 0.5:  # 50 % 打不中self.has_bullet = Falseself.miss_cnt += 1return "你开枪了……但燕双鹰躲过了!枪已空。", Falseelse:self.has_bullet = Falsedmg = 10self.hp -= dmgreturn f"子弹击中!燕双鹰 -{dmg} HP!", self._check_end()def surround(self):if self.state == St.ROLLING:return "燕双鹰在翻滚,无法包围!", Falseself.state = St.SURROUNDEDself.player_hp -= 20return "你示意手下包围,燕双鹰触发‘后手先发’反击,你 -20 HP!", self._check_end()def loud(self):self.player_hp -= 10return "你大声喊话,燕双鹰掏枪威慑,你 -10 HP!", self._check_end()def player_attack_act(self):atk = self.player_attackif random.random() < atk.hit_rate or self.miss_cnt >= 3:self.miss_cnt = 0self.hp -= atk.damagelog = f"{atk.name}命中!燕双鹰 -{atk.damage} HP!"if random.random() < 0.2:  # 20 % 反击counter = int(atk.damage * 0.5)self.player_hp -= counterlog += f"\n燕双鹰反击,你 -{counter} HP!"return log, self._check_end()else:self.miss_cnt += 1return f"{atk.name}未命中!", Falsedef set_attack(self, idx: int):self.player_attack = ATTACKS[idx]def _check_end(self):return self.player_hp <= 0 or self.hp <= 0# ---------- GUI ----------
class GameGUI:def __init__(self):self.logic = YanYuanYing()self.root = tk.Tk()self.root.title("燕双鹰小游戏")self._build_ui()self.refresh_bar()self.log("游戏开始!选择你的行动。")def _build_ui(self):top = tk.Frame(self.root)top.pack(padx=10, pady=10)tk.Label(top, text="你的 HP").grid(row=0, column=0, sticky="w")tk.Label(top, text="燕双鹰 HP").grid(row=1, column=0, sticky="w")self.player_bar = tk.Canvas(top, width=200, height=20, bg="white", relief="sunken")self.yyy_bar = tk.Canvas(top, width=200, height=20, bg="white", relief="sunken")self.player_bar.grid(row=0, column=1, padx=5)self.yyy_bar.grid(row=1, column=1, padx=5)ctrl = tk.Frame(self.root)ctrl.pack(pady=5)self.btns = []actions = [("讲话", self.act_talk), ("开枪", self.act_shoot),("包围", self.act_surround), ("大声说话", self.act_loud)]for i, (txt, cmd) in enumerate(actions):b = tk.Button(ctrl, text=txt, width=12, command=cmd)b.grid(row=0, column=i, padx=3)self.btns.append(b)# 功法下拉tk.Label(ctrl, text="功法").grid(row=1, column=0, sticky="e")self.atk_var = tk.StringVar(value=ATTACKS[0].name)om = tk.OptionMenu(ctrl, self.atk_var, *[a.name for a in ATTACKS],command=self.change_atk)om.grid(row=1, column=1, padx=3)tk.Button(ctrl, text="攻击", command=self.act_attack).grid(row=1, column=2)tk.Button(ctrl, text="退出", command=self.root.destroy).grid(row=1, column=3)# 日志log_frame = tk.Frame(self.root)log_frame.pack(padx=10, pady=10, fill="both", expand=True)sc = tk.Scrollbar(log_frame)sc.pack(side="right", fill="y")self.log_box = tk.Text(log_frame, height=12, yscrollcommand=sc.set)self.log_box.pack(fill="both", expand=True)sc.config(command=self.log_box.yview)def refresh_bar(self):def _draw(bar, val):bar.delete("all")bar.create_rectangle(0, 0, int(val * 2), 20, fill="green" if val > 30 else "red")bar.create_text(100, 10, text=f"{val}/100", fill="white")_draw(self.player_bar, max(0, self.logic.player_hp))_draw(self.yyy_bar, max(0, self.logic.hp))def log(self, txt):self.log_box.insert("end", txt + "\n")self.log_box.see("end")def disable_all(self):for b in self.btns:b.config(state="disabled")def enable_all(self):for b in self.btns:b.config(state="normal")def change_atk(self, _):idx = next(i for i, a in enumerate(ATTACKS) if a.name == self.atk_var.get())self.logic.set_attack(idx)# ---- 各动作 ----def act_talk(self): self._do(*self.logic.talk())def act_shoot(self): self._do(*self.logic.shoot())def act_surround(self): self._do(*self.logic.surround())def act_loud(self): self._do(*self.logic.loud())def act_attack(self): self._do(*self.logic.player_attack_act())def _do(self, txt: str, game_over: bool):self.log(txt)self.refresh_bar()if game_over:self.disable_all()who = "你" if self.logic.player_hp <= 0 else "燕双鹰"self.log(f"{who} 被击败,游戏结束!")def run(self):self.root.mainloop()if __name__ == "__main__":GameGUI().run()

二.燕双鹰的技能多样化(燕双鹰3.1)

燕双鹰依旧超标,差一点被带走,为了公平性和可玩性,加强了一下玩家

'''
新燕双鹰3.1
版本更新,增加游戏公平性和可玩性,使得燕双鹰在非说话状态也能受到伤害
1.添加一个道具系统,例如“破甲弹”,使用后可以无视燕双鹰的状态(包括ROLLING状态)对其造成伤害。
2.在GUI中增加一个道具选择按钮,例如“使用破甲弹”。
3.当玩家使用破甲弹后,下一次攻击(无论是开枪还是功法攻击)将无视燕双鹰的状态,并且可能造成额外伤害。
'''
import random
import tkinter as tk
from enum import Enum, auto
from dataclasses import dataclass# ---------- 游戏常量 ----------
class St(Enum):"""燕双鹰状态"""NORMAL = auto()SPEAKING = auto()ROLLING = auto()SURROUNDED = auto()@dataclass
class Attack:name: strdamage: inthit_rate: float  # 0~1ATTACKS = [Attack("普通攻击", 0, 0.0),Attack("初级功法", 5, 0.25),Attack("中级功法", 12, 0.45),Attack("高级功法", 20, 0.65),
]# 新增道具类
@dataclass
class Item:name: streffect: strquantity: int# ---------- 纯逻辑层 ----------
class YanYuanYing:def __init__(self):self.hp = 100self.state = St.NORMALself.has_bullet = Trueself.miss_cnt = 0self.player_hp = 100self.player_attack: Attack = ATTACKS[0]# 新增道具系统self.items = [Item("破甲弹", "无视防御", 3),Item("烟雾弹", "降低回避", 2),Item("医疗包", "恢复生命", 2)]self.active_item = None# ---- 事件接口,全部返回 (log:str, game_over:bool) ----def talk(self):self.state = St.SPEAKINGreturn "你举枪对准燕双鹰:‘燕双鹰,插翅难逃!’\\n燕双鹰:‘你的枪法不错,但还不够快……’", Falsedef shoot(self):# 使用道具效果if self.active_item == "破甲弹":self.active_item = Nonedmg = 15self.hp -= dmgself._use_item("破甲弹")return f"破甲弹穿透防御!燕双鹰 -{dmg} HP!", self._check_end()# 原始逻辑if self.state != St.SPEAKING:self.state = St.ROLLINGreturn "燕双鹰未开口,他开始翻滚躲避,进入无敌状态!", Falseif not self.has_bullet:if random.random() < 0.3:self.player_hp -= 15return "枪里没子弹!燕双鹰趁机反击,你 -15 HP!", self._check_end()return "枪里没子弹,你得想别的办法!", False# 有子弹if random.random() < 0.5:  # 50 % 打不中self.has_bullet = Falseself.miss_cnt += 1return "你开枪了……但燕双鹰躲过了!枪已空。", Falseelse:self.has_bullet = Falsedmg = 10self.hp -= dmgreturn f"子弹击中!燕双鹰 -{dmg} HP!", self._check_end()def surround(self):if self.state == St.ROLLING:return "燕双鹰在翻滚,无法包围!", Falseself.state = St.SURROUNDEDself.player_hp -= 20return "你示意手下包围,燕双鹰触发‘后手先发’反击,你 -20 HP!", self._check_end()def loud(self):self.player_hp -= 10return "你大声喊话,燕双鹰掏枪威慑,你 -10 HP!", self._check_end()def player_attack_act(self):atk = self.player_attack# 使用烟雾弹效果if self.active_item == "烟雾弹":self.active_item = Nonehit_chance = min(1.0, atk.hit_rate + 0.35)  # 提升35%命中率self._use_item("烟雾弹")else:hit_chance = atk.hit_rateif random.random() < hit_chance or self.miss_cnt >= 3:self.miss_cnt = 0self.hp -= atk.damagelog = f"{atk.name}命中!燕双鹰 -{atk.damage} HP!"if random.random() < 0.2:  # 20 % 反击counter = int(atk.damage * 0.5)self.player_hp -= counterlog += f"\\n燕双鹰反击,你 -{counter} HP!"return log, self._check_end()else:self.miss_cnt += 1return f"{atk.name}未命中!", Falsedef set_attack(self, idx: int):self.player_attack = ATTACKS[idx]def _check_end(self):return self.player_hp <= 0 or self.hp <= 0# 新增道具系统方法def use_item(self, item_name):for item in self.items:if item.name == item_name and item.quantity > 0:item.quantity -= 1self.active_item = item_namereturn Truereturn Falsedef _use_item(self, item_name):for item in self.items:if item.name == item_name:item.quantity -= 1return Truereturn Falsedef heal(self):for item in self.items:if item.name == "医疗包" and item.quantity > 0:item.quantity -= 1self.player_hp = min(100, self.player_hp + 30)return "使用医疗包恢复30HP!"return "医疗包不足!"# ---------- GUI ----------
class GameGUI:def __init__(self):self.logic = YanYuanYing()self.root = tk.Tk()self.root.title("燕双鹰小游戏")self._build_ui()self.refresh_bar()self.log("游戏开始!选择你的行动。")def _build_ui(self):top = tk.Frame(self.root)top.pack(padx=10, pady=10)tk.Label(top, text="你的 HP").grid(row=0, column=0, sticky="w")tk.Label(top, text="燕双鹰 HP").grid(row=1, column=0, sticky="w")self.player_bar = tk.Canvas(top, width=200, height=20, bg="white", relief="sunken")self.yyy_bar = tk.Canvas(top, width=200, height=20, bg="white", relief="sunken")self.player_bar.grid(row=0, column=1, padx=5)self.yyy_bar.grid(row=1, column=1, padx=5)ctrl = tk.Frame(self.root)ctrl.pack(pady=5)self.btns = []actions = [("讲话", self.act_talk), ("开枪", self.act_shoot),("包围", self.act_surround), ("大声说话", self.act_loud)]for i, (txt, cmd) in enumerate(actions):b = tk.Button(ctrl, text=txt, width=8, command=cmd)b.grid(row=0, column=i, padx=3)self.btns.append(b)# 功法下拉tk.Label(ctrl, text="功法").grid(row=1, column=0, sticky="e")self.atk_var = tk.StringVar(value=ATTACKS[0].name)om = tk.OptionMenu(ctrl, self.atk_var, *[a.name for a in ATTACKS],command=self.change_atk)om.config(width=8)om.grid(row=1, column=1, padx=3)tk.Button(ctrl, text="攻击", command=self.act_attack, width=8).grid(row=1, column=2, padx=3)# 新增道具按钮item_frame = tk.Frame(ctrl)item_frame.grid(row=1, column=3, padx=10)tk.Button(item_frame, text="道具", command=self.toggle_items, width=8).pack(side="left")self.item_btns = []# 退出按钮tk.Button(ctrl, text="退出", command=self.root.destroy, width=8).grid(row=1, column=4, padx=3)# 新增医疗包按钮tk.Button(ctrl, text="使用医疗包", command=self.use_heal, width=10).grid(row=2, column=0, columnspan=2, pady=5)# 日志log_frame = tk.Frame(self.root)log_frame.pack(padx=10, pady=10, fill="both", expand=True)sc = tk.Scrollbar(log_frame)sc.pack(side="right", fill="y")self.log_box = tk.Text(log_frame, height=12, yscrollcommand=sc.set)self.log_box.pack(fill="both", expand=True)sc.config(command=self.log_box.yview)def toggle_items(self):if hasattr(self, "item_menu") and self.item_menu.winfo_viewable():self.item_menu.destroy()returnself.item_menu = tk.Menu(self.root, tearoff=0)for item in self.logic.items:self.item_menu.add_command(label=f"{item.name}({item.quantity})",command=lambda nm=item.name: self.use_item(nm))self.item_menu.post(self.btns[3].winfo_rootx(), self.btns[3].winfo_rooty() + 30)def use_item(self, item_name):if self.logic.use_item(item_name):self.log(f"已使用{item_name},准备攻击!")else:self.log(f"{item_name}不足!")def use_heal(self):self.log(self.logic.heal())self.refresh_bar()def refresh_bar(self):def _draw(bar, val):bar.delete("all")color = "green" if val > 30 else "red"bar.create_rectangle(0, 0, int(val * 2), 20, fill=color)bar.create_text(100, 10, text=f"{max(0, val)}/100", fill="white")_draw(self.player_bar, max(0, self.logic.player_hp))_draw(self.yyy_bar, max(0, self.logic.hp))def log(self, txt):self.log_box.insert("end", txt + "\n")self.log_box.see("end")def disable_all(self):for b in self.btns:b.config(state="disabled")def enable_all(self):for b in self.btns:b.config(state="normal")def change_atk(self, _):idx = next(i for i, a in enumerate(ATTACKS) if a.name == self.atk_var.get())self.logic.set_attack(idx)# ---- 各动作 ----def act_talk(self):self._do(*self.logic.talk())def act_shoot(self):self._do(*self.logic.shoot())def act_surround(self):self._do(*self.logic.surround())def act_loud(self):self._do(*self.logic.loud())def act_attack(self):self._do(*self.logic.player_attack_act())def _do(self, txt: str, game_over: bool):self.log(txt)self.refresh_bar()if game_over:self.disable_all()who = "你" if self.logic.player_hp <= 0 else "燕双鹰"self.log(f"{who} 被击败,游戏结束!")def run(self):self.root.mainloop()if __name__ == "__main__":GameGUI().run()

要是没有加血差一点 又没了,第二把直接功法装备上露头秒,这样游戏平衡了,但是 玩家好像加强过高了,后面再调整

    在前两个版本的更新后,越来越多内容,操作和运行也不方便,优化第三版本窗口可视化界面
本次新3.0版本更新使得可读性和可操作性大幅度增加,前面2版本可分别参考以前博客,
燕双鹰依旧超标,差一点被带走,为了公平性和可玩性,在新3.1版本中加强了一下玩家;

整理不易,诚望各位看官点赞 收藏 评论 予以支持,这将成为我持续更新的动力源泉。若您在阅览时存有异议或建议,敬请留言指正批评,让我们携手共同学习,共同进取,吾辈自当相互勉励!

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

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

相关文章

装饰(Decorator)模式可以在不修改对象外观和功能的情况下添加或者删除对象功能

试题&#xff08;35&#xff09;、&#xff08;36&#xff09;某系统中的文本显示类&#xff08;TextView&#xff09;和图片显示类&#xff08;PictureView&#xff09;都继承了组件类&#xff08;Component&#xff09;&#xff0c;分别显示文本和图片内容&#xff0c;现需要…

深度学习基础概念【持续更新】

1. 梯度消失如果网络中某一层的激活函数&#xff08;如 sigmoid 或 tanh&#xff09;在输入较大的情况下有很小的梯度&#xff08;比如接近零&#xff09;&#xff0c;那么当这些小的梯度通过多层反向传播时&#xff0c;它们会逐渐变得更小。这意味着在深层网络的前面几层&…

上下文工程:AI应用成功的关键架构与实践指南

在AI应用开发中&#xff0c;模型能力只决定性能上限&#xff0c;而上下文质量决定性能下限——上下文工程正是确保AI系统理解用户意图、生成准确响应的核心工程技术&#xff0c;已成为区分普通AI应用与卓越AI应用的关键因素。一、上下文工程&#xff1a;AI应用的新核心竞争力 1…

数据传输优化-异步不阻塞处理增强首屏体验

背景&#xff1a;主 project 页面中会将视频存储到云端后获得 ID &#xff0c;然后用 ID 调用 后端API POST到数据库后拿到挂载页面URL&#xff0c;接着传入视频分享组件&#xff08;由于视频分享子组件的目标是分享视频挂载页面&#xff0c;所以前置步骤不能少&#xff09;con…

【芯片设计-信号完整性 SI 学习 1.0 -- SI 介绍】

文章目录一、SoC 设计验证阶段的 SI 测试主要工作举例二、芯片 Bringup 阶段的 SI 测试主要工作举例三、SI-PI 联合仿真主要内容举例四、整体总结一、SoC 设计验证阶段的 SI 测试 在 前硅阶段&#xff08;pre-silicon&#xff09;&#xff0c;设计团队需要确保 SoC 与外设接口…

C语言链表设计及应用

链表链表节点设计链表项目链表中的传址调用检查申请空间链表尾插链表头插链表尾部删除链表头部删除链表的查找指定位置之前插入指定位置之后插入数据删除指定位置&#xff08;节点&#xff09;数据删除指定位置&#xff08;节点&#xff09;之后的数据链表的销毁前面学习了顺序…

使用 YAML 自动化 Azure DevOps 管道

1. 在 Azure DevOps 中设置 YAML 管道 开始之前,您需要拥有一个 Azure DevOps 帐户和一个 git 仓库。 要创建 YAML 管道, 1. 导航至 Azure DevOps → 选择您的项目 2. 前往“管道”→ 点击“新建管道” 3. 选择您的仓库(Azure Repos、GitHub 等) 4. 选择“Starter Pipelin…

基于Spring Boot的幼儿园管理系统

基于Spring Boot的幼儿园管理系统 源码获取&#xff1a;https://mbd.pub/o/bread/YZWXlZtsbQ 引言 在数字化转型的浪潮中&#xff0c;教育行业的信息化建设显得尤为重要。幼儿园作为基础教育的重要环节&#xff0c;其管理系统的现代化水平直接关系到教育质量和运营效率。本文…

【NVIDIA-B200】 ‘CUDA driver version is insufficient for CUDA runtime version‘

目录 一、错误核心原因 二、排查步骤 1. 检查当前驱动版本 2. 检查 CUDA 运行时版本 3. 验证驱动与 CUDA 的兼容性 三、解决方法 1. 确保驱动正确加载 2. 重新安装匹配的驱动与 CUDA 3. 验证环境正确性 四、关键注意事项 报错日志: bash nccl.sh ------------5.安…

Android中如何实现自动化测试

目录 前言: 一、方法介绍 1、UI Automator 3、shell脚本 二、shell脚本实现自动化测试原理和步骤 1、 原理 2、步骤 三、shell自动化测试实例 前言: 在开发项目的过程中&#xff0c;我们将某个阶段的需求完成并且提测&#xff0c;通常&#xff0c;在测试工程师更细致的测…

绿联科技全球化突围:业财一体化如何打通全球电商全链路数字化

绿联科技专注数码配件20年&#xff0c;产品覆盖全球100多个国家&#xff0c;年销售额突破30亿。作为"连接"领域的专家&#xff0c;绿联深知连接的真谛不仅在于硬件产品&#xff0c;更在于数据的全球化连接。在全球电商竞争日益激烈的今天&#xff0c;绿联率先探索业财…

uv教程 虚拟环境

什么是uv 可以创建虚拟环境 安装依赖 安装uv 参见官方文档 安装 | uv-zh-cn 自定义安装目录,winr 输入powershell&#xff0c;输入如下命令 $env:UV_INSTALL_DIR "C:\Custom\Path";powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/inst…

绕过codex在vscode中登录403的问题

codex安装&#xff1a; npm i -g openai/codex codex升级&#xff1a; npm install -g openai/codexlatest 绕过codex在vscode中登录403的问题&#xff1a; https://linux.do/t/topic/924206/4 1.在windows端powelshell登陆好codex&#xff1b; $env:HTTP_PROXY"http://…

软件研发如何选对方法论?传统计划驱动与敏捷价值驱动的全面对比

软件项目研发中的方法论是一个核心话题,它决定了团队如何规划、执行和交付软件。下面我将对这些方法论进行一个全面的概述,从传统的到现代的,并说明它们的核心思想、适用场景和趋势。 一、 方法论的核心分类 软件研发方法论主要分为两大阵营:传统计划驱动(Plan-Driven)…

【服务器】将本地项目部署到服务器

当我们已经有了一个服务器后 如何将本地项目部署到服务器呢第一步&#xff0c;找到云服务器实例&#xff0c;查看公网IP地址第二步&#xff0c;推荐使用 Windows 自带的 PowerShell ssh root你的公网IP # 例如&#xff1a; ssh root47.98.123.45如果超时&#xff0c;首先检查服…

Flink中的 BinaryRowData 以及大小端

背景 本文基于 Flink 1.17.0 写此文章的目的是为了说明 Flink 堆内和堆外内存以及 内部 BinaryRowData 行处理的优化。 分析 堆内和堆外内存 跟Spark的内存管理不一样&#xff0c;Flink 中的堆内和堆外一直都是存在的。 堆内内存&#xff08;JVM Heap&#xff09;存储用户对象和…

HTTP/3.0:网络通信的技术革新与性能飞跃

&#x1f310; HTTP/3.0&#xff1a;网络通信的技术革新与性能飞跃 Refer&#xff1a;PPP PRIVATE NETWORK™ 2 企业级虚拟以太网接入综合解决方案介绍 &#x1f680; 引言&#xff1a;悄然来临的网络革命 你是否曾期待视频加载卡顿成为过去&#xff1f;YouTube 已经迈出了重…

【golang学习笔记 gin 】1.1 路由封装和mysql 的使用封装

安装gin go get -u github.com/gin-gonic/gin go get -u github.com/go-sql-driver/mysql创建相关目录 gotest->conifg->database.go->redis.go->controller ->index.go->model->user.go->router->router.gomain.go 创建用户模型 package model imp…

SQL 层面行转列

背景&#xff1a;如果对一些评论、点赞、收藏等互动数据&#xff0c;使用了按照 type 分类存储&#xff0c;num 也是对应的。这样如果创建一个帖子&#xff0c;那么就会出现 3 行数据&#xff08;type 不同&#xff0c;num 不同&#xff0c;对应评论点赞和收藏&#xff09;&…

langchain4j笔记篇(阳哥)

一 概述1.1 概述langchain4j&#xff1a;langchain for java1.2 作用langchain4j的目标是简化将LLM集成到java应用程序中的过程。二 案例简单helloworld2.1 大模型调用三件套1.阿里百炼平台的通义模型&#xff1a; https://bailian.console.aliyun.com/2获取api-key&#x…