Initial commit

This commit is contained in:
ChuXun
2025-12-07 22:53:46 +08:00
commit 5a2d39293d
27 changed files with 3188 additions and 0 deletions

2
.gitattributes vendored Normal file
View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

103
README.md Normal file
View File

@@ -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 边区危机应对策略小游戏 - 历史教育游戏项目

12
app.js Normal file
View File

@@ -0,0 +1,12 @@
// app.js
App({
onLaunch: function () {
console.log('应用启动');
},
globalData: {
selectedEvent: null,
selectedStrategies: [],
currentRound: 0,
maxRounds: 3
}
})

15
app.json Normal file
View File

@@ -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"
}

48
app.wxss Normal file
View File

@@ -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");
}

View File

@@ -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) {
// 阻止冒泡,防止点击内容区域关闭模态框
}
}
})

View File

@@ -0,0 +1,4 @@
{
"component": true,
"usingComponents": {}
}

View File

@@ -0,0 +1,17 @@
<!--components/HistoryModal/HistoryModal.wxml-->
<view class="modal-mask" wx:if="{{show}}" bindtap="closeModal">
<view class="modal-content" catchtap="preventBubble">
<view class="modal-header">
<text class="modal-title">历史案例参考</text>
<view class="modal-close" bindtap="closeModal">×</view>
</view>
<view class="modal-body">
<view class="case-title">{{historyCase.title}}</view>
<view class="case-image"></view>
<view class="case-desc">{{historyCase.description}}</view>
</view>
<view class="modal-footer">
<view class="btn" bindtap="closeModal">了解了</view>
</view>
</view>
</view>

View File

@@ -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;
}

74
data/crisisEvents.json Normal file
View File

@@ -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": "边币信心崩溃,边区经济面临严重危机"
}
]

98
data/strategies.json Normal file
View File

@@ -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年晋冀鲁豫边区开展了广泛的爱用边币运动。政府机关带头使用边币发放工资和采购物资商会组织商户签订自觉使用边币公约学校教育学生了解边币的重要性。通过这场运动边币的使用范围不断扩大民众对边币的信心显著增强有力抵制了敌人破坏边区金融的图谋为根据地经济稳定和军事斗争提供了有力支持。"
}
}
]
}

199
pages/index/index.js Normal file
View File

@@ -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'
});
}
}
})

4
pages/index/index.json Normal file
View File

@@ -0,0 +1,4 @@
{
"usingComponents": {},
"navigationBarTitleText": "边币战争 - 事件选择"
}

58
pages/index/index.wxml Normal file
View File

@@ -0,0 +1,58 @@
<!--index.wxml-->
<view class="container vintage-bg">
<view class="header">
<view class="logo"></view>
<view class="title-box">
<text class="main-title">边币战争</text>
<text class="sub-title">重温根据地金融斗争历史</text>
</view>
</view>
<view class="intro-card card">
<text class="intro-text">欢迎来到"边币战争",您将扮演边区政府决策者,应对各种货币危机,选择最合适的策略保卫边币,维护根据地经济安全。</text>
</view>
<view class="section-title">选择危机事件</view>
<view class="event-list">
<view class="event-type">
<view class="type-title">伪币冲击</view>
<view class="events">
<view wx:for="{{crisisEvents}}" wx:key="id" wx:if="{{item.type === 'fakeCurrency'}}"
class="event-card card level-{{item.level}}" bindtap="handleEventSelect" data-id="{{item.id}}">
<view class="event-title">{{item.title}}</view>
<view class="event-desc">{{item.description}}</view>
<view class="event-impact">影响:{{item.impact}}</view>
</view>
</view>
</view>
<view class="event-type">
<view class="type-title">物资短缺</view>
<view class="events">
<view wx:for="{{crisisEvents}}" wx:key="id" wx:if="{{item.type === 'shortage'}}"
class="event-card card level-{{item.level}}" bindtap="handleEventSelect" data-id="{{item.id}}">
<view class="event-title">{{item.title}}</view>
<view class="event-desc">{{item.description}}</view>
<view class="event-impact">影响:{{item.impact}}</view>
</view>
</view>
</view>
<view class="event-type">
<view class="type-title">汇率波动</view>
<view class="events">
<view wx:for="{{crisisEvents}}" wx:key="id" wx:if="{{item.type === 'exchange'}}"
class="event-card card level-{{item.level}}" bindtap="handleEventSelect" data-id="{{item.id}}">
<view class="event-title">{{item.title}}</view>
<view class="event-desc">{{item.description}}</view>
<view class="event-impact">影响:{{item.impact}}</view>
</view>
</view>
</view>
</view>
<view class="footer">
<text class="footer-text">根据史实改编,仅供学习参考</text>
</view>
</view>

