From 04f41adf27045ecd7dd6c9db7d9da1f503b1c8b6 Mon Sep 17 00:00:00 2001 From: chicrobt Date: Tue, 10 Mar 2026 00:00:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(SS)=20=E6=B7=BB=E5=8A=A0=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E6=A0=8F=E5=9C=BA=E6=99=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.js | 5 +- src/scenes/Control.js | 8 +- src/scenes/InfoBar.js | 76 ++++ test/textgame.py | 801 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 886 insertions(+), 4 deletions(-) create mode 100644 src/scenes/InfoBar.js create mode 100644 test/textgame.py diff --git a/main.js b/main.js index a0e04bb..d0160d6 100644 --- a/main.js +++ b/main.js @@ -59,7 +59,7 @@ import WorldLand from './src/scenes/WorldLand.js'; import BreatheLife from './src/scenes/BreatheLife.js'; // 伏羲画卦,创建角色控制、信息栏与多语言 import Control from './src/scenes/Control.js'; -// import InfoBar from './src/scenes/InfoBar.js'; +import InfoBar from './src/scenes/InfoBar.js'; // import MultiLanguage from './src/scenes/MultiLanguage.js'; // // 钻木取火,添加光影与合成系统 // import Shadow from './src/scenes/Shadow.js'; @@ -78,11 +78,12 @@ const config = { ...gameConfig, // 指定游戏使用的场景列表,包括主场景和所有测试场景 scene: [ - Control, PrimordialDevide, WorldTime, WorldLand, BreatheLife, + Control, + InfoBar, // 测试场景 MenuScene, diff --git a/src/scenes/Control.js b/src/scenes/Control.js index e2bf975..c9b87ea 100644 --- a/src/scenes/Control.js +++ b/src/scenes/Control.js @@ -46,8 +46,6 @@ export default class Control extends BreatheLife { // 初始化团队目标点 this.teamTargetPoint = null // 团队目标移动点 } - // Control 场景不再需要覆盖 initSceneTransition 方法 - // 数组初始化由父类 BreatheLife.create() 中的 initSceneTransition() 完成 initInput() { // 移除父类的输入事件监听器,避免重复监听 super.removeListener() @@ -68,6 +66,12 @@ export default class Control extends BreatheLife { update() { super.update() + // 检查小草是否被收集完 + if (this.smallGrassObjects.length === 0) { + console.log("所有小草已被收集") + // 切换到下一个场景 + this.scene.start(this.nextScene) + } // 更新所有NPC this.NPCObjects.forEach(npc => { if (npc.update) { diff --git a/src/scenes/InfoBar.js b/src/scenes/InfoBar.js new file mode 100644 index 0000000..c8c3b66 --- /dev/null +++ b/src/scenes/InfoBar.js @@ -0,0 +1,76 @@ +/** + * InfoBar 场景类 + * + * + */ +import Control from "./Control.js" +export default class InfoBar extends Control { + constructor(sceneKey = 'InfoBar') { + // 场景相关 + super(sceneKey) + this.nextScene = 'MultiLanguage' + } + async preload() { + super.preload() + } + create() { + super.create() + // 创建信息栏 + this.createInfoBar() + } + initSceneTransition() { + super.initSceneTransition() + } + initInput() { + // 移除父类的输入事件监听器,避免重复监听 + super.removeListener() + // 监听鼠标点击事件,同时处理左右键 + this.input.on('pointerdown', (pointer) => { + const { x, y } = this.input.activePointer + // 检查是否点击在UI区域 + if (this.isUIClicked(x, y)) { + return + } + if (pointer.rightButtonDown()) { + // 右键点击 + this.handleRightClick(x, y) + } else { + // 左键点击 + this.handleClick(x, y, pointer) + } + }) + } + + update() { + super.update() + } + + /** + * 创建信息栏 + */ + createInfoBar() { + // 创建信息栏容器 + this.infoBarContainer = this.add.container(0, 0) + this.infoBarContainer.setDepth(this.UIDepth) // 设置深度,确保在UI层级 + this.infoBarContainer.setScrollFactor(0) // 固定,不随相机移动 + // 创建信息栏背景 + // const infoBarBg = this.add.image(0, 0, 'infoBarBg') + // 灰色半透明 + const infoBarBg = this.add.graphics() + infoBarBg.fillStyle(0x808080, 0.5) + infoBarBg.fillRect(0, 0, this.sys.game.config.width, 100) + this.infoBarContainer.add(infoBarBg) + } + /** + * 检查是否点击在UI区域 + * @param {number} x - 点击位置的x坐标 + * @param {number} y - 点击位置的y坐标 + * @returns {boolean} - 如果点击在UI区域,返回true;否则返回false + */ + isUIClicked(x, y) { + // 检查点击位置是否在信息栏容器内 + return this.infoBarContainer.getBounds().contains(x, y) + } + + +} \ No newline at end of file diff --git a/test/textgame.py b/test/textgame.py new file mode 100644 index 0000000..827ebfb --- /dev/null +++ b/test/textgame.py @@ -0,0 +1,801 @@ +import random +import time +from collections import Counter + +class 饰品大亨: + def __init__(self, verbose=False, manual=False): + self.分数 = 50 + self.轮数 = 0 + self.总轮数 = 10 + self.店名 = "" + self.店铺类型 = "" + self.分店数 = 0 + self.客流量 = 50 + self.品牌价值 = 50 + self.现金流 = 50 + self.事件记录 = [] + self.verbose = verbose + self.manual = manual + + def 显示状态(self): + if not self.verbose: + return + print("=" * 60) + print(f"🏪 {self.店名}({self.店铺类型}) 经营状况 (第{self.轮数}/{self.总轮数}轮)") + print("=" * 60) + print(f"💰 综合分数: {self.分数} | 🏢 分店数: {self.分店数}") + print(f"👥 客流量: {self.客流量} | 💎 品牌价值: {self.品牌价值} | 💵 现金流: {self.现金流}") + print("-" * 60) + + def 应用效果(self, 分数变, 分店变, 客流变, 现金变, 品牌变, 描述): + 旧分数 = self.分数 + 旧现金流 = self.现金流 + 旧客流量 = self.客流量 + 旧品牌价值 = self.品牌价值 + 旧分店数 = self.分店数 + + self.分数 += 分数变 + self.分店数 = max(0, self.分店数 + 分店变) + self.客流量 = max(0, min(100, self.客流量 + 客流变)) + self.现金流 += 现金变 + self.品牌价值 = max(0, min(100, self.品牌价值 + 品牌变)) + self.事件记录.append(f"第{self.轮数}轮: {描述}") + + if self.verbose: + print(f"✨ {描述}") + + # 资金变化描述(重点突出) + if 现金变 > 0: + print(f"💰 资金增加 +{现金变}万,现在有{self.现金流}万") + elif 现金变 < 0: + print(f"� 资金减少 {现金变}万,现在有{self.现金流}万") + else: + print(f"💰 资金保持{self.现金流}万") + + # 分数变化描述 + if 分数变 > 0: + print(f"� 综合分数提升 +{分数变},从{旧分数}→{self.分数}") + elif 分数变 < 0: + print(f"📉 综合分数下降 {分数变},从{旧分数}→{self.分数}") + + # 其他参数变化描述 + 变化列表 = [] + if 客流变 != 0: + if 客流变 > 0: + 变化列表.append(f"客流量+{客流变}({旧客流量}→{self.客流量})") + else: + 变化列表.append(f"客流量{客流变}({旧客流量}→{self.客流量})") + + if 品牌变 != 0: + if 品牌变 > 0: + 变化列表.append(f"品牌价值+{品牌变}({旧品牌价值}→{self.品牌价值})") + else: + 变化列表.append(f"品牌价值{品牌变}({旧品牌价值}→{self.品牌价值})") + + if 分店变 != 0: + if 分店变 > 0: + 变化列表.append(f"分店数+{分店变}({旧分店数}→{self.分店数})") + else: + 变化列表.append(f"分店数{分店变}({旧分店数}→{self.分店数})") + + if 变化列表: + print(f"📈 其他变化: {', '.join(变化列表)}") + + def 选择店铺类型(self): + if self.verbose: + print("🌟" + "=" * 56 + "🌟") + if self.manual: + print(" " * 20 + "饰品大亨") + else: + print(" " * 20 + "饰品大亨:自动模拟版") + print("🌟" + "=" * 56 + "🌟") + print("\n请选择店铺类型:") + print(" 1. 时尚银饰店 (现金流-5, 品牌价值+5, 客流量+5)") + print(" 2. 古法金饰店 (现金流-15, 品牌价值+10, 客流量-5)") + print(" 3. 潮流合金店 (现金流-0, 品牌价值-5, 客流量+10)") + print(" 4. 手工DIY饰品店 (现金流-10, 品牌价值+10)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if 选 == 1: + self.店铺类型 = "时尚银饰店" + self.客流量 += 5 + self.品牌价值 += 5 + self.现金流 -= 5 + elif 选 == 2: + self.店铺类型 = "古法金饰店" + self.品牌价值 += 10 + self.现金流 -= 15 + self.客流量 -= 5 + elif 选 == 3: + self.店铺类型 = "潮流合金店" + self.客流量 += 10 + self.品牌价值 -= 5 + self.现金流 += 5 + else: + self.店铺类型 = "手工DIY饰品店" + self.品牌价值 += 10 + self.现金流 -= 10 + + if self.manual: + self.店名 = self.店铺类型 + else: + self.店名 = f"自动模拟{self.店铺类型}" + if self.verbose: + if self.manual: + print(f"\n🎯 你选择了:{self.店铺类型}") + else: + print(f"\n🎲 自动选择店铺类型:{self.店铺类型}") + print(f"你的店铺「{self.店名}」正式成立!\n") + + def 轮次1(self): + if self.verbose: + print("\n📦 第1轮 · 首次进货") + print("请选择进货渠道:") + print(" 1. 批发市场 (风险低,收益一般)") + print(" 2. 品牌代理 (成本高,品牌价值提升)") + print(" 3. 线上进货 (风险高,可能爆款)") + print(" 4. 手工设计 (独特风格,可能大获成功)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + if 选 == 1: + if 点数 <= 2: + self.应用效果(-5, 0, 0, 3, -2, "批发市场淘到积压货,质量不佳") + elif 点数 <= 4: + self.应用效果(5, 0, 0, 5, 2, "批发市场淘到一批性价比不错的货") + else: + self.应用效果(10, 0, 5, 8, 5, "批发市场捡漏,发现小众优质货源") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-3, 0, -2, -5, -2, "品牌代理拖延供货,错失良机") + elif 点数 <= 4: + self.应用效果(5, 0, 2, 5, 5, "与品牌代理顺利合作,品质保证") + else: + self.应用效果(15, 0, 5, 10, 10, "拿到独家代理,品牌价值大增") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(-5, 0, -5, -3, -3, "物流延误,款式过季") + elif 点数 <= 4: + self.应用效果(5, 0, 5, 8, 2, "线上款式受欢迎,客流增加") + else: + self.应用效果(15, 0, 15, 15, 5, "线上爆款,一夜成名") + else: + if 点数 <= 2: + self.应用效果(-5, 0, -3, 5, -5, "手工设计不被认可") + elif 点数 <= 4: + self.应用效果(5, 0, 3, 5, 5, "手工饰品小受欢迎") + else: + self.应用效果(20, 0, 10, 12, 15, "手工设计走红,独特风格吸引顾客") + + def 轮次2(self): + if self.verbose: + print("\n🎉 第2轮 · 开业促销") + print("请选择促销方式:") + print(" 1. 价格折扣 (快速引流,可能亏本)") + print(" 2. 社交媒体宣传 (可能爆红)") + print(" 3. 会员制度 (长期收益)") + print(" 4. 口碑营销 (稳健发展)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + if 选 == 1: + if 点数 <= 2: + self.应用效果(-5, 0, 5, -5, -3, "折扣过大,亏本赚吆喝") + elif 点数 <= 4: + self.应用效果(5, 0, 15, 5, 2, "薄利多销,客流上升") + else: + self.应用效果(10, 0, 25, 10, 5, "人气爆棚,成为话题") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-2, 0, -2, -3, -2, "宣传反响平平") + elif 点数 <= 4: + self.应用效果(5, 0, 10, 5, 5, "小有成效,客流增加") + else: + self.应用效果(20, 0, 30, 15, 15, "视频爆红,门店排长队") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(-1, 0, 0, -2, -1, "会员活动参与度低") + elif 点数 <= 4: + self.应用效果(5, 0, 5, 3, 5, "积累首批会员") + else: + self.应用效果(15, 0, 15, 8, 10, "会员激增,复购率高") + else: + if 点数 <= 2: + self.应用效果(-5, 0, -5, 3, -3, "无人问津,开业冷清") + elif 点数 <= 4: + self.应用效果(0, 0, 5, 5, 2, "平稳起步,靠口碑慢慢积累") + else: + self.应用效果(5, 0, 10, 8, 5, "口碑发酵,自然客流不错") + + def 轮次3(self): + if self.verbose: + print("\n🗣️ 第3轮 · 顾客反馈") + print("请选择处理方式:") + print(" 1. 主动更换产品 (成本高,挽回声誉)") + print(" 2. 忽略投诉 (省钱,可能流失顾客)") + print(" 3. 改进产品 (长期投资)") + print(" 4. 低调处理 (风险较低)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + if 选 == 1: + if 点数 <= 2: + self.应用效果(-5, 0, 2, -8, 5, "更换成本过高,但挽回部分声誉") + elif 点数 <= 4: + self.应用效果(5, 0, 5, -3, 10, "妥善处理,赢得信任") + else: + self.应用效果(15, 0, 10, 5, 20, "真诚态度感动顾客,品牌大涨") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-15, 0, -20, -5, -15, "口碑崩塌,顾客大量流失") + elif 点数 <= 4: + self.应用效果(-5, 0, -10, -2, -5, "部分顾客流失,负面影响") + else: + self.应用效果(-2, 0, -5, 3, -2, "少数人计较,侥幸过关") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(-5, 0, 0, -8, -2, "研发失败,资金打水漂") + elif 点数 <= 4: + self.应用效果(5, 0, 3, -5, 5, "小有改进,产品更可靠") + else: + self.应用效果(15, 0, 10, -8, 20, "技术突破,品质领先") + else: + if 点数 <= 2: + self.应用效果(-15, 0, -15, -10, -20, "被消费者曝光,形象崩塌") + elif 点数 <= 4: + self.应用效果(-3, 0, -5, -3, -5, "悄悄处理,但仍有影响") + else: + self.应用效果(-1, 0, -2, 0, -2, "侥幸过关,但埋下隐患") + + def 轮次4(self): + if self.verbose: + print("\n🏁 第4轮 · 市场竞争") + print("请选择应对策略:") + print(" 1. 价格战 (短期有效,可能亏本)") + print(" 2. 差异化定位 (长期优势)") + print(" 3. 跨界联名 (合作共赢)") + print(" 4. 提升服务 (口碑建设)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + if 选 == 1: + if 点数 <= 2: + self.应用效果(-10, 0, 5, -8, -5, "价格战亏本,客流略增") + elif 点数 <= 4: + self.应用效果(-5, 0, 10, -3, 0, "勉强稳住客流") + else: + self.应用效果(5, 0, 20, 5, 2, "价格战成功,抢回顾客") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-5, 0, -5, -3, -5, "特色不被认可") + elif 点数 <= 4: + self.应用效果(5, 0, 5, 3, 5, "吸引特定人群") + else: + self.应用效果(15, 0, 15, 8, 15, "形成独特优势") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(-5, 0, -3, -3, -3, "被对方拒绝") + elif 点数 <= 4: + self.应用效果(5, 0, 5, 3, 5, "勉强合作,客流微增") + else: + self.应用效果(15, 0, 15, 5, 10, "联名双赢,品牌提升") + else: + if 点数 <= 2: + self.应用效果(-2, 0, 2, -3, 0, "服务成本高,效果有限") + elif 点数 <= 4: + self.应用效果(5, 0, 5, 2, 5, "服务受欢迎") + else: + self.应用效果(15, 0, 15, 5, 10, "服务成招牌") + + def 轮次5(self): + if self.verbose: + print("\n📱 第5轮 · 直播风口") + print("请选择应对方式:") + print(" 1. 自己直播 (可能成为网红)") + print(" 2. 请主播带货 (成本高,可能爆红)") + print(" 3. 专注线下 (稳健发展)") + print(" 4. 短视频营销 (积累粉丝)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + if 选 == 1: + if 点数 <= 2: + self.应用效果(-5, 0, -3, -3, -2, "口才不佳,直播效果差") + elif 点数 <= 4: + self.应用效果(5, 0, 5, 3, 3, "小有收获") + else: + self.应用效果(20, 0, 20, 8, 15, "成为网红店主") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-10, 0, -5, -8, -5, "主播不负责,效果差") + elif 点数 <= 4: + self.应用效果(5, 0, 10, 5, 5, "正常销量") + else: + self.应用效果(20, 0, 30, 10, 10, "主播带火,销量暴增") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(-5, 0, -10, -5, -3, "线下受冲击") + elif 点数 <= 4: + self.应用效果(0, 0, 0, 0, 0, "维持现状") + else: + self.应用效果(5, 0, 5, 5, 5, "线下体验优势凸显") + else: + if 点数 <= 2: + self.应用效果(-2, 0, -1, -3, -1, "内容无趣") + elif 点数 <= 4: + self.应用效果(3, 0, 2, 3, 5, "少量粉丝") + else: + self.应用效果(15, 0, 15, 8, 20, "爆款视频,粉丝暴涨") + + def 轮次6(self): + if self.verbose: + print("\n🏢 第6轮 · 租金谈判") + print("请选择应对方式:") + print(" 1. 接受涨价 (短期成本高)") + print(" 2. 谈判降租 (可能成功)") + print(" 3. 换址搬迁 (风险高)") + print(" 4. 扩张分店 (压力减小)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + if 选 == 1: + if 点数 <= 2: + self.应用效果(-10, 0, -5, -10, -5, "租金过高难以承受") + elif 点数 <= 4: + self.应用效果(-2, 0, 0, -5, 0, "勉强接受") + else: + self.应用效果(0, 0, 5, 5, 2, "生意好能覆盖") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-5, 0, -3, -5, -5, "谈判破裂,关系恶化") + elif 点数 <= 4: + self.应用效果(2, 0, 0, 5, 2, "小幅降低租金") + else: + self.应用效果(10, 0, 5, 8, 5, "成功降租") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(-15, 0, -15, -8, -5, "新址更差") + elif 点数 <= 4: + self.应用效果(0, 0, -5, -5, 0, "新址一般") + else: + self.应用效果(15, 0, 20, -5, 5, "找到黄金地段") + else: + if 点数 <= 2: + self.应用效果(-20, -1, -10, -15, -10, "扩张失败,双重打击") + elif 点数 <= 4: + self.应用效果(5, 1, 0, -8, 2, "平稳开分店") + else: + self.应用效果(20, 1, 15, 5, 10, "分店成功,压力减小") + + def 轮次7(self): + if self.verbose: + print("\n🔥 第7轮 · 爆款机遇") + print("请选择应对策略:") + print(" 1. 大量备货 (可能积压)") + print(" 2. 饥饿营销 (制造稀缺)") + print(" 3. 提价销售 (增加利润)") + print(" 4. 开发衍生品 (扩大收益)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + if 选 == 1: + if 点数 <= 2: + self.应用效果(-10, 0, -5, -10, -5, "热度过去,积压库存") + elif 点数 <= 4: + self.应用效果(15, 0, 10, 10, 10, "抓住机会,销量大增") + else: + self.应用效果(25, 0, 15, 20, 20, "成为经典爆款") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-5, 0, -10, 3, 0, "顾客买不到,转向别家") + elif 点数 <= 4: + self.应用效果(10, 0, 5, 8, 10, "饥饿营销成功") + else: + self.应用效果(20, 0, 25, 12, 20, "引发抢购热潮") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(-15, 0, -15, 5, -10, "顾客反感,口碑下降") + elif 点数 <= 4: + self.应用效果(0, 0, -2, 10, -5, "小幅提价,利润增加") + else: + self.应用效果(5, 0, 0, 15, 0, "提价成功") + else: + if 点数 <= 2: + self.应用效果(-5, 0, -2, -5, 0, "衍生品无人问津") + elif 点数 <= 4: + self.应用效果(10, 0, 5, 8, 5, "衍生品小受欢迎") + else: + self.应用效果(20, 0, 10, 15, 15, "衍生品也成爆款") + + def 轮次8(self): + if self.verbose: + print("\n🔄 第8轮 · 市场变化") + if self.店铺类型 == "古法金饰店": + print("请选择应对方式:") + print(" 1. 深耕黄金市场 (巩固优势)") + print(" 2. 坚持原创设计 (长期优势)") + print(" 3. 提升服务体验 (口碑建设)") + print(" 4. 清仓回笼资金 (现金为王)") + else: + print("请选择应对方式:") + print(" 1. 转型黄金饰品 (风险高)") + print(" 2. 坚持原创设计 (长期优势)") + print(" 3. 提升服务体验 (口碑建设)") + print(" 4. 清仓回笼资金 (现金为王)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + + if 选 == 1: + if self.店铺类型 == "古法金饰店": + if 点数 <= 2: + self.应用效果(-5, 0, -5, -8, -5, "市场饱和,增长乏力") + elif 点数 <= 4: + self.应用效果(8, 0, 5, 5, 5, "稳步发展,保持优势") + else: + self.应用效果(20, 0, 10, 12, 15, "成为黄金饰品标杆") + else: + if 点数 <= 2: + self.应用效果(-15, 0, -5, -10, -5, "转型失败,两头不讨好") + elif 点数 <= 4: + self.应用效果(5, 0, 5, -5, 5, "部分转型,保留原业务") + else: + self.应用效果(20, 0, 10, -5, 10, "成功转型黄金饰品") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-10, 0, -10, -5, -5, "设计被忽视") + elif 点数 <= 4: + self.应用效果(5, 0, -5, 3, 5, "核心顾客支持") + else: + self.应用效果(15, 0, 10, 5, 15, "设计逆袭") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(-2, 0, 0, -3, 0, "服务不受欢迎") + elif 点数 <= 4: + self.应用效果(5, 0, 5, 3, 5, "服务增加粘性") + else: + self.应用效果(15, 0, 10, 5, 10, "服务成特色") + else: + if 点数 <= 2: + self.应用效果(-15, 0, -10, -5, -20, "清仓亏本,品牌大跌") + elif 点数 <= 4: + self.应用效果(0, 0, -5, 10, -5, "平稳清仓") + else: + self.应用效果(5, 0, -2, 15, -10, "清仓成功,现金充足") + + def 轮次9(self): + if self.verbose: + print("\n⚠️ 第9轮 · 内部危机") + print("请选择应对方式:") + print(" 1. 挽留设计师 (成本高)") + print(" 2. 培养新人 (长期投资)") + print(" 3. 外包设计 (降低成本)") + print(" 4. 改革制度 (风险高)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + if 选 == 1: + if 点数 <= 2: + self.应用效果(-10, 0, -5, -15, 5, "设计师回归但成本过高") + elif 点数 <= 4: + self.应用效果(0, 0, 0, -10, 10, "设计师回归,稳定局面") + else: + self.应用效果(10, 0, 5, -5, 20, "设计师带回新资源") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-10, 0, -10, -5, -10, "新人能力不足,客户流失") + elif 点数 <= 4: + self.应用效果(0, 0, -5, -3, 5, "新人勉强胜任") + else: + self.应用效果(10, 0, 5, 3, 15, "新人带来新灵感") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(-5, 0, -3, -5, -5, "外包设计质量差") + elif 点数 <= 4: + self.应用效果(3, 0, 0, -3, 2, "外包设计及格") + else: + self.应用效果(8, 0, 5, -5, 8, "外包设计出彩") + else: + if 点数 <= 2: + self.应用效果(-15, 0, -10, -8, -10, "改革失败,老客不满") + elif 点数 <= 4: + self.应用效果(0, 0, -5, -5, 5, "改革缓慢推进") + else: + self.应用效果(15, 0, 10, -5, 20, "改革成功,焕然一新") + + def 轮次10(self): + if self.verbose: + print("\n🏁 第10轮 · 最后冲刺") + print("请选择最后策略:") + print(" 1. 扩张分店 (可能成功或失败)") + print(" 2. 打造网红店 (可能成为地标)") + print(" 3. 高位套现 (出售店铺)") + print(" 4. 稳健经营 (维持现状)") + + if self.manual: + 选 = int(input("请输入选择 (1-4): ")) + else: + 选 = random.randint(1, 4) + + if self.manual: + 点数 = int(input("请输入骰子点数 (1-6): ")) + else: + 点数 = random.randint(1, 6) + if self.verbose: + print(f" 选择: {选} 点数: {点数}") + if 选 == 1: + if 点数 <= 2: + self.应用效果(-30, -2, -10, -15, -15, "盲目扩张导致崩溃") + elif 点数 <= 4: + self.应用效果(10, 1, 5, -8, 5, "稳健扩张") + else: + self.应用效果(20, 2, 10, 5, 10, "成功扩张,分店增加") + elif 选 == 2: + if 点数 <= 2: + self.应用效果(-5, 0, -5, -5, -5, "网红热度难持久") + elif 点数 <= 4: + self.应用效果(10, 0, 10, 5, 10, "成为小有名气的网红店") + else: + self.应用效果(20, 0, 20, 10, 20, "成为城市地标") + elif 选 == 3: + if 点数 <= 2: + self.应用效果(5, 0, 0, 15, -10, "低价出售") + elif 点数 <= 4: + self.应用效果(15, 0, 0, 30, -5, "合理价格出售") + else: + self.应用效果(30, 0, 0, 45, 0, "高价套现") + else: + if 点数 <= 2: + self.应用效果(-10, 0, -5, -5, -3, "经营困难") + elif 点数 <= 4: + self.应用效果(0, 0, 0, 0, 0, "平稳维持") + else: + self.应用效果(5, 0, 2, 5, 2, "略有盈余") + + def 判断结局(self): + if self.verbose: + print("\n" + "=" * 60) + print("🏆 游戏结束!最终结局判定") + print("=" * 60) + + 综合评分 = self.分数 + self.现金流 // 5 + + if 综合评分 >= 100 and self.分店数 >= 3: + 结局 = "连锁之巅·品牌霸主" + 描述 = "你打造了饰品帝国,成为行业标杆,分店遍布全国!" + elif 综合评分 >= 90 and self.品牌价值 > 70: + 结局 = "直播涅槃·流量新生" + 描述 = "你成功转型直播带货,线上线下融合,流量源源不断!" + elif 综合评分 >= 85: + 结局 = "高位套现·全身而退" + 描述 = "你在市场高点卖出店铺,带着财富优雅离场。" + elif 75 <= 综合评分 < 85: + 结局 = "社区之光·网红传奇" + 描述 = "你成为社区网红店,虽然规模不大但口碑极佳。" + elif 65 <= 综合评分 < 75: + 结局 = "收支平衡·情怀续航" + 描述 = "勉强维持经营,靠着一份情怀继续坚持。" + elif 55 <= 综合评分 < 65: + 结局 = "薄利长流·黄金微光" + 描述 = "微利经营,如同黄金微光般微弱但持续,细水长流。" + elif 35 <= 综合评分 < 55: + 结局 = "同质困局·黯然退场" + 描述 = "设计缺乏创新,被市场淘汰,最终黯然关门。" + elif 20 <= 综合评分 < 35: + 结局 = "租金绞杀·数据废墟" + 描述 = "高租金压垮了你的梦想,店铺变成数据废墟。" + elif 0 <= 综合评分 < 20: + 结局 = "品牌贬值·二手踩踏" + 描述 = "品牌价值归零,二手市场10元回收都没人要。" + else: + 结局 = "降级求生·缩水危机" + 描述 = "从门店沦为柜台,最终消失在商场角落。" + + if self.verbose: + print(f"\n✨ 结局: {结局}") + print(f"📖 {描述}") + print(f"📊 最终数据 - 综合评分:{综合评分} 分数:{self.分数} 现金流:{self.现金流} 分店:{self.分店数} 品牌:{self.品牌价值}") + print(f"\n💰 最终奖励: {self.现金流} 万") + print("\n📜 经营大事记:") + for i, 事 in enumerate(self.事件记录[-5:], 1): + print(f" {i}. {事}") + return 结局 + + def 运行(self, verbose=False): + self.verbose = verbose + self.选择店铺类型() + while self.轮数 < self.总轮数: + self.轮数 += 1 + self.显示状态() + 剧情函数 = getattr(self, f"轮次{self.轮数}", None) + if 剧情函数: + 剧情函数() + else: + if self.verbose: + print(f"错误:未定义第{self.轮数}轮剧情") + break + # 自然波动 + self.分数 += random.randint(-1, 2) + self.分数 = max(0, self.分数) + if self.verbose: + print() # 加一个空行分隔轮次 + self.显示状态() + 结局 = self.判断结局() + if self.verbose: + print("\n" + "=" * 60) + print("模拟完成!") + return self.分数, self.现金流, 结局 + +if __name__ == "__main__": + print("=" * 60) + print("饰品大亨 - 游戏模式选择") + print("=" * 60) + print("1. 手动游玩模式") + print("2. 自动模拟模式 (运行10000次)") + + 模式 = input("\n请选择模式 (1/2): ").strip() + + if 模式 == "1": + print("\n开始手动游玩模式!") + 游戏 = 饰品大亨(verbose=True, manual=True) + 游戏.运行(verbose=True) + else: + print("\n开始自动模拟模式...") + # 运行10000次模拟,统计平均分数和众数 + random.seed(time.time()) + scores = [] + cashflows = [] + 综合评分列表 = [] + outcomes = [] + for i in range(100000): + 游戏 = 饰品大亨(verbose=False) + 分数, 现金流, 结局 = 游戏.运行(verbose=False) + scores.append(分数) + cashflows.append(现金流) + 综合评分列表.append(分数 + 现金流 // 5) + outcomes.append(结局) + if (i+1) % 1000 == 0: + print(f"已完成 {i+1} 次模拟...") + + # 总体统计 + 平均分 = sum(scores) / len(scores) + 分数众数 = Counter(scores).most_common(1)[0][0] + 分数众数次数 = Counter(scores).most_common(1)[0][1] + 平均现金流 = sum(cashflows) / len(cashflows) + 现金流众数 = Counter(cashflows).most_common(1)[0][0] + 现金流众数次数 = Counter(cashflows).most_common(1)[0][1] + 平均综合评分 = sum(综合评分列表) / len(综合评分列表) + 综合评分众数 = Counter(综合评分列表).most_common(1)[0][0] + 综合评分众数次数 = Counter(综合评分列表).most_common(1)[0][1] + + print(f"\n=== 100000次模拟总体统计 ===") + print(f"平均分数: {平均分:.2f}") + print(f"分数众数: {分数众数} (出现 {分数众数次数} 次)") + print(f"平均现金流: {平均现金流:.2f}") + print(f"现金流众数: {现金流众数} (出现 {现金流众数次数} 次)") + print(f"平均综合评分: {平均综合评分:.2f}") + print(f"综合评分众数: {综合评分众数} (出现 {综合评分众数次数} 次)") + + # 各结局统计 + 结局统计 = {} + for 结局, 分数, 现金流, 综合评分 in zip(outcomes, scores, cashflows, 综合评分列表): + if 结局 not in 结局统计: + 结局统计[结局] = {'分数': [], '现金流': [], '综合评分': []} + 结局统计[结局]['分数'].append(分数) + 结局统计[结局]['现金流'].append(现金流) + 结局统计[结局]['综合评分'].append(综合评分) + + # 计算全局最大最小值 + 最大分数 = max(scores) + 最小分数 = min(scores) + 最大现金流 = max(cashflows) + 最小现金流 = min(cashflows) + + print(f"\n=== 全局统计 ===") + print(f"分数 - 最大值: {最大分数}, 最小值: {最小分数}") + print(f"现金流 - 最大值: {最大现金流}, 最小值: {最小现金流}") + + print(f"\n=== 各结局详细统计 ===") + print(f"{'结局':<30} {'次数':>6} {'平均分':>8} {'分数众数':>8} {'平均现金流':>10} {'现金流众数':>10}") + print("-" * 82) + for 结局, 次数 in Counter(outcomes).most_common(): + 分数列表 = 结局统计[结局]['分数'] + 现金流列表 = 结局统计[结局]['现金流'] + 综合评分列表 = 结局统计[结局]['综合评分'] + 平均分 = sum(分数列表) / len(分数列表) + 分数众数 = Counter(分数列表).most_common(1)[0][0] + 平均现金流 = sum(现金流列表) / len(现金流列表) + 现金流众数 = Counter(现金流列表).most_common(1)[0][0] + 平均综合评分 = sum(综合评分列表) / len(综合评分列表) + 综合评分众数 = Counter(综合评分列表).most_common(1)[0][0] + + print(f"{结局:<30} {次数:>6} {平均分:>8.2f} {分数众数:>8} {平均现金流:>10.2f} {现金流众数:>10}") + + 最大次数 = Counter(outcomes).most_common(1)[0][1] + 最常结局 = [结局 for 结局, 次数 in Counter(outcomes).items() if 次数 == 最大次数] + print(f"\n最常出现的结局: {'、'.join(最常结局)} (出现 {最大次数} 次)") \ No newline at end of file