马士兵坦克大战学习笔记(一)
java初學者對于馬士兵坦克大戰的個人學習筆記及代碼問題總結(第一階段),
1、系統自動初始化了Graphics g參數
2、設計原則:高內聚,低耦合;
一個模塊中的各元素之間的緊密程度越高,內聚性越高;
每個模塊之間相互聯系的緊密程度越低,耦合性越低。
對修改關閉,對擴展開放;
3、局部內部類:可以用,但是看起來不方便,內部類可以非常方便的訪問包裝類的局部變量
4、添加鍵盤監聽時,如果使用implements KeyListener,則需要重寫這個不需要的方法:
@Override
public void keyTyped(KeyEvent e) {
}
5、面向對象設計思想:
抽象出名詞:類,屬性
抽象出動詞:方法
6、相對于int類型,用enum代表方向便于檢查代碼,編譯期間就能知道錯誤,代碼不易被修改
7、碰撞檢測如何處理:
rectangle得到坦克和子彈的矩形,使用rect.intersects(tank.rect)判斷兩個矩形是否相交
8、坦克移動時一頓一頓的?
原因:把move方法放在了鍵盤監聽的press方法和release方法里了,應該放在paint方法里
9、方塊移動太快?
原因:paint方法的延時使用了以下方法(50微秒),使用MILLISECONDS(毫秒級)或者Thread.sleep正常
while(true){
try {
TimeUnit.MICROSECONDS.sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
tf.repaint(); //repaint方法調用update方法,update方法調用paint方法
}
10、圖像、聲音資源只在程序打開時load一次,使用時調用即可
11、消除閃爍現象,先把圖像數據加載到顯存里的虛擬窗口,加載完成后再顯示到窗口
12、NullPointerException 變量未初始化的異常
13、一個對象持有另一個對象的引用,把參數和方法傳遞給另一個對象
14、畫不出敵方坦克?
原因是:if (this.group == Group.BAD) 的判斷放在 if (this.group == Group.GOOD)的語句里了
15、簡單處理,把碰撞檢測看作判斷坦克和子彈兩個方塊是否相撞,其他不規則物體判斷相撞一般有封裝的類庫。可以直接引用
16、代碼的重構:在不改變系統功能的前提下改善程序的結構,提高代碼的質量
17、坦克可以出界?原因是用了以下程序
if (x>TankFrame.GAME_X+TankFrame.GAME_WIDTH-TANK_WIDTH-2){
x=TankFrame.GAME_X+TankFrame.GAME_WIDTH-TANK_WIDTH-2;
}
正確為:
if (x<0 || y<30 || x>TankFrame.GAME_WIDTH-TANK_WIDTH || y>TankFrame.GAME_HEIGHT-TANK_HEIGHT)
this.back();
}
18、坦克死了之后沒有重畫,但是可以發射子彈?
for (int i=0;i<tanks.size();i++) {
for (int j = 0; j < bullets.size(); j++) {
bullets.get(j).collidesWithTank(tanks.get(i));
}
}
此處for外循環的大括號沒加,且子彈碰撞時的坐標寫成了以下錯誤this.x應為this.y
int bY=this.x+TANK_HEIGHT/2-Bullet.BULLET_HEIGHT/2;
19、打死一個坦克后,再打另一個坦克出現錯誤
IllegalThreadStateException 非法的線程狀態異常
原因是在TankFrame里Thread tr=new Thread(()->new Audio(“audio/explode.wav”).play());
然后在explode構造方法里調用tr.start方法,應該直接在構造方法里寫new Thread(()->new Audio(“audio/explode.wav”).play()).start();
同一個線程不能多次執行start()方法
20、Class類:在硬盤上的class文件,虛擬機要用該文件時,會load進內存,便成為了Class類的對象
總結
以上是生活随笔為你收集整理的马士兵坦克大战学习笔记(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 接口测试系列之 —— 前端交互测试和后端
- 下一篇: android 自定义输入法布局,And