151
pages/index/index.wxss Normal file
View File

@@ -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;
}

252
pages/result/result.js Normal file
View File

@@ -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' // 需要提供分享图片
};
}
})

4
pages/result/result.json Normal file
View File

@@ -0,0 +1,4 @@
{
"usingComponents": {},
"navigationBarTitleText": "边币战争 - 应对结果"
}

83
pages/result/result.wxml Normal file
View File

@@ -0,0 +1,83 @@
<!--result.wxml-->
<view class="container vintage-bg page-transition">
<!-- 加载状态 -->
<view class="loading-overlay" wx:if="{{isLoading}}">
<view class="loading-spinner"></view>
<view class="loading-text">分析战略成效...</view>
</view>
<view class="content-area" wx:if="{{!isLoading}}">
<view class="result-header">
<view class="result-title">应对结果</view>
<view class="event-info">
<view class="event-title">危机事件:{{event.title}}</view>
<view class="event-level">
危机等级:
<view class="level-dots">
<view class="level-dot {{event.level >= 1 ? 'active' : ''}}"></view>
<view class="level-dot {{event.level >= 2 ? 'active' : ''}}"></view>
<view class="level-dot {{event.level >= 3 ? 'active' : ''}}"></view>
</view>
</view>
</view>
</view>
<view class="result-card card">
<view class="result-image {{result.imageClass}}"></view>
<view class="result-content">
<view class="result-outcome">{{result.title}}</view>
<view class="result-score">
效果评估:<text class="score-text">{{result.scoreText}}</text>
<view class="score-value">
<text class="score-number">{{result.score}}</text>/100
</view>
</view>
<view class="result-description">{{result.description}}</view>
</view>
</view>
<view class="strategies-summary">
<view class="summary-title">您采取的策略</view>
<view class="strategies-list">
<view wx:for="{{selectedStrategies}}" wx:key="index" class="strategy-item card">
<view class="strategy-round">第{{item.round}}轮</view>
<view class="strategy-title">{{item.strategy.title}}</view>
<view class="strategy-desc">{{item.strategy.description}}</view>
</view>
</view>
</view>
<view class="historical-lesson">
<view class="lesson-title">历史经验总结</view>
<!-- 动态生成的历史教训 -->
<view class="lessons-list">
<view wx:for="{{historyLessons}}" wx:key="index" class="lesson-card card">
<view class="lesson-card-title">{{item.title}}</view>
<view class="lesson-card-content">{{item.content}}</view>
</view>
</view>
<view class="lesson-content card">
面对{{event.title}}类型的危机,历史上的根据地通常采取综合策略,既有经济手段,也有行政举措,更注重发动群众。应对此类危机的关键在于迅速行动、多管齐下,特别是在危机等级较高时,需要各种措施协同配合。在实际历史中,那些成功渡过经济危机的根据地,往往能够灵活运用各种资源,并且得到人民的广泛支持。
</view>
</view>
<view class="action-buttons">
<view class="btn-row">
<view class="btn btn-outline" bindtap="handleRestart">重新应对</view>
<view class="btn" bindtap="handleBackToHome">返回首页</view>
</view>
<view class="share-btn" bindtap="handleShare">
<image class="share-icon" src="/images/share.png" mode="aspectFit"></image>
分享结果
</view>
</view>
<!-- 分享提示 -->
<view class="share-tip {{showShareTip ? 'show' : ''}}" wx:if="{{showShareTip}}">
点击右上角"..."按钮分享给好友
<view class="share-tip-arrow"></view>
</view>
</view>
</view>

