一.團隊總體概述
團隊成員 | 任務分工 |
臧麒越(組長) 201821123025 |
GUI設計,界面編程,博客撰寫 (tuixiangzi.view包,tuixiangzi.util包) |
韓佳欣 201821123024 |
運算邏輯功能、悔一步功能、重新開始功能實現,bgm和計時添加 (tuixiangzi.model包) |
林貴龍 201821123012 |
地圖參數設置,繪圖,素材收集 (tuixiangzi.model.goods包,tuixiangzi.model.map包) |
二. 項目git地址:this this !!!
三. 項目git提交記錄
四. 前期調查
我們在4399上尋找推箱子小游戲,發現大致功能如下
所以我們所要實現的基本功能為:
1.實現鍵盤操作功能,上下左右鍵
2.游戲是否通關判斷功能
3.支持選關功能,可以選擇1~50關
4.添加游戲背景音樂
5.支持“悔棋”功能,即返回上一步,以及重新開始功能
五.
1.項目功能架構圖
2.主要功能流程圖
六. UML類圖
七. 運行截圖
主界面:
通關達成:
總體運行效果:
八. 關鍵代碼
悔一步代碼:
public void previousMove() { if(moveStack.isEmpty()){ return; } GameMove previous=moveStack.pollLast(); if(previous!=null) { boy.reset(previous.boyX,previous.boyY,previous.boyDirection); if(previous.moveBox!=null) { Box b=previous.moveBox; b.moveTo(previous.boxX, previous.boxY); GameMapCell homeCell=map.get(b.x, b.y); if(homeCell.type==GameMapCell.TYPE_HOME) { b.setWin(); } } }else { this.setLevel(this.level); } }
人物及箱子移動代碼(以向左移動為例)
private void handleLeft() { int bx = boy.x, by = boy.y; // 獲取boy前面類型 GameMapCell cell = map.get(bx-1, by); if (cell == null) { return; } switch (cell.type) { case GameMapCell.TYPE_BLOCK: // 障礙物,不能移動 return; case GameMapCell.TYPE_GRASS: case GameMapCell.TYPE_HOME: // 草地和目標位置上是否有箱子 Box box = getBoxAt(cell.x, cell.y); if (box == null) { // 沒有,則boy移動 boy.moveLeft(); moveStack.add(GameMove.of(boy)); } else { // 有,判斷盒子前面有什么 if (canBoxMoveIn(box.x-1, box.y)) { box.moveLeft(); boy.moveLeft(); moveStack.add(GameMove.of(boy,box)); } } break; } }
九. 掃描結果及改正
掃描結果:
改正結果:
十. 總結
不足:
悔一步功能只能夠返回未到達目標的箱子,如若箱子已變成“win”狀態,則圖標不會變成“normal”態,但不影響游戲進行:
界面編程僅用eclipse實現,界面些許簡陋
展望:
嘗試推箱子暴力破解
嘗試NetBeans或JavaFx編程界面