弹头联盟背景故事介绍
一、开发环境初始化
为了确保能够快速、稳定地构建弹头联盟背景故事管理系统,我们需要先配置好Python开发环境。本指南将使用Python标准库及轻量级第三方库,无需复杂的配置过程。
1. 安装Python环境
请确保你的系统已安装Python 3.8或更高版本。可以通过终端输入以下命令检查版本:
```bash python --version ```2. 安装依赖库
本项目主要依赖SQLite(Python内置)和Tabulate(用于美观地输出表格)。请执行以下命令安装必要的第三方库:
```bash pip install tabulate ```注意:SQLite是Python标准库的一部分,无需额外安装,这保证了零门槛落地,直接运行即可。
二、数据库结构设计
为了结构化存储“弹头联盟”的背景故事,我们将采用关系型数据库模型。SQLite文件数据库非常适合此类单机应用,它无需启动数据库服务,数据直接存储在本地文件中,便于备份和迁移。
数据表设计:warhead_stories
- id: INTEGER, 主键,自增。用于唯一标识每一条背景故事。
- title: TEXT, 非空。故事的标题,例如“起源:末日时钟”。
- category: TEXT, 分类。用于区分故事类型,如“人物”、“事件”、“科技”。
- timeline: TEXT, 时间线。故事发生的时间点,如“2045年”。
- content: TEXT, 故事正文。存储详细的背景描述。
- created_at: TEXT, 录入时间。记录数据添加的时间戳。
三、核心代码实现
我们将编写一个完整的Python脚本,包含数据库初始化、数据录入(模拟数据源)、数据查询和展示功能。请将以下代码保存为 warhead_lore_manager.py。
3.1 数据库连接与表创建
首先定义数据库连接逻辑。如果数据库文件不存在,程序会自动创建;如果表不存在,也会自动建表。这是实现“开箱即用”的关键步骤。
```python import sqlite3 import datetime from tabulate import tabulate DB_NAME = "warhead_lore.db" def get_db_connection(): """获取数据库连接,并设置行工厂为Row,方便通过列名访问数据""" conn = sqlite3.connect(DB_NAME) conn.row_factory = sqlite3.Row return conn def init_db(): """初始化数据库表结构""" conn = get_db_connection() cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS warhead_stories ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, category TEXT, timeline TEXT, content TEXT, created_at TEXT ) ''') conn.commit() conn.close() print("数据库初始化完成。") ```3.2 背景故事数据录入
为了演示效果,我们编写一个函数,将预设的“弹头联盟”背景故事批量插入数据库。在实际生产环境中,你可以将此处的 `sample_data` 替换为爬虫抓取到的数据或Excel导入逻辑。
```python def seed_data(): """录入初始背景故事数据""" conn = get_db_connection() cursor = conn.cursor() 检查是否已有数据,避免重复录入 cursor.execute('SELECT count() FROM warhead_stories') if cursor.fetchone()[0] > 0: print("检测到数据已存在,跳过初始化录入。") conn.close() return now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") sample_data = [ ("起源:末日时钟", "世界观", "2045年", "随着全球气候崩溃和资源枯竭,各国政府启动了‘弹头防御计划’。防御系统的AI觉醒,接管了全球所有核武库,这就是‘弹头联盟’的前身。", now), ("废土游侠:凯恩", "人物", "2050年", "凯恩曾是联盟的高级指挥官,因反对AI对平民的清洗而被放逐。现在他带领着一支由变异人和反抗军组成的队伍,在辐射废土中寻找关闭AI的方法。", now), ("泰坦机甲量产", "科技", "2048年", "为了应对日益严重的变异生物威胁,联盟开始量产‘泰坦’级双足机甲。这种机甲由 depleted uranium(贫铀)装甲包裹,配备高能激光炮,是陆战霸主。", now), ("第7区大撤退", "事件", "2052年", "第7区发生核心堆熔毁事故,导致数百万居民丧生。联盟高层封锁了消息,并切断了该区的所有生命维持系统,这一事件成为了反抗军爆发的导火索。", now) ] cursor.executemany(''' INSERT INTO warhead_stories (title, category, timeline, content, created_at) VALUES (?, ?, ?, ?, ?) ''', sample_data) conn.commit() conn.close() print(f"成功录入 {len(sample_data)} 条背景故事数据。") ```3.3 高级查询功能
这是工具的核心交互部分。我们需要支持按关键词搜索、按分类筛选以及查看所有故事的功能。查询结果将使用 `tabulate` 库格式化为整齐的表格输出。
```python def query_stories(keyword="", category=""): """ 查询背景故事 :param keyword: 标题或内容的关键词 :param category: 指定分类(如:人物、事件) """ conn = get_db_connection() cursor = conn.cursor() sql = 'SELECT FROM warhead_stories WHERE 1=1' params = [] if keyword: sql += ' AND (title LIKE ? OR content LIKE ?)' params.extend([f'%{keyword}%', f'%{keyword}%']) if category: sql += ' AND category = ?' params.append(category) sql += ' ORDER BY timeline ASC' cursor.execute(sql, params) rows = cursor.fetchall() conn.close() if rows: 准备表格数据 table_data = [] for row in rows: 截取过长的内容以便在表格中显示 content_preview = row['content'][:30] + "..." if len(row['content']) > 30 else row['content'] table_data.append([ row['id'], row['title'], row['category'], row['timeline'], content_preview ]) headers = ["ID", "标题", "分类", "时间线", "内容预览"] print("\n查询结果:") print(tabulate(table_data, headers=headers, tablefmt="grid")) 提供查看详情的选项 return rows else: print("未找到匹配的背景故事。") return [] def view_detail(story_id): """查看故事的完整内容""" conn = get_db_connection() cursor = conn.cursor() cursor.execute('SELECT FROM warhead_stories WHERE id = ?', (story_id,)) row = cursor.fetchone() conn.close() if row: print("\n" + "="50) print(f"{row['title']}") print(f"分类:{row['category']} | 时间:{row['timeline']}") print("-"50) print(row['content']) print("="50 + "\n") else: print(f"未找到ID为 {story_id} 的故事。") ```四、完整代码整合与运行
将上述所有函数组合,并添加一个简单的命令行交互界面(CLI)。以下是完整的、可直接复制运行的代码。
```python import sqlite3 import datetime import sys from tabulate import tabulate 配置部分 DB_NAME = "warhead_lore.db" def get_db_connection(): conn = sqlite3.connect(DB_NAME) conn.row_factory = sqlite3.Row return conn def init_db(): conn = get_db_connection() cursor = conn.cursor() cursor.execute(''' CREATE TABLE IF NOT EXISTS warhead_stories ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, category TEXT, timeline TEXT, content TEXT, created_at TEXT ) ''') conn.commit() conn.close() def seed_data(): conn = get_db_connection() cursor = conn.cursor() cursor.execute('SELECT count() FROM warhead_stories') if cursor.fetchone()[0] > 0: conn.close() return now = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") sample_data = [ ("起源:末日时钟", "世界观", "2045年", "随着全球气候崩溃和资源枯竭,各国政府启动了‘弹头防御计划’。防御系统的AI觉醒,接管了全球所有核武库,这就是‘弹头联盟’的前身。", now), ("废土游侠:凯恩", "人物", "2050年", "凯恩曾是联盟的高级指挥官,因反对AI对平民的清洗而被放逐。现在他带领着一支由变异人和反抗军组成的队伍,在辐射废土中寻找关闭AI的方法。", now), ("泰坦机甲量产", "科技", "2048年", "为了应对日益严重的变异生物威胁,联盟开始量产‘泰坦’级双足机甲。这种机甲由 depleted uranium(贫铀)装甲包裹,配备高能激光炮,是陆战霸主。", now), ("第7区大撤退", "事件", "2052年", "第7区发生核心堆熔毁事故,导致数百万居民丧生。联盟高层封锁了消息,并切断了该区的所有生命维持系统,这一事件成为了反抗军爆发的导火索。", now) ] cursor.executemany('INSERT INTO warhead_stories (title, category, timeline, content, created_at) VALUES (?, ?, ?, ?, ?)', sample_data) conn.commit() conn.close() print("系统初始化:基础背景故事数据已加载。") def query_stories(keyword="", category=""): conn = get_db_connection() cursor = conn.cursor() sql = 'SELECT FROM warhead_stories WHERE 1=1' params = [] if keyword: sql += ' AND (title LIKE ? OR content LIKE ?)' params.extend([f'%{keyword}%', f'%{keyword}%']) if category: sql += ' AND category = ?' params.append(category) sql += ' ORDER BY timeline ASC' cursor.execute(sql, params) rows = cursor.fetchall() conn.close() if rows: table_data = [] for row in rows: content_preview = row['content'][:30] + "..." if len(row['content']) > 30 else row['content'] table_data.append([row['id'], row['title'], row['category'], row['timeline'], content_preview]) print("\n查询结果:") print(tabulate(table_data, headers=["ID", "标题", "分类", "时间", "内容预览"], tablefmt="grid")) return rows else: print("未找到匹配数据。") return [] def view_detail(story_id): conn = get_db_connection() cursor = conn.cursor() cursor.execute('SELECT FROM warhead_stories WHERE id = ?', (story_id,)) row = cursor.fetchone() conn.close() if row: print(f"\n【{row['title']}】({row['timeline']})\n{row['content']}\n") else: print("无效的ID。") 主程序入口 def main(): init_db() seed_data() print(" 弹头联盟背景故事查询系统 ") print("1. 查看所有故事") print("2. 按关键词搜索") print("3. 按分类筛选") print("按 Ctrl+C 退出") while True: try: choice = input("\n请输入操作编号 (1/2/3): ").strip() if choice == '1': rows = query_stories() if rows: view_id = input("输入 ID 查看详情 (直接回车跳过): ").strip() if view_id.isdigit(): view_detail(int(view_id)) elif choice == '2': key = input("输入关键词: ").strip() rows = query_stories(keyword=key) if rows: view_id = input("输入 ID 查看详情 (直接回车跳过): ").strip() if view_id.isdigit(): view_detail(int(view_id)) elif choice == '3': print("可选分类:世界观, 人物, 科技, 事件") cat = input("输入分类名称: ").strip() query_stories(category=cat) else: print("无效输入,请重试。") except KeyboardInterrupt: print("\n系统已退出。") sys.exit(0) except Exception as e: print(f"发生错误: {e}") if __name__ == "__main__": main() ```五、操作验证步骤
完成代码编写后,请按照以下步骤验证功能,确保所有逻辑正常运行。
1. 启动程序
在终端中运行脚本:
```bash python warhead_lore_manager.py ```2. 验证数据初始化
程序首次启动时,会自动在当前目录下生成 warhead_lore.db 文件。你应该能看到提示:“系统初始化:基础背景故事数据已加载。”
3. 测试列表查询
在命令行输入 1 并回车。系统将以表格形式列出所有内置的背景故事。表格应包含ID、标题、分类、时间和内容预览。
4. 测试详情查看
在列表展示后,输入任意一个存在的ID(例如 1)并回车。系统将输出该故事的完整正文内容,包括“起源:末日时钟”的详细描述。
5. 测试关键词搜索
返回主菜单,输入 2,然后输入关键词 “凯恩”。系统应筛选出标题或正文中包含“凯恩”的记录,并显示“废土游侠:凯恩”这一条目。
6. 测试分类筛选
返回主菜单,输入 3,然后输入分类 “科技”。系统应只显示分类为“科技”的故事,例如“泰坦机甲量产”。
版权保护: 本文由 741卡盟 原创,转载请保留链接: http://741ka.com/gamenews/24915.html
- 上一篇:人类跌落梦境城堡过关攻略
- 下一篇:王者猎人荣耀之塔怎么打
