Java坦克大戰(zhàn)部分:畫(huà)出界面,敵人坦克,我的坦克,不出界,鍵盤(pán)事件【詩(shī)書(shū)畫(huà)唱】
本文含很多自己寫(xiě)的個(gè)人理解和注釋?zhuān)氤龅慕鉀Q方法,建議內(nèi)容,提示內(nèi)容,注意事項(xiàng)。


package tankeGame;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.*;
import java.util.*;
//這個(gè)來(lái)做繪制內(nèi)容,發(fā)射子彈一類(lèi)的操作
//讓這個(gè)類(lèi)實(shí)現(xiàn)鍵盤(pán)點(diǎn)擊的接口
public class caoZuoPaintFangFaDiaoYong extends?
JPanel implements KeyListener {
//在構(gòu)造法方法里實(shí)例化我方坦克
// arraylist:存儲(chǔ)任意類(lèi)型,內(nèi)容長(zhǎng)度任意,有下標(biāo)
Vector<diRentanke> diRentankeJiHe=new Vector<diRentanke>();
mytankeYiDongFangFa mytankeYiDongFangFa=null;
public caoZuoPaintFangFaDiaoYong(){
// 個(gè)人理解:mytankeYiDongFangFa類(lèi)的這個(gè)構(gòu)造方法
// mytankeYiDongFangFa(int x, int y,?
// int fangxiang)中用了super(x, y, fangxiang);(因?yàn)樽宇?lèi)
// 繼承了父類(lèi)的mytankeYiDongFangFa(int x, int y,?
// int fangxiang)方法,所以子類(lèi)中用
// super(x, y, fangxiang)代替
// 父類(lèi)中這個(gè)構(gòu)造方法中的具體方法內(nèi)容
// ,就可以這里用了。
mytankeYiDongFangFa=new mytankeYiDongFangFa(150,440,0);
for(int i=0;i<5;i++){
// diRentanke類(lèi)中也有public diRentanke(int x, int y, int fangXiang)?
// 用來(lái)傳值的方法
// Random Random=new Random();
// int num=10+Random.nextInt (100);
// ,那么10<=num<10+100
diRentanke diRentanke=new diRentanke(100*i+90, 0, 2);
// 因?yàn)閿橙颂箍吮旧碛袑捀咚栽?100*i上要+90來(lái)調(diào)整
// x軸方向位置,不然就會(huì)第一量有部分看不見(jiàn),超出范圍。
diRentankeJiHe.add(diRentanke);
}
}
//繪制的方法
int fangXiang2=0;
//個(gè)人理解: “fangXiang2”為 “l(fā)eiXing”
// ,其實(shí)也可以統(tǒng)一把int類(lèi)型改成String的類(lèi)型,
// 然后再在swich判斷中傳入"left"之類(lèi)的,這樣代碼更明確
// ,容易懂等。放在paint方法前是為了,使用鍵盤(pán)事件后,
// fangXiang2改變,進(jìn)而用repaint來(lái)重新執(zhí)行一遍paint方法中內(nèi)容時(shí)
// huiZhitanke(g,mytankeYiDongFangFa.x,
// mytankeYiDongFangFa.y,0,fangXiang2)
// 中fangXiang2會(huì)改變,進(jìn)而用huiZhitanke方法,
// 在頁(yè)面顯示對(duì)應(yīng)方向的坦克圖形
// 來(lái)實(shí)現(xiàn)
// “坦克方向會(huì)變”的效果。這里的坦克是自己繪制的,
// 如果用圖片
// ,就是換加載的對(duì)應(yīng)方向的坦克圖片,
// huiZhitanke方法中的內(nèi)容進(jìn)行改變即可。
public void paint(Graphics g){
g.setColor(Color.black);
g.fillRect(0,0,600,600);
g.setColor(Color.green);
//開(kāi)始默認(rèn)用huiZhitanke方法在界面繪制向上的坦克:
huiZhitanke(g,mytankeYiDongFangFa.x,
mytankeYiDongFangFa.y,0,fangXiang2);
//遍歷剛才存入的5個(gè)敵方坦克
for(int i=0;i<diRentankeJiHe.size();i++){
diRentanke diRentanke=diRentankeJiHe.get(i);
huiZhitanke(g,diRentanke.x,diRentanke.y,
1,diRentanke.fangxiang);
}
}
//封裝坦克的方法:
// 1.畫(huà)筆? ?2.x? 3.y? 4.坦克的類(lèi)型? 5.坦克的方向
public void huiZhitanke(Graphics g,int x,int y,
int leiXing,int fangXiang){
//在這個(gè)方法里既可以繪制我方坦克,也可以繪制
//敵方tank,tank的類(lèi)型就是判斷是繪制什么顏色的坦克
switch(leiXing){
case 0:
//畫(huà)我方坦克:
g.setColor(Color.green);break;
case 1:
g.setColor(Color.yellow);break;
}
switch(fangXiang){
// 根據(jù)fangXiang值(的不同),
// 畫(huà)出對(duì)應(yīng)的fangXiang值(的不同方向)的坦克
case 0://向上坦克圖形:
g.fillRect(x, y, 10,30);
g.fillRect(x+10, y-10, 10,30);
g.fillRect(x+20, y, 10,30);
break;
case 1://向右坦克圖形:
g.fillRect(x, y, 30,10);
g.fillRect(x+10, y+10, 30,10);
g.fillRect(x, y+20, 30,10);
break;
case 2://向下坦克圖形:
g.fillRect(x, y, 10,30);
g.fillRect(x-10, y+10, 10,30);
g.fillRect(x-20, y, 10,30);
break;
case 3://向左坦克圖形:
g.fillRect(x, y, 30,10);
g.fillRect(x-10, y+10, 30,10);
g.fillRect(x, y+20, 30,10);
break;
}
}
@Override
public void keyTyped(KeyEvent e) {
// TODO Auto-generated method stub
}
@Override
//鍵盤(pán)按下的事件
public void keyPressed(KeyEvent e) {
//點(diǎn)擊W鍵
if(e.getKeyCode()==KeyEvent.VK_W){
// Graphics g = null;
// huiZhitanke(g,mytankeYiDongFangFa.x,
// mytankeYiDongFangFa.y,0,0);
// switch(0);
fangXiang2=0;
mytankeYiDongFangFa.yiDongFangFa(0);
}
if(e.getKeyCode()==KeyEvent.VK_S){
// Graphics g = null;
// huiZhitanke(g,mytankeYiDongFangFa.x,
// mytankeYiDongFangFa.y,0,1);
fangXiang2=2;
mytankeYiDongFangFa.yiDongFangFa(2);
}
if(e.getKeyCode()==KeyEvent.VK_A){
fangXiang2=3;
mytankeYiDongFangFa.yiDongFangFa(3);
}
if(e.getKeyCode()==KeyEvent.VK_D){
fangXiang2=1;
mytankeYiDongFangFa.yiDongFangFa(1);
}
this.repaint();
}
@Override
public void keyReleased(KeyEvent e) {
// TODO Auto-generated method stub
}
}


