From 5a2d39293d8eb4967219db851d7217f99d074c69 Mon Sep 17 00:00:00 2001 From: ChuXun <70203584+ChuXunYu@users.noreply.github.com> Date: Sun, 7 Dec 2025 22:53:46 +0800 Subject: [PATCH] Initial commit --- .gitattributes | 2 + README.md | 103 ++++ app.js | 12 + app.json | 15 + app.wxss | 48 ++ components/HistoryModal/HistoryModal.js | 35 ++ components/HistoryModal/HistoryModal.json | 4 + components/HistoryModal/HistoryModal.wxml | 17 + components/HistoryModal/HistoryModal.wxss | 111 ++++ data/crisisEvents.json | 74 +++ data/strategies.json | 98 ++++ pages/index/index.js | 199 +++++++ pages/index/index.json | 4 + pages/index/index.wxml | 58 ++ pages/index/index.wxss | 151 ++++++ pages/result/result.js | 252 +++++++++ pages/result/result.json | 4 + pages/result/result.wxml | 83 +++ pages/result/result.wxss | 479 +++++++++++++++++ pages/strategy/strategy.js | 419 +++++++++++++++ pages/strategy/strategy.json | 6 + pages/strategy/strategy.wxml | 133 +++++ pages/strategy/strategy.wxss | 625 ++++++++++++++++++++++ project.config.json | 59 ++ project.private.config.json | 24 + sitemap.json | 7 + 内容.md | 166 ++++++ 27 files changed, 3188 insertions(+) create mode 100644 .gitattributes create mode 100644 README.md create mode 100644 app.js create mode 100644 app.json create mode 100644 app.wxss create mode 100644 components/HistoryModal/HistoryModal.js create mode 100644 components/HistoryModal/HistoryModal.json create mode 100644 components/HistoryModal/HistoryModal.wxml create mode 100644 components/HistoryModal/HistoryModal.wxss create mode 100644 data/crisisEvents.json create mode 100644 data/strategies.json create mode 100644 pages/index/index.js create mode 100644 pages/index/index.json create mode 100644 pages/index/index.wxml create mode 100644 pages/index/index.wxss create mode 100644 pages/result/result.js create mode 100644 pages/result/result.json create mode 100644 pages/result/result.wxml create mode 100644 pages/result/result.wxss create mode 100644 pages/strategy/strategy.js create mode 100644 pages/strategy/strategy.json create mode 100644 pages/strategy/strategy.wxml create mode 100644 pages/strategy/strategy.wxss create mode 100644 project.config.json create mode 100644 project.private.config.json create mode 100644 sitemap.json create mode 100644 内容.md diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/README.md b/README.md new file mode 100644 index 0000000..98b6909 --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +# 边区危机应对策略小游戏 + +## 项目介绍 + +"边区危机应对策略小游戏"是一款基于微信小程序平台开发的教育类游戏,旨在模拟抗日战争时期根据地经济危机管理的历史决策场景。游戏通过交互式的方式,让用户扮演历史决策者的角色,面对不同类型的经济危机(如伪币冲击、物资短缺、汇率波动等),制定和实施多轮战略决策,并基于历史经验进行评价与反馈。 + +## 功能特点 + +- **多轮策略选择**:玩家可以分三轮选择不同类型的策略(经济手段、行政手段、群众动员),每轮选择后会获得历史案例参考 +- **策略标记系统**:已使用的策略会被标记,防止重复选择,确保决策多样性 +- **实时反馈机制**:每选择一个策略后,会立即展示相关历史案例,提供学习参考 +- **结果评估系统**:基于选择的策略组合进行综合评分,展示不同程度的结果(完美应对、有效应对、基本应对、应对失败) +- **历史经验总结**:结果页面提供基于事件类型和所选策略的历史经验总结,加深用户对历史的理解 +- **优化的用户体验**:精心设计的界面动效、交互反馈和视觉效果,让学习过程更加生动有趣 + +## 技术架构 + +本项目基于微信小程序原生框架开发,主要技术特点包括: + +- **WXML/WXSS/JS结构**:采用微信小程序标准的组件化开发方式 +- **数据驱动视图**:基于小程序的数据绑定机制,实现界面与数据的同步更新 +- **自定义动画效果**:通过CSS3动画提升用户体验 +- **事件驱动逻辑**:基于事件处理实现交互逻辑 +- **全局状态管理**:使用App全局数据存储游戏进程信息 + +## 项目结构 + +``` +war/ +│ +├── app.js # 应用程序入口文件 +├── app.json # 应用程序配置文件 +├── app.wxss # 应用程序全局样式 +│ +├── pages/ # 页面目录 +│ ├── index/ # 首页(事件选择) +│ ├── strategy/ # 策略选择页面 +│ └── result/ # 结果评估页面 +│ +├── images/ # 图片资源 +└── utils/ # 工具函数 +``` + +## 使用方法 + +1. **选择危机事件**:在首页选择面临的危机事件类型(伪币冲击、物资短缺或汇率波动) +2. **多轮策略选择**: + - 第一轮选择"初期应对"策略 + - 第二轮选择"中期调整"策略 + - 第三轮选择"后期加强"策略 +3. **查看历史案例**:每选择一个策略后,会弹出相关历史案例供学习参考 +4. **查看评估结果**:完成三轮策略选择后,系统会综合评估决策效果,显示分数和历史经验总结 + +## 核心算法 + +策略评估算法考虑了以下因素: + +1. **策略适用性**:所选策略是否适用于当前危机类型 +2. **策略组合**:是否采用了多种类型的策略(经济、行政、群众动员) +3. **策略时机**:某些策略在危机早期使用效果更佳 +4. **历史借鉴**:策略是否符合历史经验 + +根据以上因素计算综合得分,并给出相应的评价结果。 + +## 开发与优化 + +项目进行了以下优化: + +1. **性能优化**: + - 使用延迟加载和状态处理,减少不必要的渲染 + - 优化页面切换动画效果,提高流畅度 + +2. **用户体验优化**: + - 添加加载状态提示 + - 优化按钮反馈效果 + - 丰富动画交互效果 + - 增加操作引导和提示 + +3. **代码优化**: + - 模块化设计,提高代码复用性 + - 统一样式管理,保持界面风格一致性 + +## 历史背景 + +本游戏基于抗日战争时期各抗日民主根据地的实际历史经验开发。在艰苦的战争环境下,根据地面临各种经济危机,如敌人封锁、伪币冲击、物资短缺等。边区政府采取了灵活多样的经济政策和措施,成功应对了这些危机,保障了军民基本生活需求和抗战的持续进行。 + +这段历史经验是中国共产党领导经济建设的重要实践,也是我党在复杂环境下进行经济治理的宝贵经验。 + +## 未来计划 + +1. 增加更多类型的历史危机事件 +2. 添加更详细的历史案例资料 +3. 引入排行榜和分享功能 +4. 优化界面设计和用户体验 +5. 增加更多的历史照片和资料 + +## 反馈与联系 + +如有任何问题或建议,欢迎联系我们。感谢您对历史教育游戏的支持! + +--- + +© 2023 边区危机应对策略小游戏 - 历史教育游戏项目 \ No newline at end of file diff --git a/app.js b/app.js new file mode 100644 index 0000000..d0074d0 --- /dev/null +++ b/app.js @@ -0,0 +1,12 @@ +// app.js +App({ + onLaunch: function () { + console.log('应用启动'); + }, + globalData: { + selectedEvent: null, + selectedStrategies: [], + currentRound: 0, + maxRounds: 3 + } +}) \ No newline at end of file diff --git a/app.json b/app.json new file mode 100644 index 0000000..73c2dc5 --- /dev/null +++ b/app.json @@ -0,0 +1,15 @@ +{ + "pages": [ + "pages/index/index", + "pages/strategy/strategy", + "pages/result/result" + ], + "window": { + "backgroundTextStyle": "light", + "navigationBarBackgroundColor": "#8B0000", + "navigationBarTitleText": "边币战争", + "navigationBarTextStyle": "white" + }, + "style": "v2", + "sitemapLocation": "sitemap.json" +} \ No newline at end of file diff --git a/app.wxss b/app.wxss new file mode 100644 index 0000000..df3863c --- /dev/null +++ b/app.wxss @@ -0,0 +1,48 @@ +/**app.wxss**/ +page { + font-family: 'Microsoft YaHei', Arial, sans-serif; + background-color: #F8F8F8; + font-size: 16px; + color: #333; +} + +.container { + padding: 20rpx; + box-sizing: border-box; +} + +.card { + background: #fff; + border-radius: 8rpx; + box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1); + margin-bottom: 20rpx; + padding: 20rpx; +} + +.title { + font-size: 18px; + font-weight: bold; + margin-bottom: 20rpx; + color: #8B0000; +} + +.btn { + background: #8B0000; + color: #fff; + border-radius: 8rpx; + padding: 20rpx 0; + text-align: center; + font-size: 16px; + margin: 20rpx 0; +} + +.btn-outline { + background: #fff; + color: #8B0000; + border: 1px solid #8B0000; +} + +.vintage-bg { + background-color: #F9F2E6; + background-image: url("data:image/svg+xml,%3Csvg width='100' height='100' viewBox='0 0 100 100' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M11 18c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm48 25c3.866 0 7-3.134 7-7s-3.134-7-7-7-7 3.134-7 7 3.134 7 7 7zm-43-7c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm63 31c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM34 90c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zm56-76c1.657 0 3-1.343 3-3s-1.343-3-3-3-3 1.343-3 3 1.343 3 3 3zM12 86c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm28-65c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm23-11c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-6 60c2.21 0 4-1.79 4-4s-1.79-4-4-4-4 1.79-4 4 1.79 4 4 4zm29 22c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zM32 63c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm57-13c2.76 0 5-2.24 5-5s-2.24-5-5-5-5 2.24-5 5 2.24 5 5 5zm-9-21c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM60 91c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM35 41c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2zM12 60c1.105 0 2-.895 2-2s-.895-2-2-2-2 .895-2 2 .895 2 2 2z' fill='%238b0000' fill-opacity='0.05' fill-rule='evenodd'/%3E%3C/svg%3E"); +} \ No newline at end of file diff --git a/components/HistoryModal/HistoryModal.js b/components/HistoryModal/HistoryModal.js new file mode 100644 index 0000000..156a12f --- /dev/null +++ b/components/HistoryModal/HistoryModal.js @@ -0,0 +1,35 @@ +Component({ + /** + * 组件的属性列表 + */ + properties: { + show: { + type: Boolean, + value: false + }, + historyCase: { + type: Object, + value: null + } + }, + + /** + * 组件的初始数据 + */ + data: { + + }, + + /** + * 组件的方法列表 + */ + methods: { + closeModal: function() { + this.triggerEvent('close'); + }, + + preventBubble: function(e) { + // 阻止冒泡,防止点击内容区域关闭模态框 + } + } +}) \ No newline at end of file diff --git a/components/HistoryModal/HistoryModal.json b/components/HistoryModal/HistoryModal.json new file mode 100644 index 0000000..b8c1f40 --- /dev/null +++ b/components/HistoryModal/HistoryModal.json @@ -0,0 +1,4 @@ +{ + "component": true, + "usingComponents": {} +} \ No newline at end of file diff --git a/components/HistoryModal/HistoryModal.wxml b/components/HistoryModal/HistoryModal.wxml new file mode 100644 index 0000000..946cd22 --- /dev/null +++ b/components/HistoryModal/HistoryModal.wxml @@ -0,0 +1,17 @@ + + + + + 历史案例参考 + × + + + {{historyCase.title}} + + {{historyCase.description}} + + + 了解了 + + + \ No newline at end of file diff --git a/components/HistoryModal/HistoryModal.wxss b/components/HistoryModal/HistoryModal.wxss new file mode 100644 index 0000000..83277ea --- /dev/null +++ b/components/HistoryModal/HistoryModal.wxss @@ -0,0 +1,111 @@ +/* components/HistoryModal/HistoryModal.wxss */ +.modal-mask { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.6); + display: flex; + justify-content: center; + align-items: center; + z-index: 999; +} + +.modal-content { + width: 80%; + background: #fff; + border-radius: 10rpx; + overflow: hidden; + box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.2); + animation: modalShow 0.3s ease; +} + +@keyframes modalShow { + from { + opacity: 0; + transform: scale(0.9); + } + to { + opacity: 1; + transform: scale(1); + } +} + +.modal-header { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20rpx; + border-bottom: 1px solid #eee; + background-color: #F9F2E6; +} + +.modal-title { + font-size: 32rpx; + font-weight: bold; + color: #8B0000; +} + +.modal-close { + font-size: 36rpx; + color: #999; + width: 60rpx; + height: 60rpx; + display: flex; + justify-content: center; + align-items: center; +} + +.modal-body { + padding: 30rpx; +} + +.case-title { + font-size: 30rpx; + font-weight: bold; + margin-bottom: 20rpx; + text-align: center; + color: #333; +} + +.case-image { + width: 100%; + height: 320rpx; + margin-bottom: 20rpx; + background-color: #f0f0f0; + display: flex; + justify-content: center; + align-items: center; + position: relative; +} + +.case-image::after { + content: "历史案例图片"; + color: #999; + font-size: 28rpx; +} + +.case-desc { + font-size: 28rpx; + color: #666; + line-height: 1.5; + text-align: justify; +} + +.modal-footer { + padding: 20rpx; + display: flex; + justify-content: center; + border-top: 1px solid #eee; + background-color: #F9F2E6; +} + +.btn { + background: #8B0000; + color: #fff; + border-radius: 8rpx; + padding: 20rpx 60rpx; + text-align: center; + font-size: 28rpx; +} \ No newline at end of file diff --git a/data/crisisEvents.json b/data/crisisEvents.json new file mode 100644 index 0000000..abd04a5 --- /dev/null +++ b/data/crisisEvents.json @@ -0,0 +1,74 @@ +[ + { + "id": "fake_currency_1", + "type": "fakeCurrency", + "title": "伪币冲击:初级", + "description": "敌方在根据地周边地区投放少量伪造边币,市场上开始出现伪币流通现象", + "level": 1, + "impact": "市场信心轻微下降,边币贬值风险较小" + }, + { + "id": "fake_currency_2", + "type": "fakeCurrency", + "title": "伪币冲击:中级", + "description": "敌方增加伪造边币投放力度,市场上伪币数量明显增加,造成一定混乱", + "level": 2, + "impact": "市场交易受阻,边币信任度下降,贸易活动减少" + }, + { + "id": "fake_currency_3", + "type": "fakeCurrency", + "title": "伪币冲击:高级", + "description": "敌方大规模投放高仿真度伪币,市场已难以分辨真伪,货币混乱严重", + "level": 3, + "impact": "边币严重贬值,市场恐慌,经济活动受到重创" + }, + { + "id": "shortage_1", + "type": "shortage", + "title": "物资短缺:初级", + "description": "部分生活必需品供应不足,市场价格开始上涨", + "level": 1, + "impact": "物价小幅上涨,边币购买力略有下降" + }, + { + "id": "shortage_2", + "type": "shortage", + "title": "物资短缺:中级", + "description": "多种生活必需品严重短缺,黑市交易开始活跃", + "level": 2, + "impact": "物价大幅上涨,边币购买力明显下降,民众不满情绪增加" + }, + { + "id": "shortage_3", + "type": "shortage", + "title": "物资短缺:高级", + "description": "根据地被敌军封锁,几乎所有物资都极度匮乏", + "level": 3, + "impact": "物价飞涨,边币几近崩溃,根据地经济面临瘫痪" + }, + { + "id": "exchange_1", + "type": "exchange", + "title": "汇率波动:初级", + "description": "边币对法币汇率小幅波动,交易活动受到轻微影响", + "level": 1, + "impact": "边币信心略有动摇,边区与外界贸易略受影响" + }, + { + "id": "exchange_2", + "type": "exchange", + "title": "汇率波动:中级", + "description": "边币对法币汇率大幅下跌,边区与外界贸易受阻", + "level": 2, + "impact": "边币信心受挫,边区经济受到较大冲击" + }, + { + "id": "exchange_3", + "type": "exchange", + "title": "汇率波动:高级", + "description": "边币对法币汇率暴跌,边区与外界经济联系几乎中断", + "level": 3, + "impact": "边币信心崩溃,边区经济面临严重危机" + } +] \ No newline at end of file diff --git a/data/strategies.json b/data/strategies.json new file mode 100644 index 0000000..1d295d2 --- /dev/null +++ b/data/strategies.json @@ -0,0 +1,98 @@ +{ + "economic": [ + { + "id": "economic_1", + "title": "调整边币兑换率", + "description": "通过合理调整边币与法币的兑换率,稳定币值", + "applicable": ["exchange", "fakeCurrency"], + "historyCase": { + "title": "1943年陕甘宁边区调整币值案例", + "description": "1943年初,陕甘宁边区政府面对法币贬值和边币信任危机,通过灵活调整边币与法币的兑换率,维护了边币的市场地位。边区银行在延安、安塞等地设立汇兑所,按照新兑换率进行操作,确保边区经济稳定运行,有效应对了币值波动,保障了边区军民的日常生活需求。" + } + }, + { + "id": "economic_2", + "title": "紧缩货币发行", + "description": "减少边币发行量,提高现有边币价值", + "applicable": ["exchange", "fakeCurrency", "shortage"], + "historyCase": { + "title": "1944年晋察冀边区紧缩货币政策", + "description": "1944年,晋察冀边区面临严重的通货膨胀威胁,决定实施紧缩货币政策。边区政府减少新币发行,严格控制财政支出,同时鼓励民众储蓄。这些措施有效控制了货币流通量,提高了边币价值,稳定了物价,为边区经济发展和军事斗争提供了有力的后方支持。" + } + }, + { + "id": "economic_3", + "title": "建立物资储备", + "description": "组织经济战备,储备重要物资以稳定物价", + "applicable": ["shortage", "exchange"], + "historyCase": { + "title": "1942年晋察冀边区物资储备计划", + "description": "1942年,晋察冀边区政府实施了系统的物资储备计划,建立了多处秘密仓库储存粮食、食盐、药品等战略物资。这些储备在国民党经济封锁期间发挥了关键作用,通过适时投放市场,有效平抑了物价波动,维护了边币价值,保障了军民基本生活,增强了边区人民对党和政府的信任。" + } + } + ], + "administrative": [ + { + "id": "admin_1", + "title": "查抄伪币窝点", + "description": "派出工作组和武装力量,打击伪造边币的犯罪活动", + "applicable": ["fakeCurrency"], + "historyCase": { + "title": "1941年晋冀鲁豫边区打击伪币行动", + "description": "1941年,晋冀鲁豫边区政府针对敌人大量制造伪币的行为,组织了一次大规模的打击行动。公安部门与地方武装配合,经过缜密侦查,成功捣毁多个伪币制造点,逮捕制造伪币的敌特分子,缴获大量制币工具和伪造的边币。这次行动极大地打击了敌人的伪币活动,维护了边币的信誉和流通秩序。" + } + }, + { + "id": "admin_2", + "title": "实施物资配给", + "description": "对关键物资实行统一配给制度,确保公平分配", + "applicable": ["shortage"], + "historyCase": { + "title": "1945年山东解放区物资配给制度", + "description": "1945年,山东解放区在物资极度匮乏的情况下,建立了完善的物资配给制度。政府按照家庭人口和特殊需求,公平分配粮食、布匹等生活必需品,防止市场投机和物价暴涨。同时,对军队、医院和学校等重点单位给予优先保障。这一制度不仅保障了军民基本生活,还稳定了边币价值,维护了社会稳定。" + } + }, + { + "id": "admin_3", + "title": "设立边币管理委员会", + "description": "成立专门机构,统一协调货币政策和币值稳定措施", + "applicable": ["fakeCurrency", "exchange", "shortage"], + "historyCase": { + "title": "1940年陕甘宁边区货币管理委员会", + "description": "1940年,陕甘宁边区成立了货币管理委员会,由财政、银行、贸易等部门负责人组成,统一协调边区货币政策。委员会制定了边币流通范围、兑换标准和防伪措施,定期研究解决货币流通中的问题,监控物价变化。这一机构的设立,使边区货币管理更加科学规范,有力支持了抗战和经济建设,成为其他解放区的借鉴。" + } + } + ], + "mobilization": [ + { + "id": "mob_1", + "title": "开展拒用伪币宣传", + "description": "通过各种渠道向民众普及伪币识别知识,动员群众拒绝使用伪币", + "applicable": ["fakeCurrency"], + "historyCase": { + "title": "1943年冀中群众性反伪币运动", + "description": "1943年,冀中地区开展了声势浩大的反伪币宣传运动。边区政府印制了大量图文并茂的宣传品,详细介绍真伪边币的区别;组织文艺队编排快板、小戏进行巡回演出;在集市上设立辨别真伪币展示点。通过这些群众喜闻乐见的方式,使民众掌握了识别伪币的技能,自觉抵制伪币流通,大大减少了伪币对边区经济的危害。" + } + }, + { + "id": "mob_2", + "title": "组织互助合作", + "description": "发动群众组建互助组和合作社,共同应对物资短缺", + "applicable": ["shortage"], + "historyCase": { + "title": "1942年抗日民主根据地互助合作运动", + "description": "1942年,面对严重的物资短缺,多个抗日根据地广泛开展了互助合作运动。农民组成互助组共同生产,村与村之间建立物资交换网络,根据地还成立了消费合作社,统一采购和分配生活必需品。这些自下而上的组织形式,有效整合了有限资源,提高了生产效率,缓解了物资短缺问题,增强了民众的团结协作精神。" + } + }, + { + "id": "mob_3", + "title": "开展爱用边币运动", + "description": "动员群众积极使用边币,增强对根据地货币的信心", + "applicable": ["exchange", "fakeCurrency"], + "historyCase": { + "title": "1944年晋冀鲁豫边区爱用边币运动", + "description": "1944年,晋冀鲁豫边区开展了广泛的爱用边币运动。政府机关带头使用边币发放工资和采购物资;商会组织商户签订自觉使用边币公约;学校教育学生了解边币的重要性。通过这场运动,边币的使用范围不断扩大,民众对边币的信心显著增强,有力抵制了敌人破坏边区金融的图谋,为根据地经济稳定和军事斗争提供了有力支持。" + } + } + ] +} \ No newline at end of file diff --git a/pages/index/index.js b/pages/index/index.js new file mode 100644 index 0000000..52523b4 --- /dev/null +++ b/pages/index/index.js @@ -0,0 +1,199 @@ +const app = getApp() + +Page({ + data: { + crisisEvents: [] + }, + + onLoad: function() { + const that = this; + // 加载危机事件数据 + wx.getFileSystemManager().readFile({ + filePath: `${wx.env.USER_DATA_PATH}/data/crisisEvents.json`, + encoding: 'utf-8', + success: res => { + try { + const data = JSON.parse(res.data); + that.setData({ + crisisEvents: data + }); + } catch (e) { + console.error('解析危机事件数据失败', e); + // 如果读取本地失败,则使用示例数据 + that.setData({ + crisisEvents: [ + { + id: 'fake_currency_1', + type: 'fakeCurrency', + title: '伪币冲击:初级', + description: '敌方在根据地周边地区投放少量伪造边币,市场上开始出现伪币流通现象', + level: 1, + impact: '市场信心轻微下降,边币贬值风险较小' + }, + { + id: 'fake_currency_2', + type: 'fakeCurrency', + title: '伪币冲击:中级', + description: '敌方增加伪造边币投放力度,市场上伪币数量明显增加,造成一定混乱', + level: 2, + impact: '市场交易受阻,边币信任度下降,贸易活动减少' + }, + { + id: 'fake_currency_3', + type: 'fakeCurrency', + title: '伪币冲击:高级', + description: '敌方大规模投放高仿真度伪币,市场已难以分辨真伪,货币混乱严重', + level: 3, + impact: '边币严重贬值,市场恐慌,经济活动受到重创' + }, + { + id: 'shortage_1', + type: 'shortage', + title: '物资短缺:初级', + description: '部分生活必需品供应不足,市场价格开始上涨', + level: 1, + impact: '物价小幅上涨,边币购买力略有下降' + }, + { + id: 'shortage_2', + type: 'shortage', + title: '物资短缺:中级', + description: '多种生活必需品严重短缺,黑市交易开始活跃', + level: 2, + impact: '物价大幅上涨,边币购买力明显下降,民众不满情绪增加' + }, + { + id: 'shortage_3', + type: 'shortage', + title: '物资短缺:高级', + description: '根据地被敌军封锁,几乎所有物资都极度匮乏', + level: 3, + impact: '物价飞涨,边币几近崩溃,根据地经济面临瘫痪' + }, + { + id: 'exchange_1', + type: 'exchange', + title: '汇率波动:初级', + description: '边币对法币汇率小幅波动,交易活动受到轻微影响', + level: 1, + impact: '边币信心略有动摇,边区与外界贸易略受影响' + }, + { + id: 'exchange_2', + type: 'exchange', + title: '汇率波动:中级', + description: '边币对法币汇率大幅下跌,边区与外界贸易受阻', + level: 2, + impact: '边币信心受挫,边区经济受到较大冲击' + }, + { + id: 'exchange_3', + type: 'exchange', + title: '汇率波动:高级', + description: '边币对法币汇率暴跌,边区与外界经济联系几乎中断', + level: 3, + impact: '边币信心崩溃,边区经济面临严重危机' + } + ] + }); + } + }, + fail: () => { + console.log('读取本地文件失败,使用示例数据'); + // 使用示例数据 + that.setData({ + crisisEvents: [ + { + id: 'fake_currency_1', + type: 'fakeCurrency', + title: '伪币冲击:初级', + description: '敌方在根据地周边地区投放少量伪造边币,市场上开始出现伪币流通现象', + level: 1, + impact: '市场信心轻微下降,边币贬值风险较小' + }, + { + id: 'fake_currency_2', + type: 'fakeCurrency', + title: '伪币冲击:中级', + description: '敌方增加伪造边币投放力度,市场上伪币数量明显增加,造成一定混乱', + level: 2, + impact: '市场交易受阻,边币信任度下降,贸易活动减少' + }, + { + id: 'fake_currency_3', + type: 'fakeCurrency', + title: '伪币冲击:高级', + description: '敌方大规模投放高仿真度伪币,市场已难以分辨真伪,货币混乱严重', + level: 3, + impact: '边币严重贬值,市场恐慌,经济活动受到重创' + }, + { + id: 'shortage_1', + type: 'shortage', + title: '物资短缺:初级', + description: '部分生活必需品供应不足,市场价格开始上涨', + level: 1, + impact: '物价小幅上涨,边币购买力略有下降' + }, + { + id: 'shortage_2', + type: 'shortage', + title: '物资短缺:中级', + description: '多种生活必需品严重短缺,黑市交易开始活跃', + level: 2, + impact: '物价大幅上涨,边币购买力明显下降,民众不满情绪增加' + }, + { + id: 'shortage_3', + type: 'shortage', + title: '物资短缺:高级', + description: '根据地被敌军封锁,几乎所有物资都极度匮乏', + level: 3, + impact: '物价飞涨,边币几近崩溃,根据地经济面临瘫痪' + }, + { + id: 'exchange_1', + type: 'exchange', + title: '汇率波动:初级', + description: '边币对法币汇率小幅波动,交易活动受到轻微影响', + level: 1, + impact: '边币信心略有动摇,边区与外界贸易略受影响' + }, + { + id: 'exchange_2', + type: 'exchange', + title: '汇率波动:中级', + description: '边币对法币汇率大幅下跌,边区与外界贸易受阻', + level: 2, + impact: '边币信心受挫,边区经济受到较大冲击' + }, + { + id: 'exchange_3', + type: 'exchange', + title: '汇率波动:高级', + description: '边币对法币汇率暴跌,边区与外界经济联系几乎中断', + level: 3, + impact: '边币信心崩溃,边区经济面临严重危机' + } + ] + }); + } + }); + }, + + handleEventSelect: function(e) { + const eventId = e.currentTarget.dataset.id; + const selectedEvent = this.data.crisisEvents.find(item => item.id === eventId); + + if (selectedEvent) { + // 将选中事件保存到全局数据 + const app = getApp(); + app.globalData.selectedEvent = selectedEvent; + + // 跳转到策略选择页面 + wx.navigateTo({ + url: '/pages/strategy/strategy' + }); + } + } +}) \ No newline at end of file diff --git a/pages/index/index.json b/pages/index/index.json new file mode 100644 index 0000000..f05f2ac --- /dev/null +++ b/pages/index/index.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "边币战争 - 事件选择" +} \ No newline at end of file diff --git a/pages/index/index.wxml b/pages/index/index.wxml new file mode 100644 index 0000000..1162551 --- /dev/null +++ b/pages/index/index.wxml @@ -0,0 +1,58 @@ + + + + + + 边币战争 + 重温根据地金融斗争历史 + + + + + 欢迎来到"边币战争",您将扮演边区政府决策者,应对各种货币危机,选择最合适的策略保卫边币,维护根据地经济安全。 + + + 选择危机事件 + + + + 伪币冲击 + + + {{item.title}} + {{item.description}} + 影响:{{item.impact}} + + + + + + 物资短缺 + + + {{item.title}} + {{item.description}} + 影响:{{item.impact}} + + + + + + 汇率波动 + + + {{item.title}} + {{item.description}} + 影响:{{item.impact}} + + + + + + + 根据史实改编,仅供学习参考 + + \ No newline at end of file diff --git a/pages/index/index.wxss b/pages/index/index.wxss new file mode 100644 index 0000000..61f941a --- /dev/null +++ b/pages/index/index.wxss @@ -0,0 +1,151 @@ +/**index.wxss**/ +.header { + display: flex; + align-items: center; + padding: 30rpx 0; +} + +.logo { + width: 100rpx; + height: 100rpx; + margin-right: 20rpx; + background-color: #f0f0f0; + border-radius: 50%; + position: relative; +} + +.logo::after { + content: "LOGO"; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: #999; + font-size: 24rpx; +} + +.title-box { + display: flex; + flex-direction: column; +} + +.main-title { + font-size: 36rpx; + font-weight: bold; + color: #8B0000; +} + +.sub-title { + font-size: 24rpx; + color: #666; +} + +.intro-card { + margin: 20rpx 0 40rpx; + padding: 30rpx; + border-left: 4px solid #8B0000; +} + +.intro-text { + font-size: 28rpx; + line-height: 1.6; +} + +.section-title { + font-size: 32rpx; + font-weight: bold; + margin: 20rpx 0; + color: #333; + border-bottom: 1px solid #ddd; + padding-bottom: 10rpx; +} + +.event-type { + margin-bottom: 40rpx; +} + +.type-title { + font-size: 30rpx; + font-weight: bold; + margin: 10rpx 0; + color: #555; +} + +.events { + display: flex; + flex-direction: column; +} + +.event-card { + padding: 20rpx; + margin: 10rpx 0; + position: relative; + overflow: hidden; +} + +.event-card.level-1 { + border-left: 4px solid #4CAF50; +} + +.event-card.level-2 { + border-left: 4px solid #FFC107; +} + +.event-card.level-3 { + border-left: 4px solid #F44336; +} + +.event-card::after { + content: ""; + position: absolute; + top: 0; + right: 0; + width: 0; + height: 0; + border-style: solid; +} + +.event-card.level-1::after { + border-width: 0 20px 20px 0; + border-color: transparent #4CAF50 transparent transparent; +} + +.event-card.level-2::after { + border-width: 0 20px 20px 0; + border-color: transparent #FFC107 transparent transparent; +} + +.event-card.level-3::after { + border-width: 0 20px 20px 0; + border-color: transparent #F44336 transparent transparent; +} + +.event-title { + font-size: 28rpx; + font-weight: bold; + margin-bottom: 10rpx; +} + +.event-desc { + font-size: 26rpx; + color: #666; + margin-bottom: 10rpx; + line-height: 1.4; +} + +.event-impact { + font-size: 24rpx; + color: #888; +} + +.footer { + margin-top: 40rpx; + padding: 20rpx; + text-align: center; + border-top: 1px solid #eee; +} + +.footer-text { + font-size: 24rpx; + color: #999; +} \ No newline at end of file diff --git a/pages/result/result.js b/pages/result/result.js new file mode 100644 index 0000000..1a74ac5 --- /dev/null +++ b/pages/result/result.js @@ -0,0 +1,252 @@ +// result.js +const app = getApp() + +Page({ + data: { + event: null, + selectedStrategies: [], + result: { + title: "", + description: "", + score: 0, + scoreText: "", + imageClass: "" + }, + historyLessons: [], + isLoading: true, + showShareTip: false + }, + + onLoad: function() { + wx.showLoading({ + title: '分析结果中...', + mask: true + }); + + const selectedEvent = app.globalData.selectedEvent; + const selectedStrategies = app.globalData.selectedStrategies; + + if (!selectedEvent || !selectedStrategies || selectedStrategies.length === 0) { + wx.showToast({ + title: '缺少必要数据', + icon: 'none', + duration: 2000 + }); + setTimeout(() => { + wx.navigateBack(); + }, 2000); + return; + } + + // 模拟结果计算延迟,增强体验 + setTimeout(() => { + // 计算结果 + const result = this.calculateResult(selectedEvent, selectedStrategies); + const lessons = this.generateHistoryLessons(selectedEvent, selectedStrategies); + + this.setData({ + event: selectedEvent, + selectedStrategies: selectedStrategies, + result: result, + historyLessons: lessons, + isLoading: false + }); + + wx.hideLoading(); + }, 1500); + }, + + calculateResult: function(event, strategies) { + // 基础分数,根据策略数量和适用性计算 + let score = 0; + const maxScore = 100; + const strategiesCount = strategies.length; + + // 针对每个策略评分 + strategies.forEach(item => { + const strategy = item.strategy; + + // 策略是否适用于当前事件类型 + if (strategy.applicable && strategy.applicable.includes(event.type)) { + // 基础加分 + score += 20; + + // 根据危机等级和策略类型给予额外加分 + if (event.level === 3) { // 高级危机 + if (strategiesCount >= 3) { // 多种策略组合应对高级危机 + score += 10; + } + } else if (event.level === 2) { // 中级危机 + if (strategiesCount >= 2) { // 至少两种策略 + score += 5; + } + } + + // 根据策略选择的轮次给予不同评分 + // 某些危机类型在早期应对更有效 + if (item.round === 1 && (event.type === 'fakeCurrency' || event.type === 'exchange')) { + score += 5; // 早期应对金融类危机更有效 + } + + // 组合策略加分(比如经济+行政双管齐下) + const typeCount = this.countStrategyTypes(strategies); + if (typeCount >= 2) { // 如果使用了至少两种不同类型的策略 + score += 5; + } + } else { + // 使用了不适用的策略 + score -= 10; + } + }); + + // 最终得分不超过100,不低于0 + score = Math.min(Math.max(score, 0), maxScore); + + // 根据得分确定结果文本 + let title = ""; + let description = ""; + let scoreText = ""; + let imageClass = ""; + + if (score >= 90) { + title = "完美应对!"; + description = "您的策略组合非常出色,充分借鉴了历史经验,有效应对了" + event.title + "。根据地经济形势明显好转,边币稳定流通,人民生活得到保障。"; + scoreText = "卓越"; + imageClass = "result-excellent"; + } else if (score >= 70) { + title = "有效应对"; + description = "您的策略组合较为合理,基本控制了" + event.title + "带来的影响。根据地经济形势稳定,边币信任度维持,保障了基本生活需求。"; + scoreText = "良好"; + imageClass = "result-good"; + } else if (score >= 40) { + title = "基本应对"; + description = "您的部分策略发挥了作用,但面对" + event.title + "仍有不足。根据地经济受到一定冲击,边币价值有所波动,生活水平略有下降。"; + scoreText = "一般"; + imageClass = "result-average"; + } else { + title = "应对失败"; + description = "您的策略未能有效应对" + event.title + "。根据地经济遭受重创,边币严重贬值,人民生活陷入困境。建议重新思考策略组合。"; + scoreText = "不佳"; + imageClass = "result-poor"; + } + + return { + title: title, + description: description, + score: score, + scoreText: scoreText, + imageClass: imageClass + }; + }, + + // 统计策略类型数量 + countStrategyTypes: function(strategies) { + const types = new Set(); + strategies.forEach(item => { + if (item.strategy.id.startsWith('economic')) { + types.add('economic'); + } else if (item.strategy.id.startsWith('admin')) { + types.add('administrative'); + } else if (item.strategy.id.startsWith('mob')) { + types.add('mobilization'); + } + }); + return types.size; + }, + + // 生成历史经验教训 + generateHistoryLessons: function(event, strategies) { + const lessons = []; + + // 根据事件类型和策略选择生成相关历史经验 + if (event.type === 'fakeCurrency') { + lessons.push({ + title: "货币稳定的关键经验", + content: "历史上,边区政府通过加强金融制度建设和稳定物价,有效维护了边币流通秩序。" + }); + } else if (event.type === 'shortage') { + lessons.push({ + title: "应对物资短缺的经验", + content: "各根据地在物资匮乏时期,通过发展生产、精简机构、厉行节约等多种方式度过难关。" + }); + } else if (event.type === 'exchange') { + lessons.push({ + title: "汇率稳定的历史借鉴", + content: "边区政府曾通过调整法币与边币比价、加强市场监管等措施,保障币值稳定。" + }); + } + + // 根据策略选择添加具体历史案例 + const hasEconomic = strategies.some(item => item.strategy.id.startsWith('economic')); + const hasAdmin = strategies.some(item => item.strategy.id.startsWith('admin')); + const hasMob = strategies.some(item => item.strategy.id.startsWith('mob')); + + if (hasEconomic && hasAdmin) { + lessons.push({ + title: "经济与行政措施协同", + content: "历史经验表明,经济措施与行政手段相结合,能形成系统性解决方案,效果优于单一策略。" + }); + } + + if (hasMob) { + lessons.push({ + title: "群众基础的重要性", + content: "边区政府的各项政策能够成功实施,离不开广大人民群众的支持与参与。动员群众是解决危机的基础。" + }); + } + + return lessons; + }, + + // 重新应对按钮点击事件 + handleRestart: function() { + wx.showLoading({ + title: '准备中...', + mask: true + }); + + setTimeout(() => { + wx.hideLoading(); + wx.navigateBack({ + delta: 1 + }); + }, 800); + }, + + // 返回首页按钮点击事件 + handleBackToHome: function() { + wx.showLoading({ + title: '返回首页...', + mask: true + }); + + setTimeout(() => { + wx.hideLoading(); + wx.navigateBack({ + delta: 2 + }); + }, 800); + }, + + // 分享按钮点击事件 + handleShare: function() { + this.setData({ + showShareTip: true + }); + + setTimeout(() => { + this.setData({ + showShareTip: false + }); + }, 3000); + }, + + // 生命周期函数 + onShareAppMessage: function() { + return { + title: `我在边区危机中获得了${this.data.result.score}分的评价!`, + path: '/pages/index/index', + imageUrl: '/images/share-img.jpg' // 需要提供分享图片 + }; + } +}) \ No newline at end of file diff --git a/pages/result/result.json b/pages/result/result.json new file mode 100644 index 0000000..2ab81b3 --- /dev/null +++ b/pages/result/result.json @@ -0,0 +1,4 @@ +{ + "usingComponents": {}, + "navigationBarTitleText": "边币战争 - 应对结果" +} \ No newline at end of file diff --git a/pages/result/result.wxml b/pages/result/result.wxml new file mode 100644 index 0000000..d7fe942 --- /dev/null +++ b/pages/result/result.wxml @@ -0,0 +1,83 @@ + + + + + + 分析战略成效... + + + + + 应对结果 + + 危机事件:{{event.title}} + + 危机等级: + + + + + + + + + + + + + {{result.title}} + + 效果评估:{{result.scoreText}} + + {{result.score}}/100 + + + {{result.description}} + + + + + 您采取的策略 + + + 第{{item.round}}轮 + {{item.strategy.title}} + {{item.strategy.description}} + + + + + + 历史经验总结 + + + + + {{item.title}} + {{item.content}} + + + + + 面对{{event.title}}类型的危机,历史上的根据地通常采取综合策略,既有经济手段,也有行政举措,更注重发动群众。应对此类危机的关键在于迅速行动、多管齐下,特别是在危机等级较高时,需要各种措施协同配合。在实际历史中,那些成功渡过经济危机的根据地,往往能够灵活运用各种资源,并且得到人民的广泛支持。 + + + + + + 重新应对 + 返回首页 + + + + + + + + \ No newline at end of file diff --git a/pages/result/result.wxss b/pages/result/result.wxss new file mode 100644 index 0000000..af68305 --- /dev/null +++ b/pages/result/result.wxss @@ -0,0 +1,479 @@ +/**result.wxss**/ +.container { + padding: 30rpx; + min-height: 100vh; +} + +.vintage-bg { + background-color: #f8f6f1; + background-image: url('data:image/png;base64,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'); + position: relative; +} + +.page-transition { + animation: fadeIn 0.5s ease-in-out; +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +/* 加载状态 */ +.loading-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(248, 246, 241, 0.9); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + z-index: 999; +} + +.loading-spinner { + width: 80rpx; + height: 80rpx; + border: 6rpx solid rgba(92, 184, 92, 0.2); + border-left-color: #5cb85c; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +.loading-text { + margin-top: 30rpx; + font-size: 32rpx; + color: #5cb85c; + font-weight: bold; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +.content-area { + animation: slideUp 0.8s ease-out; +} + +@keyframes slideUp { + from { + transform: translateY(50rpx); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +.result-header { + margin-bottom: 30rpx; +} + +.result-title { + font-size: 40rpx; + font-weight: bold; + color: #333; + text-align: center; + margin-bottom: 20rpx; + position: relative; + display: inline-block; +} + +.result-title::after { + content: ''; + position: absolute; + bottom: -10rpx; + left: 50%; + transform: translateX(-50%); + width: 120rpx; + height: 4rpx; + background-color: #8B0000; +} + +.event-info { + background-color: #fff; + padding: 20rpx; + border-radius: 10rpx; + box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1); + margin-top: 20rpx; +} + +.event-title { + font-size: 32rpx; + font-weight: bold; + color: #333; + margin-bottom: 10rpx; +} + +.event-level { + display: flex; + align-items: center; + font-size: 28rpx; + color: #666; +} + +.level-dots { + display: flex; + margin-left: 10rpx; +} + +.level-dot { + width: 20rpx; + height: 20rpx; + border-radius: 50%; + background-color: #ddd; + margin-right: 5rpx; + transition: all 0.3s ease; +} + +.level-dot.active { + background-color: #d9534f; + animation: pulseDot 2s infinite; +} + +@keyframes pulseDot { + 0% { opacity: 1; } + 50% { opacity: 0.6; } + 100% { opacity: 1; } +} + +.card { + background-color: #fff; + border-radius: 10rpx; + box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1); + margin-bottom: 30rpx; + transition: transform 0.3s ease, box-shadow 0.3s ease; + padding: 20rpx; +} + +.card:hover { + transform: translateY(-5rpx); + box-shadow: 0 5rpx 15rpx rgba(0, 0, 0, 0.15); +} + +.result-card { + overflow: hidden; + animation: scaleIn 0.8s ease; + padding: 0; +} + +@keyframes scaleIn { + 0% { + transform: scale(0.95); + opacity: 0; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +.result-image { + height: 200rpx; + background-size: cover; + background-position: center; +} + +.result-excellent { + background-image: linear-gradient(45deg, #2ecc71, #27ae60); +} + +.result-good { + background-image: linear-gradient(45deg, #3498db, #2980b9); +} + +.result-average { + background-image: linear-gradient(45deg, #f1c40f, #f39c12); +} + +.result-poor { + background-image: linear-gradient(45deg, #e74c3c, #c0392b); +} + +.result-content { + padding: 20rpx; +} + +.result-outcome { + font-size: 36rpx; + font-weight: bold; + color: #333; + margin-bottom: 15rpx; +} + +.result-score { + font-size: 28rpx; + color: #666; + margin-bottom: 15rpx; + display: flex; + justify-content: space-between; + align-items: center; +} + +.score-text { + color: #5cb85c; + font-weight: bold; +} + +.score-value { + background-color: #f8f9fa; + padding: 10rpx 20rpx; + border-radius: 20rpx; + text-align: center; +} + +.score-number { + font-size: 32rpx; + font-weight: bold; + color: #8B0000; +} + +.result-description { + font-size: 28rpx; + color: #666; + line-height: 1.5; +} + +.strategies-summary { + margin-bottom: 30rpx; + animation: slideInRight 1s ease-out; + animation-fill-mode: both; + animation-delay: 0.3s; +} + +@keyframes slideInRight { + from { + transform: translateX(30rpx); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} + +.summary-title, .lesson-title { + font-size: 32rpx; + font-weight: bold; + margin-bottom: 20rpx; + color: #333; + position: relative; + padding-bottom: 10rpx; +} + +.summary-title::after, .lesson-title::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 80rpx; + height: 4rpx; + background-color: #8B0000; + transition: width 0.3s ease; +} + +.summary-title:hover::after, .lesson-title:hover::after { + width: 160rpx; +} + +.strategies-list { + display: flex; + flex-direction: column; + gap: 20rpx; +} + +.strategy-item { + position: relative; + border-left: 8rpx solid #5cb85c; + transition: all 0.3s ease; +} + +.strategy-round { + font-size: 24rpx; + color: #888; + margin-bottom: 10rpx; +} + +.strategy-title { + font-size: 30rpx; + font-weight: bold; + margin-bottom: 10rpx; + color: #333; +} + +.strategy-desc { + font-size: 26rpx; + color: #666; + line-height: 1.5; +} + +.historical-lesson { + margin-bottom: 40rpx; + animation: slideInLeft 1s ease-out; + animation-fill-mode: both; + animation-delay: 0.6s; +} + +@keyframes slideInLeft { + from { + transform: translateX(-30rpx); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} + +.lessons-list { + display: flex; + flex-direction: column; + gap: 20rpx; + margin-bottom: 20rpx; +} + +.lesson-card { + border-left: 8rpx solid #f0ad4e; + animation: fadeInUp 0.6s ease-out; + animation-fill-mode: both; +} + +.lesson-card:nth-child(2) { + animation-delay: 0.2s; +} + +.lesson-card:nth-child(3) { + animation-delay: 0.4s; +} + +@keyframes fadeInUp { + from { + transform: translateY(20rpx); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +.lesson-card-title { + font-size: 28rpx; + font-weight: bold; + margin-bottom: 10rpx; + color: #333; +} + +.lesson-card-content { + font-size: 26rpx; + color: #666; + line-height: 1.5; +} + +.lesson-content { + font-size: 28rpx; + color: #666; + line-height: 1.6; + border-left: 8rpx solid #5bc0de; +} + +.action-buttons { + display: flex; + flex-direction: column; + gap: 20rpx; + margin: 30rpx 0; +} + +.btn-row { + display: flex; + justify-content: space-between; +} + +.btn { + padding: 20rpx 40rpx; + border-radius: 50rpx; + font-size: 30rpx; + text-align: center; + background-color: #5cb85c; + color: #fff; + flex: 1; + margin: 0 10rpx; + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.btn:active { + transform: scale(0.98); + background-color: #4cae4c; +} + +.btn-outline { + background-color: transparent; + border: 2rpx solid #5cb85c; + color: #5cb85c; +} + +.btn-outline:active { + background-color: rgba(92, 184, 92, 0.1); +} + +.share-btn { + display: flex; + align-items: center; + justify-content: center; + padding: 20rpx; + border-radius: 50rpx; + background-color: #f8f9fa; + color: #333; + font-size: 28rpx; + margin-top: 10rpx; + transition: all 0.3s ease; +} + +.share-icon { + width: 40rpx; + height: 40rpx; + margin-right: 10rpx; +} + +.share-btn:active { + background-color: #e9ecef; + transform: scale(0.98); +} + +/* 分享提示 */ +.share-tip { + position: fixed; + top: 20rpx; + right: 30rpx; + background-color: rgba(0, 0, 0, 0.7); + color: #fff; + padding: 15rpx 30rpx; + border-radius: 10rpx; + font-size: 26rpx; + opacity: 0; + transform: translateY(-20rpx); + transition: all 0.3s ease; + z-index: 999; +} + +.share-tip.show { + opacity: 1; + transform: translateY(0); +} + +.share-tip-arrow { + position: absolute; + top: -16rpx; + right: 30rpx; + width: 0; + height: 0; + border-left: 16rpx solid transparent; + border-right: 16rpx solid transparent; + border-bottom: 16rpx solid rgba(0, 0, 0, 0.7); +} \ No newline at end of file diff --git a/pages/strategy/strategy.js b/pages/strategy/strategy.js new file mode 100644 index 0000000..6cb7c2a --- /dev/null +++ b/pages/strategy/strategy.js @@ -0,0 +1,419 @@ +// strategy.js +const app = getApp() + +Page({ + data: { + event: null, + strategies: { + economic: [ + { + id: 'economic_1', + title: '调整边币兑换率', + description: '通过合理调整边币与法币的兑换率,稳定币值', + applicable: ['exchange', 'fakeCurrency'], + historyCase: { + title: '1943年陕甘宁边区调整币值案例', + description: '1943年初,陕甘宁边区政府通过调整边币与法币兑换率,有效应对了币值波动' + } + }, + { + id: 'economic_2', + title: '紧缩货币发行', + description: '减少边币发行量,提高现有边币价值', + applicable: ['exchange', 'fakeCurrency', 'shortage'], + historyCase: { + title: '1944年某根据地紧缩货币政策', + description: '1944年,某根据地实施紧缩货币政策,有效控制了通货膨胀' + } + }, + { + id: 'economic_3', + title: '建立物资储备', + description: '组织经济战备,储备重要物资以稳定物价', + applicable: ['shortage', 'exchange'], + historyCase: { + title: '1942年晋察冀边区物资储备计划', + description: '1942年,晋察冀边区政府建立战略物资储备,有效应对了国民党经济封锁' + } + } + ], + administrative: [ + { + id: 'admin_1', + title: '查抄伪币窝点', + description: '派出工作组和武装力量,打击伪造边币的犯罪活动', + applicable: ['fakeCurrency'], + historyCase: { + title: '1941年晋冀鲁豫边区打击伪币行动', + description: '1941年,晋冀鲁豫边区政府开展了大规模打击伪币活动,摧毁多个伪币制造点' + } + }, + { + id: 'admin_2', + title: '实施物资配给', + description: '对关键物资实行统一配给制度,确保公平分配', + applicable: ['shortage'], + historyCase: { + title: '1945年山东解放区物资配给制度', + description: '1945年,山东解放区实施关键物资配给制度,保障了军民基本生活需求' + } + }, + { + id: 'admin_3', + title: '设立边币管理委员会', + description: '成立专门机构,统一协调货币政策和币值稳定措施', + applicable: ['fakeCurrency', 'exchange', 'shortage'], + historyCase: { + title: '1940年陕甘宁边区货币管理委员会', + description: '1940年,陕甘宁边区成立货币管理委员会,统一协调金融政策,保障了经济发展' + } + } + ], + mobilization: [ + { + id: 'mob_1', + title: '开展拒用伪币宣传', + description: '通过各种渠道向民众普及伪币识别知识,动员群众拒绝使用伪币', + applicable: ['fakeCurrency'], + historyCase: { + title: '1943年冀中群众性反伪币运动', + description: '1943年,冀中地区开展了声势浩大的反伪币宣传运动,有效减少了伪币流通' + } + }, + { + id: 'mob_2', + title: '组织互助合作', + description: '发动群众组建互助组和合作社,共同应对物资短缺', + applicable: ['shortage'], + historyCase: { + title: '1942年抗日民主根据地互助合作运动', + description: '1942年,多个抗日根据地开展互助合作运动,有效缓解了物资短缺问题' + } + }, + { + id: 'mob_3', + title: '开展爱用边币运动', + description: '动员群众积极使用边币,增强对根据地货币的信心', + applicable: ['exchange', 'fakeCurrency'], + historyCase: { + title: '1944年晋冀鲁豫边区爱用边币运动', + description: '1944年,晋冀鲁豫边区开展爱用边币运动,提高了边币的公信力和使用范围' + } + } + ] + }, + showModal: false, + currentHistoryCase: null, + currentRound: 0, + maxRounds: 3, + selectedStrategies: [], + strategiesUsed: {}, + roundTitle: "第1轮 - 初期应对", + isProcessing: false, // 处理状态防止重复点击 + isLoading: true, // 加载状态 + selectableCount: 0, // 当前可选择的策略数 + roundDescriptions: [ + "初期应对 - 选择最紧急的措施", + "中期调整 - 加强应对效果", + "后期加强 - 巩固已有成果" + ] + }, + + onLoad: function() { + wx.showLoading({ + title: '加载中...', + mask: true + }); + + try { + // 从全局数据获取选中的事件 + const selectedEvent = app.globalData.selectedEvent; + + if (selectedEvent) { + // 重置全局状态 + app.globalData.selectedStrategies = []; + app.globalData.currentRound = 0; + + this.initData(selectedEvent); + } else { + // 如果没有选中事件,创建一个测试事件(用于调试) + const testEvent = { + id: 'fake_currency_1', + type: 'fakeCurrency', + title: '伪币冲击:初级', + description: '敌方在根据地周边地区投放少量伪造边币,市场上开始出现伪币流通现象', + level: 1, + impact: '市场信心轻微下降,边币贬值风险较小' + }; + + this.initData(testEvent); + wx.showToast({ + title: '使用测试数据', + icon: 'none', + duration: 2000 + }); + } + } catch (error) { + console.error('初始化数据出错:', error); + wx.hideLoading(); + wx.showToast({ + title: '加载失败,请重试', + icon: 'none', + duration: 2000 + }); + } + }, + + // 初始化数据和计算可选择的策略数量 + initData: function(eventData) { + try { + // 设置基本数据 + this.setData({ + event: eventData, + currentRound: 0, + selectedStrategies: [], + strategiesUsed: {}, + roundTitle: "第1轮 - 初期应对", + isProcessing: false + }); + + // 计算可选择的策略数量 + let count = 0; + const eventType = eventData.type; + + // 遍历所有策略类别 + for (const category in this.data.strategies) { + this.data.strategies[category].forEach(strategy => { + if (strategy.applicable && strategy.applicable.indexOf(eventType) > -1) { + count++; + } + }); + } + + this.setData({ + selectableCount: count, + isLoading: false + }); + + wx.hideLoading(); + } catch (error) { + console.error('初始化数据出错:', error); + wx.hideLoading(); + wx.showToast({ + title: '数据初始化失败', + icon: 'none', + duration: 2000 + }); + } + }, + + handleStrategySelect: function(e) { + // 防止重复处理 + if (this.data.isProcessing || this.data.showModal) { + return; + } + + try { + const strategyType = e.currentTarget.dataset.type; + const strategyId = e.currentTarget.dataset.id; + const isApplicable = e.currentTarget.dataset.applicable; + const isUsed = e.currentTarget.dataset.used; + + // 如果不适用或已使用,不处理 + if (isApplicable === 'false' || isUsed === 'true') { + wx.vibrateShort(); // 轻微震动提示无法选择 + return; + } + + // 找到选中的策略 + const selectedStrategy = this.data.strategies[strategyType].find(item => item.id === strategyId); + + if (selectedStrategy) { + // 设置处理中状态 + this.setData({ + isProcessing: true + }); + + // 轻微振动反馈 + wx.vibrateShort({ + type: 'light' + }); + + // 标记该策略已使用 + let newStrategiesUsed = {...this.data.strategiesUsed}; + newStrategiesUsed[selectedStrategy.id] = true; + + // 添加到已选策略列表 + let newSelectedStrategies = [...this.data.selectedStrategies]; + newSelectedStrategies.push({ + round: this.data.currentRound + 1, + strategy: selectedStrategy + }); + + // 更新到全局数据 + app.globalData.selectedStrategies = newSelectedStrategies; + + // 显示历史案例模态框 + this.setData({ + showModal: true, + currentHistoryCase: selectedStrategy.historyCase, + strategiesUsed: newStrategiesUsed, + selectedStrategies: newSelectedStrategies + }); + } + } catch (error) { + console.error('选择策略出错:', error); + this.setData({ + isProcessing: false + }); + wx.showToast({ + title: '操作失败,请重试', + icon: 'none', + duration: 2000 + }); + } + }, + + closeModal: function() { + // 如果还在处理中,防止重复点击 + if (!this.data.showModal) { + return; + } + + try { + // 先关闭模态框 + this.setData({ + showModal: false, + currentHistoryCase: null + }); + + // 增加轮次 + const newRound = this.data.currentRound + 1; + app.globalData.currentRound = newRound; + + // 如果达到最大轮次,跳转到结果页面 + if (newRound >= this.data.maxRounds) { + wx.showToast({ + title: '策略选择完成', + icon: 'success', + duration: 1000, + mask: true + }); + + setTimeout(() => { + this.navigateToResults(); + }, 1000); + } else { + // 否则继续下一轮 + let roundTitle = ""; + if (newRound === 1) { + roundTitle = "第2轮 - 中期调整"; + } else if (newRound === 2) { + roundTitle = "第3轮 - 后期加强"; + } + + // 更新当前轮次状态 + this.setData({ + currentRound: newRound, + roundTitle: roundTitle, + isProcessing: false // 重置处理状态 + }); + + wx.showToast({ + title: `进入${roundTitle}`, + icon: 'none', + duration: 1500 + }); + } + } catch (error) { + console.error('关闭模态框出错:', error); + this.setData({ + isProcessing: false + }); + wx.showToast({ + title: '操作失败,请重试', + icon: 'none', + duration: 2000 + }); + } + }, + + // 添加返回首页的函数 + navigateBack: function() { + wx.showModal({ + title: '确认返回', + content: '返回将丢失当前已选择的策略,确定返回吗?', + success: (res) => { + if (res.confirm) { + wx.navigateBack(); + } + } + }); + }, + + preventBubble: function(e) { + // 阻止冒泡,防止点击内容区域关闭模态框 + return; + }, + + // 提前结束,直接查看结果 + finishEarly: function() { + if (this.data.selectedStrategies.length > 0) { + wx.showModal({ + title: '确认完成', + content: '确定结束当前决策过程,直接查看结果吗?', + success: (res) => { + if (res.confirm) { + this.navigateToResults(); + } + } + }); + } else { + wx.showToast({ + title: '请至少选择一个策略', + icon: 'none' + }); + } + }, + + // 跳转到结果页面的统一方法 + navigateToResults: function() { + wx.navigateTo({ + url: '/pages/result/result', + success: () => { + console.log('跳转到结果页面'); + // 跳转成功后重置处理状态 + this.setData({ + isProcessing: false + }); + }, + fail: (err) => { + console.error('跳转失败', err); + wx.showToast({ + title: '跳转失败,请重试', + icon: 'none' + }); + this.setData({ + isProcessing: false + }); + } + }); + }, + + // 生命周期函数 + onShareAppMessage: function() { + return { + title: '边区危机应对策略小游戏', + path: '/pages/index/index', + imageUrl: '/images/share-img.jpg' // 需要提供分享图片 + }; + }, + + // 页面卸载时清理 + onUnload: function() { + // 取消可能存在的定时器 + if (this.navigateTimer) { + clearTimeout(this.navigateTimer); + } + } +}) \ No newline at end of file diff --git a/pages/strategy/strategy.json b/pages/strategy/strategy.json new file mode 100644 index 0000000..67c1c89 --- /dev/null +++ b/pages/strategy/strategy.json @@ -0,0 +1,6 @@ +{ + "usingComponents": { + "history-modal": "/components/HistoryModal/HistoryModal" + }, + "navigationBarTitleText": "边币战争 - 策略选择" +} \ No newline at end of file diff --git a/pages/strategy/strategy.wxml b/pages/strategy/strategy.wxml new file mode 100644 index 0000000..3ef5b52 --- /dev/null +++ b/pages/strategy/strategy.wxml @@ -0,0 +1,133 @@ + + + + {{event.title}} + {{event.description}} + 影响:{{event.impact}} + + 危机等级: + + + + + + + + + + + + + + + + + + 已选择的策略 + + + 第{{item.round}}轮 + {{item.strategy.title}} + + + + + + {{roundTitle}} + + 选择一个适用于当前危机的策略,不可选择已使用过的策略 + + + + 当前事件没有可用的应对策略,请返回选择其他事件。 + + + + + + + + + + + 经济手段 + + + + {{item.title}} + {{item.description}} + 不适用于当前危机 + 已经使用 + + + + + + + + 行政手段 + + + + {{item.title}} + {{item.description}} + 不适用于当前危机 + 已经使用 + + + + + + + + 群众动员 + + + + {{item.title}} + {{item.description}} + 不适用于当前危机 + 已经使用 + + + + + + + 返回事件选择 + 查看最终结果 + + + + + + + 历史案例参考 + × + + + {{currentHistoryCase.title}} + + {{currentHistoryCase.description}} + + + 了解了,继续 + + + + \ No newline at end of file diff --git a/pages/strategy/strategy.wxss b/pages/strategy/strategy.wxss new file mode 100644 index 0000000..2d3193a --- /dev/null +++ b/pages/strategy/strategy.wxss @@ -0,0 +1,625 @@ +/**strategy.wxss**/ +.container { + padding: 30rpx; + min-height: 100vh; +} + +.vintage-bg { + background-color: #f8f6f1; + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAMAAAAp4XiDAAAAUVBMVEWFhYWDg4N3d3dtbW17e3t1dXWBgYGHh4d5eXlzc3OLi4ubm5uVlZWPj4+NjY19fX2JiYl/f39ra2uRkZGZmZlpaWmXl5dvb29xcXGTk5NnZ2c8TV1mAAAAG3RSTlNAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEAvEOwtAAAFVklEQVR4XpWWB67c2BUFb3g557T/hRo9/WUMZHlgr4Bg8Z4qQgQJlHI4A8SzFVrapvmTF9O7dmYRFZ60YiBhJRCgh1FYhiLAmdvX0CzTOpNE77ME0Zty/nWWzchDtiqrmQDeuv3powQ5ta2eN0FY0InkqDD73lT9c9lEzwUNqgFHs9VQce3TVClFCQrSTfOiYkVJQBmpbq2L6iZavPnAPcoU0dSw0SUTqz/GtrGuXfbyyBniKykOWQWGqwwMA7QiYAxi+IlPdqo+hYHnUt5ZPfnsHJyNiDtnpJyayNBkF6cWoYGAMY92U2hXHF/C1M8uP/ZtYdiuj26UdAdQQSXQErwSOMzt/XWRWAz5GuSBIkwG1H3FabJ2OsUOUhGC6tK4EMtJO0ttC6IBD3kM0ve0tJwMdSfjZo+EEISaeTr9P3wYrGjXqyC1krcKdhMpxEnt5JetoulscpyzhXN5FRpuPHvbeQaKxFAEB6EN+cYN6xD7RYGpXpNndMmZgM5Dcs3YSNFDHUo2LGfZuukSWyUYirJAdYbF3MfqEKmjM+I2EfhA94iG3L7uKrR+GdWD73ydlIB+6hgref1QTlmgmbM3/LeX5GI1Ux1RWpgxpLuZ2+I+IjzZ8wqE4nilvQdkUdfhzI5QDWy+kw5Wgg2pGpeEVeCCA7b85BO3F9DzxB3cdqvBzWcmzbyMiqhzuYqtHRVG2y4x+KOlnyqla8AoWWpuBoYRxzXrfKuILl6SfiWCbjxoZJUaCBj1CjH7GIaDbc9kqBY3W/Rgjda1iqQcOJu2WW+76pZC9QG7M00dffe9hNnseupFL53r8F7YHSwJWUKP2q+k7RdsxyOB11n0xtOvnW4irMMFNV4H0uqwS5ExsmP9AxbDTc9JwgneAT5vTiUSm1E7BSflSt3bfa1tv8Di3R8n3Af7MNWzs49hmauE2wP+ttrq+AsWpFG2awvsuOqbipWHgtuvuaAE+A1Z/7gC9hesnr+7wqCwG8c5yAg3AL1fm8T9AZtp/bbJGwl1pNrE7RuOX7PeMRUERVaPpEs+yqeoSmuOlokqw49pgomjLeh7icHNlG19yjs6XXOMedYm5xH2YxpV2tc0Ro2jJfxC50ApuxGob7lMsxfTbeUv07TyYxpeLucEH1gNd4IKH2LAg5TdVhlCafZvpskfncCfx8pOhJzd76bJWeYFnFciwcYfubRc12Ip/ppIhA1/mSZ/RxjFDrJC5xifFjJpY2Xl5zXdguFqYyTR1zSp1Y9p+tktDYYSNflcxI0iyO4TPBdlRcpeqjK/piF5bklq77VSEaA+z8qmJTFzIWiitbnzR794USKBUaT0NTEsVjZqLaFVqJoPN9ODG70IPbfBHKK+/q/AWR0tJzYHRULOa4MP+W/HfGadZUbfw177G7j/OGbIs8TahLyynl4X4RinF793Oz+BU0saXtUHrVBFT/DnA3ctNPoGbs4hRIjTok8i+algT1lTHi4SxFvONKNrgQFAq2/gFnWMXgwffgYMJpiKYkmW3tTg3ZQ9Jq+f8XN+A5eeUKHWvJWJ2sgJ1Sop+wwhqFVijqWaJhwtD8MNlSBeWNNWTa5Z5kPZw5+LbVT99wqTdx29lMUH4OIG/D86ruKEauBjvH5xy6um/Sfj7ei6UUVk4AIl3MyD4MSSTOFgSwsH/QJWaQ5as7ZcmgBZkzjjU1UrQ74ci1gWBCSGHtuV1H2mhSnO3Wp/3fEV5a+4wz//6qy8JxjZsmxxy5+4w9CDNJY09T072iKG0EnOS0arEYgXqYnXcYHwjTtUNAcMelOd4xpkoqiTYICWFq0JSiPfPDQdnt+4/wuqcXY47QILbgAAAABJRU5ErkJggg=='); + position: relative; + overflow-x: hidden; +} + +/* 添加页面切换动画 */ +.page-transition { + animation: fadeIn 0.5s ease-in-out; +} + +@keyframes fadeIn { + from { opacity: 0; } + to { opacity: 1; } +} + +.event-header { + margin-bottom: 30rpx; + padding: 20rpx; + border-radius: 10rpx; + background-color: #fff; + box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1); + animation: slideDown 0.5s ease-out; + transition: transform 0.3s ease; +} + +.event-header:active { + transform: scale(0.98); +} + +@keyframes slideDown { + from { + transform: translateY(-30rpx); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +.event-title { + font-size: 36rpx; + font-weight: bold; + margin-bottom: 15rpx; + color: #333; +} + +.event-desc { + font-size: 28rpx; + color: #666; + margin-bottom: 15rpx; + line-height: 1.5; +} + +.event-impact { + font-size: 26rpx; + color: #d9534f; + margin-bottom: 15rpx; +} + +.level-indicator { + display: flex; + align-items: center; +} + +.level-dots { + display: flex; + margin-left: 10rpx; +} + +.level-dot { + width: 20rpx; + height: 20rpx; + border-radius: 50%; + background-color: #ddd; + margin-right: 5rpx; + transition: background-color 0.5s ease; +} + +.level-dot.active { + background-color: #d9534f; + animation: pulseDot 2s infinite; +} + +@keyframes pulseDot { + 0% { opacity: 1; } + 50% { opacity: 0.6; } + 100% { opacity: 1; } +} + +.section-title { + font-size: 32rpx; + font-weight: bold; + margin: 20rpx 0; + color: #333; + position: relative; + padding-bottom: 10rpx; +} + +.section-title::after { + content: ''; + position: absolute; + bottom: 0; + left: 0; + width: 60rpx; + height: 4rpx; + background-color: #5cb85c; + transition: width 0.3s ease; +} + +.section-title:hover::after { + width: 120rpx; +} + +.strategy-category { + margin-bottom: 40rpx; + animation: fadeInUp 0.6s ease-out; + animation-fill-mode: both; +} + +.strategy-category:nth-child(2) { + animation-delay: 0.2s; +} + +.strategy-category:nth-child(3) { + animation-delay: 0.4s; +} + +@keyframes fadeInUp { + from { + transform: translateY(20rpx); + opacity: 0; + } + to { + transform: translateY(0); + opacity: 1; + } +} + +.category-header { + display: flex; + align-items: center; + margin-bottom: 15rpx; +} + +.category-icon { + width: 40rpx; + height: 40rpx; + margin-right: 10rpx; + border-radius: 50%; + transition: transform 0.3s ease; +} + +.category-header:hover .category-icon { + transform: scale(1.2); +} + +.economic-icon { + background-color: #5bc0de; +} + +.admin-icon { + background-color: #f0ad4e; +} + +.mob-icon { + background-color: #5cb85c; +} + +.category-title { + font-size: 30rpx; + font-weight: bold; + color: #333; +} + +.strategy-list { + display: flex; + flex-direction: column; + gap: 20rpx; +} + +.strategy-item { + position: relative; + padding: 20rpx; + border-radius: 10rpx; + background-color: #fff; + transition: all 0.3s; + box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1); + border-left: 8rpx solid transparent; + transform-origin: center; +} + +.strategy-item.disabled { + opacity: 0.6; + background-color: #f5f5f5; + cursor: not-allowed; + color: #999; +} + +.strategy-item.used { + opacity: 0.6; + border-left-color: #999; + background-color: #f5f5f5; +} + +/* 非禁用状态下的策略项高亮效果 */ +.strategy-item:not(.disabled):not(.used) { + background-color: #fff; + border-left-color: #5cb85c; + color: #333; + opacity: 1; + animation: pulse 2s infinite; +} + +@keyframes pulse { + 0% { + box-shadow: 0 0 0 0 rgba(92, 184, 92, 0.4); + } + 70% { + box-shadow: 0 0 0 6rpx rgba(92, 184, 92, 0); + } + 100% { + box-shadow: 0 0 0 0 rgba(92, 184, 92, 0); + } +} + +.strategy-item:not(.disabled):not(.used):active { + transform: scale(0.98); + background-color: #f9f9f9; +} + +.strategy-title { + font-size: 30rpx; + font-weight: bold; + margin-bottom: 10rpx; + color: inherit; +} + +.strategy-desc { + font-size: 26rpx; + line-height: 1.5; + color: inherit; + margin-bottom: 15rpx; +} + +.not-applicable, .already-used { + font-size: 24rpx; + padding: 4rpx 10rpx; + border-radius: 4rpx; + display: inline-block; + margin-top: 10rpx; +} + +.not-applicable { + background-color: #f8d7da; + color: #721c24; +} + +.already-used { + background-color: #d1ecf1; + color: #0c5460; +} + +.selected-strategies { + margin-bottom: 30rpx; + padding: 20rpx; + border-radius: 10rpx; + background-color: #fff; + box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1); + animation: slideIn 0.5s ease-out; +} + +@keyframes slideIn { + from { + transform: translateX(-30rpx); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } +} + +.strategies-list { + display: flex; + flex-wrap: wrap; + gap: 15rpx; +} + +.selected-strategy-item { + background-color: #f0f8ff; + border-radius: 8rpx; + padding: 15rpx; + display: flex; + flex-direction: column; + align-items: center; + min-width: 150rpx; + transition: all 0.3s ease; + animation: popIn 0.5s ease-out; + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); +} + +.selected-strategy-item:hover { + transform: translateY(-5rpx); + box-shadow: 0 5rpx 15rpx rgba(0, 0, 0, 0.1); +} + +@keyframes popIn { + 0% { + transform: scale(0.8); + opacity: 0; + } + 70% { + transform: scale(1.1); + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +.round-label { + font-size: 22rpx; + color: #666; + margin-bottom: 5rpx; + background-color: #f5f5f5; + padding: 2rpx 8rpx; + border-radius: 10rpx; +} + +.strategy-name { + font-size: 26rpx; + color: #333; + text-align: center; + font-weight: bold; +} + +.action-buttons { + display: flex; + justify-content: space-between; + margin-top: 40rpx; + padding: 20rpx 0; + animation: fadeInUp 0.5s ease-out; + animation-delay: 0.8s; + animation-fill-mode: both; +} + +.back-btn, .finish-btn { + padding: 15rpx 30rpx; + border-radius: 50rpx; + font-size: 28rpx; + text-align: center; + transition: all 0.3s ease; +} + +.back-btn { + background-color: #f8f9fa; + color: #6c757d; + border: 1rpx solid #dee2e6; +} + +.back-btn:active { + background-color: #e9ecef; + transform: scale(0.98); +} + +.finish-btn { + background-color: #5cb85c; + color: white; + position: relative; + overflow: hidden; +} + +.finish-btn:active { + background-color: #4cae4c; + transform: scale(0.98); +} + +.finish-btn::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + width: 5rpx; + height: 5rpx; + background: rgba(255, 255, 255, 0.5); + opacity: 0; + border-radius: 100%; + transform: scale(1, 1) translate(-50%); + transform-origin: 50% 50%; +} + +.finish-btn:active::after { + animation: ripple 1s ease-out; +} + +@keyframes ripple { + 0% { + transform: scale(0, 0); + opacity: 0.5; + } + 100% { + transform: scale(20, 20); + opacity: 0; + } +} + +/* 模态框样式 */ +.modal-mask { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.6); + z-index: 999; + display: flex; + justify-content: center; + align-items: center; + animation: fadeIn 0.3s ease; +} + +.modal-content { + width: 85%; + background: #fff; + border-radius: 10rpx; + overflow: hidden; + max-height: 90vh; + display: flex; + flex-direction: column; + animation: scaleIn 0.3s ease; + transform-origin: center; +} + +@keyframes scaleIn { + 0% { + transform: scale(0.9); + opacity: 0; + } + 100% { + transform: scale(1); + opacity: 1; + } +} + +.modal-header { + padding: 20rpx; + display: flex; + justify-content: space-between; + align-items: center; + border-bottom: 1rpx solid #eee; + background-color: #f5f5f5; +} + +.modal-title { + font-size: 32rpx; + font-weight: bold; + color: #333; +} + +.modal-close { + font-size: 40rpx; + color: #999; + cursor: pointer; + transition: all 0.3s ease; + width: 50rpx; + height: 50rpx; + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; +} + +.modal-close:hover { + background-color: #f5f5f5; + color: #666; +} + +.modal-body { + padding: 30rpx; + max-height: 60vh; + overflow-y: auto; +} + +.case-title { + font-size: 30rpx; + font-weight: bold; + margin-bottom: 20rpx; + color: #333; + border-left: 4rpx solid #5cb85c; + padding-left: 15rpx; +} + +.case-image { + width: 100%; + height: 300rpx; + background-color: #f8f9fa; + margin-bottom: 20rpx; + border-radius: 8rpx; + background-image: url('https://placeholder.pics/svg/400x150/DEDEDE/555555/历史案例'); + background-size: cover; + background-position: center; + transition: transform 0.5s ease; + box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1); +} + +.case-image:hover { + transform: scale(1.02); +} + +.case-desc { + font-size: 28rpx; + line-height: 1.6; + color: #666; + text-indent: 2em; +} + +.modal-footer { + padding: 20rpx; + display: flex; + justify-content: flex-end; + border-top: 1rpx solid #eee; + background-color: #f5f5f5; +} + +.btn { + padding: 15rpx 30rpx; + border-radius: 50rpx; + font-size: 28rpx; + background-color: #5cb85c; + color: white; + text-align: center; + transition: all 0.3s ease; + position: relative; + overflow: hidden; +} + +.btn:active { + transform: scale(0.98); + background-color: #4cae4c; +} + +/* 加载状态 */ +.loading-container { + display: flex; + justify-content: center; + align-items: center; + height: 100rpx; + margin: 20rpx 0; +} + +.loading-spinner { + width: 50rpx; + height: 50rpx; + border: 4rpx solid rgba(0, 0, 0, 0.1); + border-left-color: #5cb85c; + border-radius: 50%; + animation: spin 1s linear infinite; +} + +@keyframes spin { + to { transform: rotate(360deg); } +} + +/* 提示性样式 */ +.tip-container { + margin: 20rpx 0; + padding: 15rpx; + background-color: #fff3cd; + border-left: 4rpx solid #ffc107; + border-radius: 4rpx; + font-size: 26rpx; + color: #856404; + animation: fadeIn 0.5s ease-in-out; +} + +.round-indicator { + display: flex; + justify-content: center; + margin: 20rpx 0; + padding: 15rpx; + background-color: rgba(255, 255, 255, 0.8); + border-radius: 20rpx; + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); +} + +.round-dot { + width: 20rpx; + height: 20rpx; + border-radius: 50%; + background-color: #ddd; + margin: 0 10rpx; + transition: all 0.3s ease; +} + +.round-dot.active { + background-color: #5cb85c; + transform: scale(1.2); + box-shadow: 0 0 8rpx rgba(92, 184, 92, 0.5); +} + +.round-dot.completed { + background-color: #28a745; +} + +/* 策略选择提示文字 */ +.selection-help { + font-size: 24rpx; + color: #6c757d; + text-align: center; + margin: 10rpx 0 30rpx; + font-style: italic; + animation: fadeIn 0.8s ease-in-out; + background-color: rgba(255, 255, 255, 0.7); + padding: 10rpx; + border-radius: 20rpx; +} \ No newline at end of file diff --git a/project.config.json b/project.config.json new file mode 100644 index 0000000..66be015 --- /dev/null +++ b/project.config.json @@ -0,0 +1,59 @@ +{ + "description": "项目配置文件", + "packOptions": { + "ignore": [], + "include": [] + }, + "setting": { + "bundle": false, + "userConfirmedBundleSwitch": false, + "urlCheck": true, + "scopeDataCheck": false, + "coverView": true, + "es6": true, + "postcss": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "preloadBackgroundData": false, + "minified": true, + "autoAudits": false, + "newFeature": false, + "uglifyFileName": false, + "uploadWithSourceMap": true, + "useIsolateContext": true, + "nodeModules": false, + "enhance": true, + "useMultiFrameRuntime": true, + "useApiHook": true, + "useApiHostProcess": true, + "showShadowRootInWxmlPanel": true, + "packNpmManually": false, + "enableEngineNative": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "showES6CompileOption": false, + "minifyWXML": true, + "compileWorklet": false, + "localPlugins": false, + "disableUseStrict": false, + "useCompilerPlugins": false, + "condition": false, + "swc": false, + "disableSWC": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + } + }, + "compileType": "miniprogram", + "libVersion": "3.8.3", + "appid": "wxe347c18d44e9073c", + "projectname": "边币战争", + "condition": {}, + "editorSetting": { + "tabIndent": "insertSpaces", + "tabSize": 2 + }, + "simulatorPluginLibVersion": {} +} \ No newline at end of file diff --git a/project.private.config.json b/project.private.config.json new file mode 100644 index 0000000..7073b3a --- /dev/null +++ b/project.private.config.json @@ -0,0 +1,24 @@ +{ + "libVersion": "3.8.3", + "projectname": "%E8%BE%B9%E5%B8%81%E6%88%98%E4%BA%893", + "condition": {}, + "setting": { + "urlCheck": true, + "coverView": true, + "lazyloadPlaceholderEnable": false, + "skylineRenderEnable": false, + "preloadBackgroundData": false, + "autoAudits": false, + "useApiHook": true, + "useApiHostProcess": true, + "showShadowRootInWxmlPanel": true, + "useStaticServer": false, + "useLanDebug": false, + "showES6CompileOption": false, + "compileHotReLoad": true, + "checkInvalidKey": true, + "ignoreDevUnusedFiles": true, + "bigPackageSizeSupport": false, + "useIsolateContext": true + } +} \ No newline at end of file diff --git a/sitemap.json b/sitemap.json new file mode 100644 index 0000000..7f0b5db --- /dev/null +++ b/sitemap.json @@ -0,0 +1,7 @@ +{ + "desc": "边币战争小程序的sitemap文件", + "rules": [{ + "action": "allow", + "page": "*" + }] +} \ No newline at end of file diff --git a/内容.md b/内容.md new file mode 100644 index 0000000..2ddad0b --- /dev/null +++ b/内容.md @@ -0,0 +1,166 @@ +# 边区危机应对策略游戏内容详解 + +## 一、游戏背景 + +本游戏模拟抗日战争时期(1937-1945年)中国共产党领导的抗日根据地在面临各种经济危机时的决策过程。在艰苦的战争环境下,根据地面临敌人封锁、伪币冲击、物资短缺和汇率波动等多重经济挑战。玩家将扮演根据地领导者,运用经济手段、行政措施和群众动员三大类策略,应对不同类型的经济危机。 + +## 二、游戏流程 + +1. **选择危机事件**:在首页选择面临的经济危机类型 +2. **多轮策略选择**: + - 第一轮:初期应对 - 选择最紧急的措施 + - 第二轮:中期调整 - 加强应对效果 + - 第三轮:后期加强 - 巩固已有成果 +3. **查看历史案例**:每选择一个策略后,会显示相关历史案例 +4. **查看结果评估**:完成策略选择后,系统评估决策效果并展示得分 + +## 三、危机事件类型 + +### 1. 伪币冲击 +- **初级事件**:敌方在根据地周边地区投放少量伪造边币,市场上开始出现伪币流通现象 + - 影响:市场信心轻微下降,边币贬值风险较小 + - 危机等级:★ + +- **中级事件**:敌方组织大规模伪造边币活动,伪币在市场上广泛流通 + - 影响:市场混乱,边币信任度下降,物价波动明显 + - 危机等级:★★ + +- **高级事件**:敌方使用先进技术大量制造高仿真伪币,并通过多种渠道投放到根据地 + - 影响:边币信任危机,民众拒绝使用边币,市场交易困难 + - 危机等级:★★★ + +### 2. 物资短缺 +- **初级事件**:敌方开始对根据地实行经济封锁,部分生活必需品供应减少 + - 影响:生活必需品价格上涨,民众生活受到轻微影响 + - 危机等级:★ + +- **中级事件**:敌方加强封锁,生活必需品和生产材料严重不足 + - 影响:物价飞涨,生产活动受阻,民众生活困难 + - 危机等级:★★ + +- **高级事件**:敌方全面封锁,同时破坏根据地生产设施,物资极度匮乏 + - 影响:严重的物资危机,生产停滞,民众基本生活难以保障 + - 危机等级:★★★ + +### 3. 汇率波动 +- **初级事件**:国统区法币贬值,引起边币汇率小幅波动 + - 影响:贸易活动受到轻微影响,市场信心略有下降 + - 危机等级:★ + +- **中级事件**:国际环境变化导致各类货币剧烈波动,边币汇率不稳 + - 影响:外部贸易困难,物价波动明显,经济活动受阻 + - 危机等级:★★ + +- **高级事件**:敌方操纵汇率市场,联合投机商大规模做空边币 + - 影响:边币大幅贬值,通货膨胀严重,市场混乱 + - 危机等级:★★★ + +## 四、策略选择 + +### 1. 经济手段 + +#### 调整边币兑换率 +- **描述**:通过合理调整边币与法币的兑换率,稳定币值 +- **适用事件**:汇率波动、伪币冲击 +- **历史案例**:1943年陕甘宁边区调整币值案例 + - 1943年初,陕甘宁边区政府通过调整边币与法币兑换率,有效应对了币值波动 + +#### 紧缩货币发行 +- **描述**:减少边币发行量,提高现有边币价值 +- **适用事件**:汇率波动、伪币冲击、物资短缺 +- **历史案例**:1944年某根据地紧缩货币政策 + - 1944年,某根据地实施紧缩货币政策,有效控制了通货膨胀 + +#### 建立物资储备 +- **描述**:组织经济战备,储备重要物资以稳定物价 +- **适用事件**:物资短缺、汇率波动 +- **历史案例**:1942年晋察冀边区物资储备计划 + - 1942年,晋察冀边区政府建立战略物资储备,有效应对了国民党经济封锁 + +### 2. 行政手段 + +#### 查抄伪币窝点 +- **描述**:派出工作组和武装力量,打击伪造边币的犯罪活动 +- **适用事件**:伪币冲击 +- **历史案例**:1941年晋冀鲁豫边区打击伪币行动 + - 1941年,晋冀鲁豫边区政府开展了大规模打击伪币活动,摧毁多个伪币制造点 + +#### 实施物资配给 +- **描述**:对关键物资实行统一配给制度,确保公平分配 +- **适用事件**:物资短缺 +- **历史案例**:1945年山东解放区物资配给制度 + - 1945年,山东解放区实施关键物资配给制度,保障了军民基本生活需求 + +#### 设立边币管理委员会 +- **描述**:成立专门机构,统一协调货币政策和币值稳定措施 +- **适用事件**:伪币冲击、汇率波动、物资短缺 +- **历史案例**:1940年陕甘宁边区货币管理委员会 + - 1940年,陕甘宁边区成立货币管理委员会,统一协调金融政策,保障了经济发展 + +### 3. 群众动员 + +#### 开展拒用伪币宣传 +- **描述**:通过各种渠道向民众普及伪币识别知识,动员群众拒绝使用伪币 +- **适用事件**:伪币冲击 +- **历史案例**:1943年冀中群众性反伪币运动 + - 1943年,冀中地区开展了声势浩大的反伪币宣传运动,有效减少了伪币流通 + +#### 组织互助合作 +- **描述**:发动群众组建互助组和合作社,共同应对物资短缺 +- **适用事件**:物资短缺 +- **历史案例**:1942年抗日民主根据地互助合作运动 + - 1942年,多个抗日根据地开展互助合作运动,有效缓解了物资短缺问题 + +#### 开展爱用边币运动 +- **描述**:动员群众积极使用边币,增强对根据地货币的信心 +- **适用事件**:汇率波动、伪币冲击 +- **历史案例**:1944年晋冀鲁豫边区爱用边币运动 + - 1944年,晋冀鲁豫边区开展爱用边币运动,提高了边币的公信力和使用范围 + +## 五、结果评估系统 + +### 评分标准 +1. **策略适用性**:所选策略是否适用于当前危机类型 +2. **策略组合**:是否采用了多种类型的策略(经济、行政、群众动员) +3. **策略时机**:某些策略在危机早期使用效果更佳 +4. **历史借鉴**:策略是否符合历史经验 + +### 结果等级 +1. **完美应对**(90-100分) + - 选择了最适合的策略组合,完全解决危机 + - 历史经验:类似决策在抗战时期取得了显著成效 + +2. **有效应对**(75-89分) + - 选择了较为合适的策略组合,基本解决危机 + - 历史经验:类似决策在抗战时期取得了良好效果,但仍有改进空间 + +3. **基本应对**(60-74分) + - 选择的策略组合部分适用,减轻了危机但未彻底解决 + - 历史经验:类似决策在抗战时期取得了部分成效,但面临较多挑战 + +4. **应对失败**(0-59分) + - 选择的策略组合不适用或效果有限,未能解决危机 + - 历史经验:类似决策在抗战时期曾导致危机加剧或产生新问题 + +## 六、历史经验总结 + +### 伪币冲击应对经验 +1. 结合经济手段和行政措施是应对伪币冲击的有效方式 +2. 群众动员对于减少伪币流通起到关键作用 +3. 加强金融监管和提高币值稳定性是长期解决方案 + +### 物资短缺应对经验 +1. 建立物资储备是应对短期短缺的有效手段 +2. 群众互助合作可缓解物资分配不均问题 +3. 发展自给自足的经济模式是根本解决之道 + +### 汇率波动应对经验 +1. 及时调整币值是稳定汇率的直接手段 +2. 加强对市场的管理监督有助于防止投机炒作 +3. 增强民众对本币信心是稳定币值的基础 + +## 七、历史背景资料 + +抗日战争时期,中国共产党领导的抗日根据地面临极其复杂的经济环境。根据地经济建设实行"公私兼顾、军民兼顾、统筹兼顾"的方针,在极端困难的条件下,通过灵活多样的经济政策,有效应对了各种经济危机。 + +这些宝贵经验不仅支撑了抗战的胜利,也为中国共产党领导经济建设积累了重要实践,形成了在复杂困难环境下进行经济治理的独特智慧,体现了中国共产党实事求是、群众路线和自力更生的工作方法。