pycharm实现skills示例

文章目录

    • [报错 未找到技能: python](#报错 未找到技能: python)

步骤

1、新建一个项目,名称为:skills_demo
2、在项目根目录下,创建一个名为 main.py 的文件,并将以下代码复制进去,代码:

py 复制代码
import json
import os
from dataclasses import dataclass, asdict
from enum import Enum
from typing import List, Optional

# 1. 定义技能类别枚举
class SkillCategory(Enum):
    PROGRAMMING = "编程"
    LANGUAGE = "语言"
    SOFT_SKILL = "软技能"
    DESIGN = "设计"

# 2. 定义技能数据类 (Dataclass)
@dataclass
class Skill:
    name: str
    category: SkillCategory
    level: int = 1  # 默认等级为 1
    xp: int = 0     # 当前经验值
    
    # 升级所需的经验公式:当前等级 * 100
    def xp_needed(self) -> int:
        return self.level * 100

    def add_xp(self, amount: int) -> bool:
        """添加经验值,如果升级返回 True"""
        self.xp += amount
        leveled_up = False
        
        # 检查是否升级(可能一次加很多经验,连升多级)
        while self.xp >= self.xp_needed() and self.level < 10:
            self.xp -= self.xp_needed()
            self.level += 1
            leveled_up = True
            print(f"🎉 恭喜![{self.name}] 升级到了 Lv.{self.level}")
            
        if self.level >= 10:
            self.xp = 0 # 满级后经验清零或保留,这里设为清零
            
        return leveled_up

    def get_power_score(self) -> float:
        """计算该技能的战力贡献 (等级^1.5)"""
        return self.level ** 1.5

    def to_dict(self) -> dict:
        """转换为字典以便保存 JSON"""
        data = asdict(self)
        data['category'] = self.category.value # 保存枚举的值而不是对象
        return data

# 3. 定义技能管理器
class SkillManager:
    def __init__(self, save_file: str = "skills_data.json"):
        self.save_file = save_file
        self.skills: List[Skill] = []
        self.load_skills()

    def add_skill(self, name: str, category: SkillCategory):
        new_skill = Skill(name=name, category=category)
        self.skills.append(new_skill)
        print(f"✅ 已添加新技能: {name} ({category.value})")

    def list_skills(self):
        if not self.skills:
            print("💤 还没有任何技能,快去添加吧!")
            return

        print("\n--- 📜 我的技能树 ---")
        total_power = 0
        for s in self.skills:
            bar = "█" * s.level + "░" * (10 - s.level)
            print(f"[{s.category.value}] {s.name}: Lv.{s.level} {bar} ({s.xp}/{s.xp_needed()} XP)")
            total_power += s.get_power_score()
        
        print(f"---------------------")
        print(f"⚡ 总战力评分: {total_power:.2f}")
        print("---------------------\n")

    def train_skill(self, skill_name: str, xp_amount: int):
        found = False
        for s in self.skills:
            if s.name == skill_name:
                s.add_xp(xp_amount)
                found = True
                break
        
        if not found:
            print(f"❌ 未找到技能: {skill_name}")

    def save_skills(self):
        data = [s.to_dict() for s in self.skills]
        with open(self.save_file, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, indent=2)
        print(f"💾 技能数据已保存至 {self.save_file}")

    def load_skills(self):
        if not os.path.exists(self.save_file):
            return
            
        try:
            with open(self.save_file, 'r', encoding='utf-8') as f:
                data = json.load(f)
            
            self.skills = []
            for item in data:
                # 恢复枚举类型
                cat_enum = SkillCategory(item['category'])
                skill = Skill(
                    name=item['name'],
                    category=cat_enum,
                    level=item['level'],
                    xp=item['xp']
                )
                self.skills.append(skill)
            print(f"📂 已加载 {len(self.skills)} 个技能。")
        except Exception as e:
            print(f"⚠️ 加载数据失败: {e}")

# 4. 主程序入口
def main():
    manager = SkillManager()

    # 如果是第一次运行,添加一些示例数据
    if len(manager.skills) == 0:
        print("🌱 初始化示例数据...")
        manager.add_skill("Python", SkillCategory.PROGRAMMING)
        manager.add_skill("PyTorch", SkillCategory.PROGRAMMING)
        manager.add_skill("English", SkillCategory.LANGUAGE)
        manager.add_skill("Communication", SkillCategory.SOFT_SKILL)
        
        # 模拟训练一下
        manager.train_skill("Python", 150) # 升一级
        manager.train_skill("PyTorch", 50)
    
    # 交互式菜单
    while True:
        print("1. 查看技能树")
        print("2. 训练技能 (加经验)")
        print("3. 添加新技能")
        print("4. 保存并退出")
        
        choice = input("请选择操作 (1-4): ").strip()
        
        if choice == '1':
            manager.list_skills()
        elif choice == '2':
            name = input("输入技能名称: ").strip()
            try:
                xp = int(input("输入获得的经验值: ").strip())
                manager.train_skill(name, xp)
            except ValueError:
                print("❌ 经验值必须是数字!")
        elif choice == '3':
            name = input("输入新技能名称: ").strip()
            print("类别: 1.编程 2.语言 3.软技能 4.设计")
            cat_idx = input("选择类别编号 (1-4): ").strip()
            cat_map = {'1': SkillCategory.PROGRAMMING, '2': SkillCategory.LANGUAGE, 
                       '3': SkillCategory.SOFT_SKILL, '4': SkillCategory.DESIGN}
            if cat_idx in cat_map:
                manager.add_skill(name, cat_map[cat_idx])
            else:
                print("❌ 无效的类别")
        elif choice == '4':
            manager.save_skills()
            print("👋 再见!")
            break
        else:
            print("❌ 无效输入")

if __name__ == "__main__":
    main()

3、在 main.py 编辑区域点击右键,点 运行,你会看到终端(Terminal)输出初始化的技能树。
4、交互测试
(1)在下方控制台输入 1 查看列表。

输入 2,然后输入 Python,再输入 200,观察它是否升级。

输入 4 保存退出。
(2)验证数据持久化:

再次运行程序(不要修改代码),你会发现它自动加载了你上次保存的数据,并且没有重新初始化那些默认数据。

你可以在左侧项目栏看到生成的 skills_data.json 文件,点开看看里面的数据结构。

报错 未找到技能: python

是因为代码中的名称为Python,大小写不一样,训练的时候终端输入改为Python即可。

相关推荐
2501_941982052 小时前
Java 实现企业微信外部群机器人:自动化消息交互
开发语言·python
灵机一物2 小时前
灵机一物AI智能电商小程序(已上线)-从“帮我买抽纸”到自动下单支付——大模型驱动全链路自动购物系统实战
人工智能·python·elasticsearch·小程序·fastapi·rag·langgraph
老师好,我是刘同学3 小时前
基数排序原理与Python实现详解
python·排序算法
Storynone11 小时前
【Day20】LeetCode:39. 组合总和,40. 组合总和II,131. 分割回文串
python·算法·leetcode
小鸡吃米…11 小时前
Python—— 环境搭建
python
io_T_T12 小时前
python 文件管理库 Path 解析(详细&基础)
python
一瓢西湖水12 小时前
Windows安装OpenClaw实践指南
人工智能·windows·ai
sjmaysee12 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
酿情师13 小时前
Windows Subsystem for Linux (WSL, Ubuntu)安装教程(详细)
linux·windows·ubuntu