在2023年,我高中时期创作的纸牌游戏。 现在把它做成一款电子游戏,纪念我的过去。
《Move then Hurt》是一款双人对战的回合制策略卡牌游戏。 核心机制:先移动,后攻击。玩家每回合可选择操作自己的单位进行移动(移动后自动攻击)或者抽取新的卡牌加入手牌。你需要灵活利用单位的移动范围和攻击范围,配合手牌管理,最终击败对方的国王。
✨ 自动视角旋转:无论你选择红方还是蓝方,己方永远在下方 🎴 统一牌池系统:双方共用同一个牌堆,死亡单位回到牌堆底部 🎮 玩家切换开关:随时在红方/蓝方之间切换测试 🎯 直观的方向指示:使用简单图标和箭头,一目了然
· 棋盘为 5×5 的网格,双方分别占据上下两方。 · 国王:开局时双方各有一名"国王"固定在棋盘中央位置(红方位于第4行中间,蓝方位于第0行中间)。国王无法攻击,但可以朝8个方向移动。国王被消灭或被围困后,游戏立即结束。 · 普通单位:通过抽卡获得,放置在手牌中,再从手牌部署到己方半场(红方只能放在第3
4行,蓝方只能放在第01行)。 · 每个单位拥有: · 名称 · 生命值 (HP) · 攻击力 (DMG) · 移动方向集合(8个方向中的任意子集) · 攻击方向集合(8个方向中的任意子集)
· 游戏开始时,每名玩家手牌为 3 张随机普通卡牌(国王已在场上)。 · 每回合,当前玩家只能选择做以下一件事情:
- 移动一个己方单位(移动后自动攻击,然后回合结束)
- 抽取一张卡牌(从卡池随机加入手牌,然后回合结束)
- 从手牌部署一张卡牌(消耗一次行动,放置到己方半场的空格,然后回合结束)
💡 提示:每回合默认为"移动模式",可直接点击己方单位再点击空格进行移动。点击"抽卡"或点击手牌中的卡牌(部署模式)会退出移动模式。
· 只能移动到空格子(不能与友方单位交换或重叠)。 · 移动方向必须属于该单位的移动方向集合。 · 移动后立即触发攻击(见下节)。
· 移动完成后,单位会向其攻击方向集合中的每个方向(最多8个)各攻击一格。 · 如果该方向上有敌方单位,则造成 攻击力数值的伤害。目标HP减少,若HP≤0则单位被消灭。 · 如果攻击方向上有多个单位(实际上一格最多一个单位),只会攻击到最近的单位。 · 攻击不消耗额外行动次数。
· 统一牌池:双方共用同一个牌池(所有普通卡牌,国王不在卡池内)。 · 初始手牌:3 张。 · 手牌上限:6 张(无法抽卡时提示手牌已满)。 · 抽卡时从牌堆顶部取出一张卡加入手牌。 · 部署时从手牌中选择一张卡,放置在己方半场的空格上。 · 单位死亡后回收:普通单位被消灭后,会回到牌堆底部。 · 国王牌不参与牌池循环(固定开局在场)。
满足以下任一条件,游戏立即结束:
- 国王死亡:任意一方的国王被攻击消灭,消灭国王的一方获胜。
- 国王被围困:回合开始时,若国王的八个方向均被其他单位或墙壁阻挡,无法移动,则该国王方判负,对方获胜。
· 单位只能被部署在己方半场的空格(红方:行3-4,蓝方:行0-1)。 · 单位一旦放置,不能收回或主动弃置(直到被消灭)。 · 各单位的方向可以在卡片上直观看到: · 移动方向:绿色箭头(↑↗→↘↓↙←↖)印在卡片边缘。 · 攻击方向:红色字母 X 印在卡片边缘(相同方向)。 · 国王卡牌具有金色边框和左上角金色三角形装饰。 · 蓝方卡牌自动旋转180度:从蓝方视角看,卡片文字和方向都是正的。 · 视角自适应:切换玩家时,棋盘会自动旋转,己方永远在下方,只显示己方手牌。
运行环境要求
· JDK 11 及以上 · Maven 3.6+ · 现代浏览器(支持 WebSocket)
克隆与启动
git clone https://github.com/你的用户名/move-then-hurt.git
cd move-then-hurt
mvn clean spring-boot:run启动后访问 http://localhost:8080。
部署到阿里云 SOA
- 将代码推送到 GitHub 仓库。
- 在阿里云 SOA 控制台创建应用。
- 选择代码仓库和构建方式,配置 JDK 和 Maven。
- 部署后获得公网地址进行访问。
- 后台启动:
nohup java -jar target/movethenhurt-0.0.1-SNAPSHOT.jar > app.log 2>&1 &
项目结构(精简)
move-then-hurt/
├── src/main/java/com/example/movethenhurt/
│ ├── controller/GameWebSocketHandler.java
│ ├── service/
│ │ ├── CardLoader.java
│ │ └── GameService.java
│ ├── model/
│ │ ├── Card.java
│ │ ├── Direction.java
│ │ ├── GameState.java
│ │ ├── Player.java
│ │ └── Unit.java
│ └── config/WebSocketConfig.java
├── src/main/resources/
│ ├── static/
│ │ ├── js/
│ │ │ ├── constants.js
│ │ │ ├── ui.js
│ │ │ ├── logic.js
│ │ │ ├── network.js
│ │ │ ├── state.js
│ │ │ └── main.js
│ │ ├── css/
│ │ │ ├── variables.css
│ │ │ ├── global.css
│ │ │ ├── player.css
│ │ │ ├── board.css
│ │ │ ├── card.css
│ │ │ ├── hand.css
│ │ │ ├── control.css
│ │ │ ├── toast.css
│ │ │ └── main.css
│ │ ├── index.html
│ │ ├── game.html
│ │ ├── start.css
│ │ └── start.js
│ └── cards.json
└── pom.xml
欢迎提交 Issue 或 Pull Request。 若有任何建议或 Bug 反馈,请通过 GitHub 联系。
感谢每一位陪我玩过实体卡牌的朋友,也感谢现在的我完成了这个数字化的心愿。