一、成員介紹
| 姓名 | 任務分配 | 個人博客鏈接 |
|---|---|---|
| 張一弛(組長) | GUI設計、游戲界面相關類實現、阿里巴巴掃描糾錯、團隊博客編寫 | 在做了,在做了,下次一定 |
| 王江鴻 | Box類、Bomb類、Login類實現;道具實現 | Java課程設計-泡泡堂(個人) |
| 陳志偉 | Player類、PlayerAttribute類、Music類實現 | Java課程設計-泡泡堂(個人) |
二、項目Git地址
三、Git提交截圖






四、項目功能架構圖、主要功能流程圖

五、項目運行截圖
1、主界面

2.玩家登記

3.游戲主界面

六、主要MUL類圖
Player類

Bomb類

七、關鍵代碼
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實現多人同台競技等;
我們在游戲本身的界面和功能花了比較多的時間,以后有機會繼續完善。
