一、成员介绍
张一弛(组长) | GUI设计、游戏界面相关类实现、阿里巴巴扫描纠错、团队博客编写 | |
王江鸿 | Box类、Bomb类、Login类实现;道具实现 | |
陈志伟 | Player类、PlayerAttribute类、Music类实现 |
二、项目Git地址
三、Git提交截图
四、项目功能架构图、主要功能流程图
五、项目运行截图与屏幕录制
1、主界面
2.玩家登记
3.游戏主界面
4.项目运行屏幕录制
六、关键代码
1.玩家移动线程
private class moveThread1 extends Thread {
@Override
public void run() {
while (player1.isalive) {
if(stopSign)
break;
if(pause){
player1.move();
colisionDetection(player1);
if(player1.thisbomb!=null)
{
//判断玩家是否在当前炸弹上(一旦离开玩家当前放置的炸弹,便不可再次站上去)
if(player1.thisbomb.isExistPlayer)
{
player1.onTheboom();
}
}
}
}
}
}
使用while循环实现持续监听,加入判断线程结束标志,当重新开始、返回主界面时,线程能够及时停止。
2.碰撞检查(判断获得道具、前方有障碍、是否出界)
public static void colisionDetection(Player pl)
{
int x = 1120;
int y = 880;
//出地图边境
if(pl.getX()<0||pl.getX()>x||pl.getY()<0||pl.getY()>y)
{
pl.back();
return;
}
int w = 15;
int h = 12;
for(int i=0;i<w;i++) {
for(int j=0;j<h;j++)
{
try {
Box temp=thismap.getBoxbyLocation(i,j);
//碰撞检查
if(temp.getRect().intersects(pl.getRect())&&temp.isExist)
{
//遇到箱子
if(!temp.isdestroyshowT)
{
pl.back();
return;
}
//遇到宝物
else{
switch(temp.treasureIndex){
case 1:
pl.pla.plusspeed();
break;
case 2:
pl.pla.plusbombnum();
break;
case 3:
pl.pla.pluspower();
break;
case 4:
//无敌状态
pl.invincible();
break;
case 5:
pl.pla.pluslive();
break;
default:
break;
}
//设置当前方格为[不存在]
temp.isExist=false;
//将当前方格设置为隐藏
setIcon("images/default.png",temp);
}
}
//遇到炸弹
if(temp.isExistBomb&&!temp.isExistPlayer&&temp.getRect().intersects(pl.getRect()))
{
pl.back();
return;
}
} catch (NullPointerException e) {
}
}
}
}
借助Rectangle类中的intersects方法来检测2个矩形是否相交,实现碰撞检查,再通过判断玩家前往的box的类型来判断下一步操作。
3.炸弹引爆
public synchronized void explode() throws InterruptedException
// 爆炸
{
// 将box处定义炸弹的参数赋值false
box.isExistBomb = false;
box.needDetonate = false;
player.setBombexist(player.getBombexist() - 1);
// 玩家当前炸弹数-1
setIcon("images/UDLR.png", box);
// 设置炸弹中心的图片
explodePlayer(box);
// 判断是否炸到了玩家
for (int n = 1; n <= power; n++)
// 向上爆炸
{
boolean flag = true;
int x = this.x;
int y = this.y - n;
if (y >= 0) {
Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
flag = explode1(temp);
if(flag == false) {
break;
}
}
}
// 向下爆炸
for (int s = 1; s <= power; s++) {
boolean flag = true;
int x = this.x;
int y = this.y + s;
if (y < 12) {
Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
flag = explode1(temp);
if(flag == false) {
break;
}
}
}
// 向左爆炸
for (int w = 1; w <= power; w++) {
boolean flag = true;
int x = this.x - w;
int y = this.y;
if (x >= 0) {
Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
flag = explode1(temp);
if(flag == false) {
break;
}
}
}
// 向右爆炸
for (int e = 1; e <= power; e++) {
boolean flag = true;
int x = this.x + e;
int y = this.y;
if (x < 15) {
Box temp = GameFrame.thismap.getBoxbyLocation(x, y);
flag = explode1(temp);
if(flag == false) {
break;
}
}
}
}
public boolean explode1(Box temp) {
if (temp.isExist)
// 如果爆炸的路线上遇到方块了
{
if (temp.isdestroyshowT)
// 如果是宝物
{
temp.isExist = false;
return true;
// 宝物消失
} else
// 如果是障碍,则终止爆炸
{
showTreasure(temp);
// 显示该box处隐藏的宝物
return false;
}
} else if (temp.isExistBomb)
// 如果该爆炸处有炸弹
{
MyThread3 ph3 = new MyThread3(temp);
ph3.start();
continuousBomb.add(temp);
// 将该炸弹添加到被引爆的列表里
}
explodePlayer(temp);
// 判断是否炸到了玩家
bombCache.add(temp);
// 将该处添加到爆炸缓存中
setIcon("images/UD.png", temp);
// 设置该处的爆炸图片
return true;
}
根据当前玩家的威力,从当前Box分别向上下左右威力内的Box遍历,若遇到不可炸毁的障碍,则结束当前方向的遍历,否则,将遍历的Box设置爆炸。 判断是否炸到玩家——通过判断玩家是否和爆炸块重叠,不处于无敌状态,并且存活,若符合,玩家受到1点伤害。
七、阿里巴巴代码规范扫描
扫描结果:
修改:
修改了魔法值、注释、代码规范、添加作者后:
通过新建一个继承自Thread的class创建线程解决不允许显式创建线程问题
通过代码复用,创建新方法来解决单一方法过长问题
完全解决:
八、总结
本次课设功能还有许多可以拓展的地方,例如数据库存储玩家信息、通过Socket实现多人同台竞技等;
我们在游戏本身的界面和功能花了比较多的时间,以后有机会继续完善。