479
pages/result/result.wxss Normal file
View File

@@ -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);
}

419
pages/strategy/strategy.js Normal file
View File

@@ -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);
}
}
})

View File

@@ -0,0 +1,6 @@
{
"usingComponents": {
"history-modal": "/components/HistoryModal/HistoryModal"
},
"navigationBarTitleText": "边币战争 - 策略选择"
}

View File

@@ -0,0 +1,133 @@
<!--strategy.wxml-->
<view class="container vintage-bg page-transition">
<view class="event-header card">
<view class="event-title">{{event.title}}</view>
<view class="event-desc">{{event.description}}</view>
<view class="event-impact">影响:{{event.impact}}</view>
<view class="level-indicator">
<text>危机等级:</text>
<view class="level-dots">
<view class="level-dot {{event.level >= 1 ? 'active' : ''}}"></view>
<view class="level-dot {{event.level >= 2 ? 'active' : ''}}"></view>
<view class="level-dot {{event.level >= 3 ? 'active' : ''}}"></view>
</view>
</view>
</view>
<!-- 轮次指示器 -->
<view class="round-indicator">
<view class="round-dot {{currentRound >= 0 ? 'active' : ''}} {{currentRound > 0 ? 'completed' : ''}}"></view>
<view class="round-dot {{currentRound >= 1 ? 'active' : ''}} {{currentRound > 1 ? 'completed' : ''}}"></view>
<view class="round-dot {{currentRound >= 2 ? 'active' : ''}} {{currentRound > 2 ? 'completed' : ''}}"></view>
</view>
<!-- 已选策略显示区域 -->
<view class="selected-strategies" wx:if="{{selectedStrategies.length > 0}}">
<view class="section-title">已选择的策略</view>
<view class="strategies-list">
<view wx:for="{{selectedStrategies}}" wx:key="index" class="selected-strategy-item">
<view class="round-label">第{{item.round}}轮</view>
<view class="strategy-name">{{item.strategy.title}}</view>
</view>
</view>
</view>
<view class="strategy-section">
<view class="section-title">{{roundTitle}}</view>
<view class="selection-help">选择一个适用于当前危机的策略,不可选择已使用过的策略</view>
<!-- 可选策略数量提示 -->
<view class="tip-container" wx:if="{{selectableCount === 0}}">
当前事件没有可用的应对策略,请返回选择其他事件。
</view>
<!-- 加载状态显示 -->
<view class="loading-container" wx:if="{{isLoading}}">
<view class="loading-spinner"></view>
</view>
<view class="strategy-category" wx:if="{{!isLoading}}">
<view class="category-header">
<view class="category-icon economic-icon"></view>
<view class="category-title">经济手段</view>
</view>
<view class="strategy-list">
<view wx:for="{{strategies.economic}}" wx:key="id"
class="strategy-item card {{item.applicable.indexOf(event.type) > -1 ? '' : 'disabled'}} {{strategiesUsed[item.id] ? 'used' : ''}}"
bindtap="handleStrategySelect"
data-type="economic" data-id="{{item.id}}"
data-applicable="{{item.applicable.indexOf(event.type) > -1}}"
data-used="{{strategiesUsed[item.id]}}">
<view class="strategy-title">{{item.title}}</view>
<view class="strategy-desc">{{item.description}}</view>
<view wx:if="{{item.applicable.indexOf(event.type) === -1}}" class="not-applicable">不适用于当前危机</view>
<view wx:elif="{{strategiesUsed[item.id]}}" class="already-used">已经使用</view>
</view>
</view>
</view>
<view class="strategy-category" wx:if="{{!isLoading}}">
<view class="category-header">
<view class="category-icon admin-icon"></view>
<view class="category-title">行政手段</view>
</view>
<view class="strategy-list">
<view wx:for="{{strategies.administrative}}" wx:key="id"
class="strategy-item card {{item.applicable.indexOf(event.type) > -1 ? '' : 'disabled'}} {{strategiesUsed[item.id] ? 'used' : ''}}"
bindtap="handleStrategySelect"
data-type="administrative" data-id="{{item.id}}"
data-applicable="{{item.applicable.indexOf(event.type) > -1}}"
data-used="{{strategiesUsed[item.id]}}">
<view class="strategy-title">{{item.title}}</view>
<view class="strategy-desc">{{item.description}}</view>
<view wx:if="{{item.applicable.indexOf(event.type) === -1}}" class="not-applicable">不适用于当前危机</view>
<view wx:elif="{{strategiesUsed[item.id]}}" class="already-used">已经使用</view>
</view>
</view>
</view>
<view class="strategy-category" wx:if="{{!isLoading}}">
<view class="category-header">
<view class="category-icon mob-icon"></view>
<view class="category-title">群众动员</view>
</view>
<view class="strategy-list">
<view wx:for="{{strategies.mobilization}}" wx:key="id"
class="strategy-item card {{item.applicable.indexOf(event.type) > -1 ? '' : 'disabled'}} {{strategiesUsed[item.id] ? 'used' : ''}}"
bindtap="handleStrategySelect"
data-type="mobilization" data-id="{{item.id}}"
data-applicable="{{item.applicable.indexOf(event.type) > -1}}"
data-used="{{strategiesUsed[item.id]}}">
<view class="strategy-title">{{item.title}}</view>
<view class="strategy-desc">{{item.description}}</view>
<view wx:if="{{item.applicable.indexOf(event.type) === -1}}" class="not-applicable">不适用于当前危机</view>
<view wx:elif="{{strategiesUsed[item.id]}}" class="already-used">已经使用</view>
</view>
</view>
</view>
</view>
<view class="action-buttons">
<view class="back-btn" bindtap="navigateBack">返回事件选择</view>
<view wx:if="{{selectedStrategies.length > 0}}" class="finish-btn" bindtap="finishEarly">查看最终结果</view>
</view>
<!-- 历史案例模态框 -->
<view class="modal-mask" wx:if="{{showModal}}" catchtap="preventBubble">
<view class="modal-content">
<view class="modal-header">
<text class="modal-title">历史案例参考</text>
<view class="modal-close" catchtap="closeModal">×</view>
</view>
<view class="modal-body">
<view class="case-title">{{currentHistoryCase.title}}</view>
<view class="case-image"></view>
<view class="case-desc">{{currentHistoryCase.description}}</view>
</view>
<view class="modal-footer">
<view class="btn" catchtap="closeModal">了解了,继续</view>
</view>
</view>
</view>
</view>

View File

@@ -0,0 +1,625 @@
/**strategy.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;
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;
}

59
project.config.json Normal file
View File

@@ -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": {}
}

View File

@@ -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
}
}

7
sitemap.json Normal file
View File

@@ -0,0 +1,7 @@
{
"desc": "边币战争小程序的sitemap文件",
"rules": [{
"action": "allow",
"page": "*"
}]
}

166
内容.md Normal file
View File

@@ -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. 增强民众对本币信心是稳定币值的基础
## 七、历史背景资料
抗日战争时期,中国共产党领导的抗日根据地面临极其复杂的经济环境。根据地经济建设实行"公私兼顾、军民兼顾、统筹兼顾"的方针,在极端困难的条件下,通过灵活多样的经济政策,有效应对了各种经济危机。
这些宝贵经验不仅支撑了抗战的胜利,也为中国共产党领导经济建设积累了重要实践,形成了在复杂困难环境下进行经济治理的独特智慧,体现了中国共产党实事求是、群众路线和自力更生的工作方法。