# MagicTower (仿制的 魔塔v1.12) (Java 实现)
![](readme/demo.png)
## 〇、历史版本
| 序号 | 版本号 | 说明 |
|---|--------|-----------|
| 1 | v1.0.0 | 借用网上的资源文件;实现了前 21 层;完成了若干简单功能。|
| 2 | v1.0.1 | Photoshop 重做全部资源文件;重构数据获取方式;实现全部 26 层;重构设计模式(精简代码前的中间版本)。 |
| 3 | v1.0.2 | 调试版本,对话模块待完善,剧情模块待完善。 |
## 一、关于作者
本人最早于 2006 年左右接触到魔塔游戏(魔塔 v1.12)。当时是刚学会上网不久后,发现了并热衷于 4399网站上的小游戏。
一天晚上,因为无聊,无意中打开了 4399小游戏 里的 **[魔塔小游戏](http://www.4399.com/flash/1749_1.htm)**。
一瞬间感觉回到了童年。还清晰记得当年卡在了第 16 层的 “boss”,当晚决心要以自己的智慧通关。因尝试了多次也无法突破一些楼层,
于是只好求助攻略,不知不觉玩到了凌晨,终于通关。发现了居然还有隐藏关卡。
本着对魔塔游戏的热爱,考虑到魔塔已经是十多年前的 flash 小游戏了(flash 已是过时技术),又因为是 CS专业 的学生,
于是便琢磨能不能把游戏重写一遍。
于是,便有了这个项目。。。
**注:**
- **项目下的 [ 魔塔V1.12.swf ] 为游戏原作品**
- **项目下的 [ 开始游戏.jar ] 为本人的仿制作品( 目前仅支持分辨率 1920 * 1080 以上的显示器 )**
## 二、操作指南(本游戏适合 18 岁以上用户)
点击 根目录下的 **“开始游戏.jar”** 开始游戏
- 方向键:人物移动;
- 空格键:确认;
- W S 键:商店、老人、商人、楼层跳跃事件的 光标上下移动;
- J 键:获得道具【风之罗盘】后,打开 楼层跳跃 面板;
- L 键:获得道具【圣光徽】后,打开 预测功能 面板。
## 三、当前版本已知的 Bug(后续版本会修复)
- 白衣武士,不论攻防,会扣除当前 1/4 生命
- 灵法师,不论攻防,会扣除当前 1/3 生命
- 部分对话事件和剧情未实现
- 楼层跳跃时可以跳跃到未到达过的楼层
- ······
## 四、开发环境
IntelliJ IDEA 2017.3.2 (Ultimate Edition)
Build #IU-173.4127.27, built on December 26, 2017
Licensed to Z YY
Subscription is active until May 31, 2019
For educational use only.
JRE: 1.8.0_152-release-1024-b8 amd64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
Windows 10 10.0
----
## 五、设计模式
- 关于 static 关键字使用。游戏中全局数据使用 static 修饰。数据预设部分为方便也使用 static。
- package 划分:bean 为实体类;util 为具体功能类;data 为数据源。
- 地图数据:MapData(26层的初始地形,对应资源文件)
- 怪物数据:MonsterData(33种怪物,id、名字、生命、攻击、防御、金钱、经验)
- 图片数据:ImageData(统一获取资源文件,转为 static)
- 对话数据:DialogData(全部对话数据)
- 地图动画:通过 Timer 交替引用资源文件实现
----
## 附:开发文档
### 1. 资源文件
考虑到需要仿制的这个魔塔游戏,那么游戏的资源文件是必不可少的,只有拿到资源文件,才有可能还原这个游戏。我的想法主要有两种:一是通过玩一遍游戏,截屏游戏的截图,再通过Photoshop切图提取;第二种是直接使用工具打开游戏的 .swf 文件,查看资源文件,由于本人所使用的“硕思闪客精灵”需要购买会员才能导出资源,便只好通过截屏的方式在Photoshop中切图提取。
为证明我两种方法都有去尝试了,下面分享一下所截的图:
![](readme/00.png)
![](readme/01.png)
![](readme/02.png)
![](readme/03.png)
![](readme/04.png)
![](readme/05.png)
![](readme/06.png)
![](readme/07.png)
![](readme/08.png)
![](readme/09.png)
![](readme/10.png)
![](readme/11.png)
![](readme/12.png)
![](readme/13.png)
![](readme/14.png)
![](readme/15.png)
![](readme/16.png)
![](readme/17.png)
![](readme/18_1.png)
![](readme/19.png)
![](readme/20.png)
![](readme/21.png)
第一种方法有较大的工作量,通常需要玩几遍游戏。而且游戏里面的渲染不是规则的正方形,即便是切图也有不少的工作量。
![](readme/ps01.png)
![](readme/ps02.png)
----
![](readme/ziyuan1.png)
![](readme/ziyuan2.png)
![](readme/ziyuan3.png)
![](readme/ziyuan4.png)
![](readme/ziyuan5.png)
第二种方法的截图是 1920 * 1080 屏幕下,“硕思闪客精灵”的截图,相比而言,在这 5 张截图上进行切图,工作量减少了一大半。
![](readme/ps03.png)
![](readme/ps04.png)
----
最终处理好的资源文件如下:
| 资源名 | frame 0 | frame 1 |
| - | - | - |
| 0.png | ![](/res/map0/0.png) | ![](/res/map1/0.png) |
| 1.png | ![](/res/map0/1.png) | ![](/res/map1/1.png) |
| 2.png | ![](/res/map0/2.png) | ![](/res/map1/2.png) |
| 3.png | ![](/res/map0/3.png) | ![](/res/map1/3.png) |
| 4.png | ![](/res/map0/4.png) | ![](/res/map1/4.png) |
| 5.png | ![](/res/map0/5.png) | ![](/res/map1/5.png) |
| 6.png | ![](/res/map0/6.png) | ![](/res/map1/6.png) |
| 7.png | ![](/res/map0/7.png) | ![](/res/map1/7.png) |
| 8.png | ![](/res/map0/8.png) | ![](/res/map1/8.png) |
| 9.png | ![](/res/map0/9.png) | ![](/res/map1/9.png) |
| 10.png | ![](/res/map0/10.png) | ![](/res/map1/10.png) |
| 11.png | ![](/res/map0/11.png) | ![](/res/map1/11.png) |
| 12.png | ![](/res/map0/12.png) | ![](/res/map1/12.png) |
| 13.png | ![](/res/map0/13.png) | ![](/res/map1/13.png) |
| 14.png | ![](/res/map0/14.png) | ![](/res/map1/14.png) |
| 15.png | ![](/res/map0/15.png) | ![](/res/map1/15.png) |
| 19.png | ![](/res/map0/19.png) | ![](/res/map1/19.png) |
| 20.png | ![](/res/map0/20.png) | ![](/res/map1/20.png) |
| 21.png | ![](/res/map0/21.png) | ![](/res/map1/21.png) |
| 22.png | ![](/res/map0/22.png) | ![](/res/map1/22.png) |
| 23.png | ![](/res/map0/23.png) | ![](/res/map1/23.png) |
| 24.png | ![](/res/map0/24.png) | ![](/res/map1/24.png) |
| 25.png | ![](/res/map0/25.png) | ![](/res/map1/25.png) |
| 26.png | ![](/res/map0/26.png) | ![](/res/map1/26.png) |
| 27.png | ![](/res/map0/27.png) | ![](/res/map1/27.png) |
| 28.png | ![](/res/map0/28.png) | ![](/res/map1/28.png) |
| 30.png | ![](/res/map0/30.png) | ![](/res/map1/30.png) |
| 31.png | ![](/res/map0/31.png) | ![](/res/map1/31.png) |
| 32.png | ![](/res/map0/32.png) | ![](/res/map1/32.png) |
| 33.png | ![](/res/map0/33.png) | ![](/res/map1/33.png) |
| 34.png | ![](/res/map0/34.png) | ![](/res/map1/34.png) |
| 35.png | ![](/res/map0/35.png) | ![](/res/map1/35.png) |
| 36.png | ![](/res/map0/36.png) | ![](/res/map1/36.png) |
| 38.png | ![](/res/map0/38.png) | ![](/res/map1/38.png) |
| 39.png | ![](/res/map0/39.png) | ![](/res/map1/39.png) |
| 40.png | ![](/res/map0/40.png) | ![](/res/map1/40.png) |
| 41.png | ![](/res/map0/41.png) | ![](/res/map1/41.png) |
| 42.png | ![](/res/map0/42.png) | ![](/res/map1/42.png) |
| 43.png | ![](/res/map0/43.png) | ![](/res/map1/43.png) |
| 44.png | ![](/res/map0/44.png) | ![](/res/map1/44.png) |
| 45.png | ![](/res/map0/45.png) | ![](/res/map1/45.png) |
| 46.png | ![](/res/map0/46.png) | ![](/res/map1/46.png) |
| 47.png | ![](/res/map0/47.png) | ![](/res/map1/47.png) |
| 48.png | ![](/res/map0/48.png) | ![](/res/map1/48.png) |
| 49.png | ![](/res/map0/49.png) | ![](/res/map1/49.png) |
| 50.png | ![](/res/map0/50.png) | ![](/res/map1/50.png) |
| 51.png | ![](/res/map0/51.png) | ![](/res/map1/51.png) |
| 52.png | ![](/res/map0/52.png) | ![](/res/map1/52.png) |
| 53.png | ![](/res/map0/53.png) | ![](/res/map1/53.png) |
| 54.png | ![](/res/map0/54.png) | ![](/res/map1/54.png) |
| 55.png | ![](/res/map0/55.png) | ![](/res/map1/55.png) |
| 56.png | ![](/res/map0/56.png) | ![](/res/map1/56.png) |
| 57.png | ![](/res/map0/57.png) | ![](/res/map1/57.png) |
| 58.png | ![](/res/map0/58.png) |