package tankeGame;
public class diRentanke extends tankeFuLei{
//敵方坦克類(lèi)也是繼承坦克父類(lèi)
public diRentanke(int x, int y, int fangXiang) {
super(x, y, fangXiang);
}
}


package tankeGame;
import javax.swing.*;
public class mains extends JFrame{
public static void main(String[] args) {
new mains();
}
public? mains(){
this.setLayout(null);
this.setSize(600,600);
this.setLocationRelativeTo(null);
caoZuoPaintFangFaDiaoYong caoZuo=new caoZuoPaintFangFaDiaoYong();
caoZuo.setBounds(0,0,600,600);
this.addKeyListener(caoZuo);
this.add(caoZuo);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
}


package tankeGame;
public class mytankeYiDongFangFa extends tankeFuLei{
//我方坦克類(lèi)繼承坦克父類(lèi)
public mytankeYiDongFangFa(int x, int y, int fangXiang) {
super(x, y, fangXiang);
}
//點(diǎn)擊移動(dòng)的方法
public void yiDongFangFa(int fangxiang){
// if(x<=600&&y<=600){
switch(fangxiang){
//判斷這個(gè)方向,方向是誰(shuí)就移動(dòng)誰(shuí)
case 0:
if(y>=10){
this.y-=this.suDu;}break;
// 個(gè)人理解:
// 如果“}”把break包住,y>=10時(shí)
// ,就會(huì)執(zhí)行case 1的情況,會(huì)向右移動(dòng)
// x<=550等也類(lèi)似
// 550等數(shù)值是在頁(yè)面寬600,長(zhǎng)600或
// 最初始位置(0,0)數(shù)值上調(diào)整得來(lái)的(加或減坦克的寬或長(zhǎng)),因?yàn)?/p>
// 坦克存在寬和長(zhǎng),所以要調(diào)整數(shù)值等,別的地方也是依次類(lèi)推。
case 1:
if(x<=550){
this.x+=this.suDu;}break;
case 2:
if(y<=520){
this.y+=this.suDu;}break;
case 3:if(x>=10){
this.x-=this.suDu;}break;
}
// }
}
}


package tankeGame;
//x,y
public class tankeFuLei {//父類(lèi)
//x軸,y軸,方向,速度,生命
int x,y,fangxiang;
int suDu=15;//坦克默認(rèn)移動(dòng)的速度為15px
boolean shengMing=true;//每個(gè)坦克默認(rèn)都是存在的
public tankeFuLei(int x,int y,int fangXiang){
this.x=x;
this.y=y;
this.fangxiang=fangXiang;
}
}
?





