java魔塔_2018-2019学年第一学期Java课设--魔塔

Magic-Towers

一、团队名称、团队成员介绍、任务分配

团队名称:MoTa

团队成员介绍

网络1713柳聪灵【组长】 201721123065

网络1712李梦冰 201721123040

网络1713兰景晖 201721123064

任务分配

网络1713柳聪灵【组长】--Model

游戏布局及障碍物的编码及方法定义

游戏里的道具:钥匙、药水的编码及方法定义

游戏npc的编码及方法定义

画UML类图

网络1713兰景晖 --View

游戏道具及场景的视图

GUI界面设计:主界面、各类弹窗

网络1712李梦冰 --Controller

玩家数据I/O流

游戏内部监听器:存档、选角色、退出

游戏地图数据

编写团队博客

二、项目简介

《魔塔》是一种策略类的固定数值RPG游戏。游戏需要动很多脑筋,任何一个轻率的选择都可能导致游戏的失败。魔塔游戏虽不大,但是制作精美,道具很多,而且难度不低,对智商是一次艰巨的考验。虽然魔塔的界面很像是一般的地牢游戏,貌似随便的打打杀杀就可以过关,但事实上玩这个游戏需要动很多脑筋,任何一个轻率的选择都可能导致游戏的失败,该游戏有属性攻击、防御、生命、金币、经验。

三、项目采用技术

文件I/O流

多线程

GUI

四、项目亮点

主界面显示主要信息功能

cd26c9d26dd4c8eafd367706a571efaa.png

游戏动画

攻击者自由移动并有向不同方向移动的动作

a166e3b38c429571207f9563f0efd134.gif

攻击者生命力减少及怪物消失

97e1cfff93915e2942142ad3849b61fb.gif

各个怪物有规律跳动

788d0baecbaffe609b933ff534f2bd03.gif

417d90f1de1299fdee279ce59a78f347.gif

067473c887c5dfd58bd8811c4ab16448.gif

开门成功后门碎裂

0f6a85532781186ec8136147b8d46461.gif

全家福

1f593b9feb763fbf86201361fed6311a.gif

五、项目关键代码

数据I/O流功能

/*

游戏过程中,玩家由于各种原因需要退出终止游戏,但是还想下次继续游戏。所以设计了游戏进度的保存/读取的功能。使用了FileOutputStream、BufferedOutputStream、 ObjectOutputStream结合使用。

*/

public class PlayerFile {

public static final void savePlayer(Player player) {//保存玩家数据

//try-with-resource

try ( FileOutputStream out = new FileOutputStream("player.dat");

BufferedOutputStream bout = new BufferedOutputStream(out);

ObjectOutputStream obout = new ObjectOutputStream(bout);) {

obout.writeObject(player);

} catch (IOException e) {

}

}

public static final Player readPlayer() {//读取玩家数据

Player player = null;

try (FileInputStream in = new FileInputStream("player.dat");

BufferedInputStream bin = new BufferedInputStream(in);

ObjectInputStream obin = new ObjectInputStream(bin);) {

player = (Player) obin.readObject();

} catch (IOException e) {

} catch (ClassNotFoundException e) {

}

return player;

}

}

游戏动作监听器功能(部分)

/**

* 人物碰触格子

*/

private void contact(int x, int y) {

// 坐标对应第y行第x列

if (mapData[y][x].contact(player)) {

// 可以通过时

Component component = mapView.getComponent(x + y * 11);

// 获取该位置组件并判断是否为门

if (mapData[y][x] instanceof Door) {

mapData[y][x] = Floor.FLOOR;

inofView.update();

mainView.setVisible(true);

((DoorView) component).show();

return;

}

mapView.remove(playerView);

mapView.add(new FloorView(), player.getX() + player.getY() * 11);

mapView.remove(x + y * 11);

mapView.add(playerView, x + y * 11);

player.setCoord(x, y);

// 通过后显示提示

showInof(x, y);

if (mapData[y][x].getType() != Stairs.STAIRS_TYPE_DOWN_BIRTH

&& mapData[y][x].getType() != Stairs.STAIRS_TYPE_UP_BIRTH) {

mapData[y][x] = Floor.FLOOR;

player.getMapDataList().get(player.getNowFloor() - 1)[y][x] = 0;

}

} else {//不能通过

noEntryInof(x, y);

}

}

门及怪物的动画消失代码

b0234840f5d56a6791591827bda6ab4d.png

5bb002561212f460670b884b58f86d45.png

ff17a6fc302c321ace9bff091de24c7d.png

a5e5a296e6722b46bab39392dca62fe5.png

六、项目git地址及个人博客地址

七、项目git提交记录截图(要体现出每个人的提交记录、提交说明)

04eac7575c423c4f1cd9532a2a1a0b27.png

b2dbb09fe18657d666d3e82c66c1022d.png

八、项目Issue记录截图

a7fefc1903b683395892fcf7cb945e07.png

九、项目功能架构图与主要功能流程图

b89338a0c0363b7f1fc869d17daf43f6.png

22509ea17e6dda98e3583db321a6a93f.png

十、UML类图

2bc37d6918186677d4e9774e7601c1d3.png

f52e50c50702604e182e4efe0dc95c85.png

a5690fdc278ac056f03c74cfb588a66a.png

十一、代码静态扫描

第一次扫描

a9b44152cfa6aab024a0c9364f572fd4.png

全部解决

408ff356730870912cb90f77e596182c.png

十二、尚待改进或者新的想法

本次课设我们组最大的遗憾是没有把网络和数据库的技术运用到,这一点尚待改进。

我们还有将地图规划到50层的想法。

十三、参考文献:

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值